diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts index 60350c188107d6e20540576669e9dc9ef3155eae..cb1c884c6101bec8de814accda529690cb92896f 100644 --- a/api/src/engine/connectors/exareme/converters.ts +++ b/api/src/engine/connectors/exareme/converters.ts @@ -1,16 +1,14 @@ import { Category } from 'src/engine/models/category.model'; +import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input'; +import { Experiment } from 'src/engine/models/experiment/experiment.model'; import { Group } from 'src/engine/models/group.model'; +import { TableResult } from 'src/engine/models/result/table-result.model'; import { Variable } from 'src/engine/models/variable.model'; -import { Hierarchy } from './interfaces/hierarchy.interface'; -import { VariableEntity } from './interfaces/variable-entity.interface'; import { Entity } from './interfaces/entity.interface'; -import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input'; +import { Hierarchy } from './interfaces/hierarchy.interface'; import { TransientDataResult } from './interfaces/transient/transient-data-result.interface'; -import { Experiment } from 'src/engine/models/experiment/experiment.model'; -import { MetaData } from 'src/engine/models/result/common/metadata.model'; -import { TableResult } from 'src/engine/models/result/table-result.model'; -import { Dictionary } from 'src/common/interfaces/utilities.interface'; -import { table } from 'console'; +import { VariableEntity } from './interfaces/variable-entity.interface'; +import { transientToTable } from './transformations'; export const dataToGroup = (data: Hierarchy): Group => { return { @@ -69,66 +67,11 @@ export const experimentInputToData = (data: ExperimentCreateInput) => { }; }; -const dictToTable = (dict: Dictionary<string[]>, rows: number): string[][] => { - const keys = Object.keys(dict); - - return keys.map((key) => { - const row = Array.from(Array(rows).keys()) - .map((i) => dict[key][i]) - .map((val) => val ?? ''); - row.unshift(key); - return row; - }); -}; - export const dataToTransient = (data: TransientDataResult): Experiment => { - const result = data.result[0]; - const tables = Object.keys(result.data.single).map((varKey): TableResult => { - const variable = result.data.single[varKey]; - const domains: MetaData[] = []; - const rows: Dictionary<string[]> = {}; - - let count = 0; - - Object.keys(variable).map((domainKey) => { - domains.push({ name: domainKey, type: 'string' }); - const data = variable[domainKey]; - - [ - [varKey, 'num_total'], - ['datapoints', 'num_datapoints'], - ['nulls', 'num_nulls'], - ].forEach((keys) => { - if (!rows[keys[0]]) rows[keys[0]] = []; - rows[keys[0]][count] = data[keys[1]]; - }); - - const properties = variable[domainKey].data; - - Object.keys(properties).forEach((propKey) => { - if (!rows[propKey]) rows[propKey] = []; - rows[propKey][count] = properties[propKey].toString(); - }); - - count++; - }); - - return { - data: dictToTable(rows, count), - metadatas: domains, - name: varKey, - groupBy: 'single', - }; - }); - - const result2 = tables.map((table) => { - const nTable = Object.assign({}, table); - nTable.groupBy = 'Model'; - return nTable; - }); + const tabs: TableResult[] = transientToTable.evaluate(data); return { title: data.name, - results: tables.concat(result2), + results: tabs, }; }; diff --git a/api/src/engine/connectors/exareme/main.connector.ts b/api/src/engine/connectors/exareme/main.connector.ts index d9a772d3d26fa469b3ee684d4061064767f1a912..75f21b56698ea59dbc65a88b4edf1ea014163e48 100644 --- a/api/src/engine/connectors/exareme/main.connector.ts +++ b/api/src/engine/connectors/exareme/main.connector.ts @@ -4,9 +4,9 @@ import { Request } from 'express'; import { firstValueFrom, map, Observable } from 'rxjs'; import { IEngineOptions, IEngineService } from 'src/engine/engine.interfaces'; import { Domain } from 'src/engine/models/domain.model'; -import { Group } from 'src/engine/models/group.model'; import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input'; import { Experiment } from 'src/engine/models/experiment/experiment.model'; +import { Group } from 'src/engine/models/group.model'; import { Variable } from 'src/engine/models/variable.model'; import { dataToCategory, @@ -30,151 +30,11 @@ export default class ExaremeService implements IEngineService { const path = this.options.baseurl + 'experiments/transient'; - const result = { - name: 'Descriptive statistics', - result: [ - { - data: { - single: { - 'Left inferior temporal gyrus': { - ppmi: { - data: { - std: 1.2048783713787277, - min: 7.6335, - mean: 11.38076218487395, - }, - num_datapoints: 714, - num_total: 714, - num_nulls: 0, - }, - edsd: { - data: { - std: 1.3274694970555183, - max: 14.593, - min: 5.4301, - mean: 10.647539816933637, - }, - num_datapoints: 437, - num_total: 474, - num_nulls: 37, - }, - 'desd-synthdata': { - data: { - std: 1.3479276642860987, - max: 14.593, - min: 5.4301, - mean: 10.685619565217392, - }, - num_datapoints: 920, - num_total: 1000, - num_nulls: 80, - }, - }, - 'Left posterior insula': { - ppmi: { - data: { - std: 0.25046887396228024, - max: 3.0882, - min: 1.7073, - mean: 2.358402521008403, - }, - num_datapoints: 714, - num_total: 714, - num_nulls: 0, - }, - edsd: { - data: { - std: 0.2716090949138581, - max: 3.1971, - min: 1.2675, - mean: 2.2726512585812357, - }, - num_datapoints: 437, - num_total: 474, - num_nulls: 37, - }, - 'desd-synthdata': { - data: { - std: 0.2619310561946756, - max: 3.1971, - min: 1.2675, - mean: 2.27014597826087, - }, - num_datapoints: 920, - num_total: 1000, - num_nulls: 80, - }, - }, - }, - model: { - ppmi: { - num_datapoints: 714, - data: { - 'Left inferior temporal gyrus': { - std: 1.2048783713787277, - max: 15.0815, - min: 7.6335, - mean: 11.38076218487395, - }, - 'Left posterior insula': { - std: 0.25046887396228024, - max: 3.0882, - min: 1.7073, - mean: 2.358402521008403, - }, - }, - num_total: 714, - num_nulls: 0, - }, - edsd: { - num_datapoints: 437, - data: { - 'Left inferior temporal gyrus': { - std: 1.3274694970555183, - max: 14.593, - min: 5.4301, - mean: 10.647539816933637, - }, - 'Left posterior insula': { - std: 0.2716090949138581, - max: 3.1971, - min: 1.2675, - mean: 2.2726512585812357, - }, - }, - num_total: 474, - num_nulls: 37, - }, - 'desd-synthdata': { - num_datapoints: 920, - data: { - 'Left inferior temporal gyrus': { - std: 1.3479276642860987, - max: 14.593, - min: 5.4301, - mean: 10.685619565217392, - }, - 'Left posterior insula': { - std: 0.2619310561946756, - max: 3.1971, - min: 1.2675, - mean: 2.27014597826087, - }, - }, - num_total: 1000, - num_nulls: 80, - }, - }, - }, - }, - ], - } as TransientDataResult; - - /*= await firstValueFrom( + const resultAPI = await firstValueFrom( this.httpService.post<TransientDataResult>(path, form), - );*/ + ); - return dataToTransient(result); + return dataToTransient(resultAPI.data); } async getDomains(ids: string[]): Promise<Domain[]> { diff --git a/api/src/engine/connectors/exareme/transformations.ts b/api/src/engine/connectors/exareme/transformations.ts new file mode 100644 index 0000000000000000000000000000000000000000..4706fa4e6f42692db75e9bce9d9dcf6e618b6c17 --- /dev/null +++ b/api/src/engine/connectors/exareme/transformations.ts @@ -0,0 +1,32 @@ +// This file contains all transformation queries for JSONata +// see : https://docs.jsonata.org/ + +import * as jsonata from 'jsonata'; // old import style needed because of 'export = jsonata' + +export const transientToTable = jsonata(` +( + $e := function($x) {( + ($x != null) ? $x : '' + )}; + + result.data.[ + $.single.*@$p#$i.{ + 'groupBy' : 'single', + 'name': $keys(%)[$i], + 'metadatas': $keys(*).{ + 'name': $, + 'type': 'string' + }, + 'data' : [ + [$keys(%)[$i], $p.*.($e(num_total))], + ['Datapoints', $p.*.($e(num_datapoints))], + ['Nulls', $p.*.($e(num_nulls))], + ['std', $p.*.data.($e(std))], + ['max', $p.*.data.($e(max))], + ['min', $p.*.data.($e(min))], + ['mean', $p.*.data.($e(mean))] + ] + } + ] +) +`);