diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts index 8a23fd5f9ff106c6cc2a0995d48eac079946cd30..61bcce8c639ff26a0d111ef1b28601c546af9da1 100644 --- a/api/src/engine/connectors/exareme/converters.ts +++ b/api/src/engine/connectors/exareme/converters.ts @@ -9,14 +9,19 @@ import { GroupResult, GroupsResult, } from 'src/engine/models/result/groups-result.model'; +import { HeatMapResult } from 'src/engine/models/result/heat-map-result.model'; +import { LineChartResult } from 'src/engine/models/result/line-chart-result.model'; import { RawResult } from 'src/engine/models/result/raw-result.model'; import { Variable } from 'src/engine/models/variable.model'; import { Entity } from './interfaces/entity.interface'; import { ExperimentData } from './interfaces/experiment/experiment.interface'; +import { ResultChartExperiment } from './interfaces/experiment/result-chart-experiment.interface'; import { ResultExperiment } from './interfaces/experiment/result-experiment.interface'; import { Hierarchy } from './interfaces/hierarchy.interface'; import { VariableEntity } from './interfaces/variable-entity.interface'; import { + dataROCToLineResult, + dataToHeatmap, descriptiveModelToTables, descriptiveSingleToTables, transformToAlgorithms, @@ -165,6 +170,8 @@ export const dataToResult = ( switch (result.type.toLowerCase()) { case 'application/json': return dataJSONtoResult(result, algo); + case 'application/vnd.highcharts+json': + return dataHighchartToResult(result as ResultChartExperiment, algo); default: return dataToRaw(result); } @@ -181,3 +188,17 @@ export const dataJSONtoResult = ( return []; } }; + +export const dataHighchartToResult = ( + result: ResultChartExperiment, + algo: string, +): Array<typeof ResultUnion> => { + switch (result.data.chart.type) { + case 'heatmap': + return [dataToHeatmap.evaluate(result) as HeatMapResult]; + case 'area': + return [dataROCToLineResult.evaluate(result) as LineChartResult]; + default: + return dataToRaw(result); + } +}; diff --git a/api/src/engine/connectors/exareme/interfaces/experiment/result-chart-experiment.interface.ts b/api/src/engine/connectors/exareme/interfaces/experiment/result-chart-experiment.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef0ba339600d418e2ed02a484dfebcfc5ab8b32b --- /dev/null +++ b/api/src/engine/connectors/exareme/interfaces/experiment/result-chart-experiment.interface.ts @@ -0,0 +1,9 @@ +export interface ResultChartExperiment { + data: { + chart: { + type: string; + }; + series: unknown; + }; + type: string; +} diff --git a/api/src/engine/connectors/exareme/transformations.ts b/api/src/engine/connectors/exareme/transformations.ts index 55bb054c8cdda588fd6eccfeb08f1700e6e801e4..528ecf498c145440ffcb1dba38288d9536c2a7dd 100644 --- a/api/src/engine/connectors/exareme/transformations.ts +++ b/api/src/engine/connectors/exareme/transformations.ts @@ -140,3 +140,57 @@ export const descriptiveSingleToTables = jsonata(` ] ) `); + +export const dataROCToLineResult = jsonata(` +({ + "name": data.title.text, + "xAxis": { + "label": data.xAxis.title.text + }, + "yAxis": { + "label": data.yAxis.title.text + }, + "lines": [ + { + "label": "ROC curve", + "x": data.series.data.$[0], + "y": data.series.data.$[1], + "type": 0 + } + ] +}) +`); + +export const dataToHeatmap = jsonata(` +( + { + "name": data.title.text, + "xAxis": { + "categories": data.xAxis.categories, + "label": data.xAxis.label + }, + "yAxis": { + "categories": data.yAxis.categories, + "label": data.yAxis.label + }, + "matrix": $toMat(data.series.data) + } +) +`); + +dataToHeatmap.registerFunction( + 'toMat', + (a) => { + const matrix = []; + + a.forEach( + (elem: { y: number | number; x: number | number; value: number }) => { + matrix[elem.y] = matrix[elem.y] ?? []; + matrix[elem.y][elem.x] = elem.value; + }, + ); + + return matrix; + }, + '<a<o>:a<a<n>>', +); diff --git a/api/src/engine/models/result/common/result-union.model.ts b/api/src/engine/models/result/common/result-union.model.ts index 2f56bb4d1f6ef577e9e836972f45dd59ede7fc28..bc4bb4a1472ea131fd8696da73d5c3d227c44a8f 100644 --- a/api/src/engine/models/result/common/result-union.model.ts +++ b/api/src/engine/models/result/common/result-union.model.ts @@ -19,10 +19,6 @@ export const ResultUnion = createUnionType({ return TableResult; } - if (value.rawdata) { - return RawResult; - } - if (value.groups) { return GroupsResult; } @@ -31,10 +27,10 @@ export const ResultUnion = createUnionType({ return HeatMapResult; } - if (value.x) { + if (value.lines) { return LineChartResult; } - return null; + return RawResult; }, }); diff --git a/api/src/engine/models/result/raw-result.model.ts b/api/src/engine/models/result/raw-result.model.ts index 853362293bbfe6da230e487f8ea139ba36a16f3b..01528a5fd6dcbffe09d646bf7356ef87f18c200b 100644 --- a/api/src/engine/models/result/raw-result.model.ts +++ b/api/src/engine/models/result/raw-result.model.ts @@ -7,6 +7,6 @@ import { Result } from './common/result.model'; @ObjectType() export class RawResult extends Result { - @Field(() => GraphQLJSON) - rawdata: unknown; + @Field(() => GraphQLJSON, { nullable: true, defaultValue: '' }) + rawdata?: unknown; } diff --git a/api/src/schema.gql b/api/src/schema.gql index d78641fc9b4b7a42638017b86d512fa5c2bd78ff..58bd4703b57987ad9bf65db35a7a1784c7d0cfec 100644 --- a/api/src/schema.gql +++ b/api/src/schema.gql @@ -72,7 +72,7 @@ type TableResult { } type RawResult { - rawdata: JSON! + rawdata: JSON } """