diff --git a/api/src/engine/connectors/exareme/transformations.ts b/api/src/engine/connectors/exareme/transformations.ts index 554bfda10c5e733cb7f533e1cda87ba461e605e8..7e9af19bbcb7bc2a7a00584954b92892c9c8873e 100644 --- a/api/src/engine/connectors/exareme/transformations.ts +++ b/api/src/engine/connectors/exareme/transformations.ts @@ -1,42 +1,45 @@ // 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' +import * as jsonata from 'jsonata'; // old import style needed due to 'export = jsonata' export const transientToTable = jsonata(` ( - $e := function($x) {($x != null) ? $x : ''}; + $e := function($x, $r) {($x != null) ? $x : ($r ? $r : '')}; - $fn := function($o, $prefix) { - $each($o, function($v, $k) {( - $name := $join([$prefix,$k], '/'); - $type($v) = 'object' ? $fn($v, $name): { - $name: $v - } - )}) ~> $merge() - }; + $fn := function($o, $prefix) { + $type($o) = 'object' ? + $each($o, function($v, $k) {( + $type($v) = 'object' ? { $k: $v.count & ' (' & $v.percentage & '%)' } : { + $k: $v + } + )}) ~> $merge() + : {} + }; - result.data.[ - $.single.*@$p#$i.{ - 'groupBy' : 'single', - 'name': $keys(%)[$i], - 'metadatas': $append("", $keys(*)).{ - 'name': $, - 'type': 'string' - }, - 'data' : [ - [$keys(%)[$i], $p.*.($e(num_total))], - ['Datapoints', $p.*.($e(num_datapoints))], - ['Nulls', $p.*.($e(num_nulls))], - $p.*.data.($fn($)) ~> $reduce(function($a, $b) { - $each($a, function($v, $k) {( - { - $k : [$v, $e($lookup($b,$k))] - } - )}) ~> $merge() - }) ~> $each(function($v, $k) {$append($k,$v)}) - ] - } - ] + result.data.[ + $.single.*@$p#$i.( + $ks := $keys($p.*.data[$type($) = 'object']); + { + 'groupBy' : 'single', + 'name': $keys(%)[$i], + 'headers': $append("", $keys(*)).{ + 'name': $, + 'type': 'string' + }, + 'data' : [ + [$keys(%)[$i], $p.*.($e(num_total))], + ['Datapoints', $p.*.($e(num_datapoints))], + ['Nulls', $p.*.($e(num_nulls))], + $p.*.data.($fn($)) ~> $reduce(function($a, $b) { + $map($ks, function($k) {( + { + $k : [$e($lookup($a,$k), "No data"), $e($lookup($b,$k), "No data")] + } + )}) ~> $merge() + }) ~> $each(function($v, $k) {$append($k,$v)}) + ] + }) + ] ) `); diff --git a/api/src/engine/models/experiment/experiment.model.ts b/api/src/engine/models/experiment/experiment.model.ts index bf0881247afdf3b13f8e9e29e9a3653b1cb2d69d..4e7abaeb1ef440bd449b548069e2187a14057000 100644 --- a/api/src/engine/models/experiment/experiment.model.ts +++ b/api/src/engine/models/experiment/experiment.model.ts @@ -11,7 +11,7 @@ export const ResultUnion = createUnionType({ name: 'ResultUnion', types: () => [TableResult, DummyResult], resolveType(value) { - if (value.metadatas) { + if (value.headers) { return TableResult; } if (value.listMax) { diff --git a/api/src/engine/models/result/common/metadata.model.ts b/api/src/engine/models/result/common/header.model.ts similarity index 83% rename from api/src/engine/models/result/common/metadata.model.ts rename to api/src/engine/models/result/common/header.model.ts index 9cbeaf8b5967d42f6a01a8e4f5a55b262c305f4a..27844983c4724df06cd8d8d79caf83ae4e00a6de 100644 --- a/api/src/engine/models/result/common/metadata.model.ts +++ b/api/src/engine/models/result/common/header.model.ts @@ -1,7 +1,7 @@ import { Field, ObjectType } from '@nestjs/graphql'; @ObjectType() -export class Metadata { +export class Header { @Field() name: string; diff --git a/api/src/engine/models/result/table-result.model.ts b/api/src/engine/models/result/table-result.model.ts index 1ebb6a1726aa51c7eeb3e566fbbdc09170bed95b..002d59c5b15ce974e56bc9a9b0d9272212961c31 100644 --- a/api/src/engine/models/result/table-result.model.ts +++ b/api/src/engine/models/result/table-result.model.ts @@ -1,5 +1,5 @@ import { Field, ObjectType } from '@nestjs/graphql'; -import { Metadata } from './common/metadata.model'; +import { Header } from './common/header.model'; import { Result } from './common/result.model'; @ObjectType() @@ -10,6 +10,6 @@ export class TableResult extends Result { @Field(() => [[String]]) data: string[][]; - @Field(() => [Metadata]) - metadatas: Metadata[]; + @Field(() => [Header]) + headers: Header[]; } diff --git a/api/src/schema.gql b/api/src/schema.gql index a06bcf8e66d027c1c899668254b1459bc797c2ee..c2ebe062948d88d817911b41942288f96c926b25 100644 --- a/api/src/schema.gql +++ b/api/src/schema.gql @@ -34,7 +34,7 @@ type Domain { rootGroup: Group! } -type Metadata { +type Header { name: String! type: String! } @@ -59,7 +59,7 @@ type TableResult { groupBy: String name: String! data: [[String!]!]! - metadatas: [Metadata!]! + headers: [Header!]! } type DummyResult {