From 8e2f9a3d871d6ad6ebe26eac6cf746813b53b9ac Mon Sep 17 00:00:00 2001
From: Steve Reis <stevereis93@gmail.com>
Date: Sun, 3 Oct 2021 20:33:32 +0200
Subject: [PATCH] WIP : expriment mutation Renamed DummyResult with RawResult
 Added GraphQL type json Added mechanism to convert result based on type data
 (need adaptations)

---
 api/package-lock.json                         | 15 +++++++++
 api/package.json                              |  1 +
 .../engine/connectors/exareme/converters.ts   | 31 +++++++++++++++++--
 .../Experiment/experiment.interface.ts        |  6 ++++
 .../Experiment/result-experiment.interface.ts |  4 +++
 .../connectors/exareme/transformations.ts     |  5 +++
 .../models/experiment/experiment.model.ts     |  6 ++--
 .../models/result/dummy-result.model.ts       | 14 ---------
 .../engine/models/result/raw-result.model.ts  | 12 +++++++
 api/src/schema.gql                            | 12 ++++---
 10 files changed, 83 insertions(+), 23 deletions(-)
 create mode 100644 api/src/engine/connectors/exareme/interfaces/Experiment/experiment.interface.ts
 create mode 100644 api/src/engine/connectors/exareme/interfaces/Experiment/result-experiment.interface.ts
 delete mode 100644 api/src/engine/models/result/dummy-result.model.ts
 create mode 100644 api/src/engine/models/result/raw-result.model.ts

diff --git a/api/package-lock.json b/api/package-lock.json
index 6f50c98..8818285 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -19,6 +19,7 @@
         "apollo-server-express": "^3.3.0",
         "axios": "^0.21.1",
         "graphql": "^15.5.3",
+        "graphql-type-json": "^0.3.2",
         "jsonata": "^1.8.5",
         "reflect-metadata": "^0.1.13",
         "rimraf": "^3.0.2",
@@ -5582,6 +5583,14 @@
         "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
       }
     },
+    "node_modules/graphql-type-json": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz",
+      "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==",
+      "peerDependencies": {
+        "graphql": ">=0.8.0"
+      }
+    },
     "node_modules/graphql-ws": {
       "version": "5.4.0",
       "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.4.0.tgz",
@@ -14888,6 +14897,12 @@
         "tslib": "^2.1.0"
       }
     },
+    "graphql-type-json": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz",
+      "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==",
+      "requires": {}
+    },
     "graphql-ws": {
       "version": "5.4.0",
       "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.4.0.tgz",
diff --git a/api/package.json b/api/package.json
index fd94af7..1885442 100644
--- a/api/package.json
+++ b/api/package.json
@@ -32,6 +32,7 @@
     "apollo-server-express": "^3.3.0",
     "axios": "^0.21.1",
     "graphql": "^15.5.3",
+    "graphql-type-json": "^0.3.2",
     "jsonata": "^1.8.5",
     "reflect-metadata": "^0.1.13",
     "rimraf": "^3.0.2",
diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts
index c5ecdfc..d19f179 100644
--- a/api/src/engine/connectors/exareme/converters.ts
+++ b/api/src/engine/connectors/exareme/converters.ts
@@ -1,5 +1,8 @@
 import { Category } from 'src/engine/models/category.model';
-import { Experiment } from 'src/engine/models/experiment/experiment.model';
+import {
+  Experiment,
+  ResultUnion,
+} from 'src/engine/models/experiment/experiment.model';
 import { AlgorithmParameter } from 'src/engine/models/experiment/algorithm-parameter.model';
 import { ExperimentCreateInput } from 'src/engine/models/experiment/input/experiment-create.input';
 import { Group } from 'src/engine/models/group.model';
@@ -7,9 +10,12 @@ import { TableResult } from 'src/engine/models/result/table-result.model';
 import { Variable } from 'src/engine/models/variable.model';
 import { Entity } from './interfaces/entity.interface';
 import { Hierarchy } from './interfaces/hierarchy.interface';
-import { TransientDataResult } from './interfaces/transient/transient-data-result.interface';
 import { VariableEntity } from './interfaces/variable-entity.interface';
 import { transientToTable } from './transformations';
+import { ExperimentData } from './interfaces/Experiment/experiment.interface';
+import { ResultExperiment } from './interfaces/Experiment/result-experiment.interface';
+import { RawResult } from 'src/engine/models/result/raw-result.model';
+import { TransientDataResult } from './interfaces/transient/transient-data-result.interface';
 
 export const dataToGroup = (data: Hierarchy): Group => {
   return {
@@ -86,3 +92,24 @@ export const dataToTransient = (
     results: tabs,
   };
 };
+
+export const dataToExperiment = (data: ExperimentData): Experiment => {
+  const exp: Experiment = dataToExperiment(data);
+
+  exp.results = data.result.map((result) => dataToResult(result));
+
+  return exp;
+};
+
+export const dataToRaw = (result: ResultExperiment): RawResult => {
+  return {
+    data: result.data,
+  };
+};
+
+export const dataToResult = (result: ResultExperiment): typeof ResultUnion => {
+  switch (result.type) {
+    default:
+      return dataToRaw(result);
+  }
+};
diff --git a/api/src/engine/connectors/exareme/interfaces/Experiment/experiment.interface.ts b/api/src/engine/connectors/exareme/interfaces/Experiment/experiment.interface.ts
new file mode 100644
index 0000000..b9203f8
--- /dev/null
+++ b/api/src/engine/connectors/exareme/interfaces/Experiment/experiment.interface.ts
@@ -0,0 +1,6 @@
+import { ResultExperiment } from './result-experiment.interface';
+
+export interface ExperimentData {
+  name: string;
+  result: ResultExperiment[];
+}
diff --git a/api/src/engine/connectors/exareme/interfaces/Experiment/result-experiment.interface.ts b/api/src/engine/connectors/exareme/interfaces/Experiment/result-experiment.interface.ts
new file mode 100644
index 0000000..e655151
--- /dev/null
+++ b/api/src/engine/connectors/exareme/interfaces/Experiment/result-experiment.interface.ts
@@ -0,0 +1,4 @@
+export interface ResultExperiment {
+  data: unknown;
+  type: string;
+}
diff --git a/api/src/engine/connectors/exareme/transformations.ts b/api/src/engine/connectors/exareme/transformations.ts
index 7e9af19..cbf9017 100644
--- a/api/src/engine/connectors/exareme/transformations.ts
+++ b/api/src/engine/connectors/exareme/transformations.ts
@@ -3,6 +3,11 @@
 
 import * as jsonata from 'jsonata'; // old import style needed due to 'export = jsonata'
 
+export const dataToExperiment = jsonata(`(
+    $
+)
+`);
+
 export const transientToTable = jsonata(`
 ( 
     $e := function($x, $r) {($x != null) ? $x : ($r ? $r : '')};
diff --git a/api/src/engine/models/experiment/experiment.model.ts b/api/src/engine/models/experiment/experiment.model.ts
index d11abde..91ee6c4 100644
--- a/api/src/engine/models/experiment/experiment.model.ts
+++ b/api/src/engine/models/experiment/experiment.model.ts
@@ -4,19 +4,19 @@ import {
   GraphQLISODateTime,
   ObjectType,
 } from '@nestjs/graphql';
-import { DummyResult } from '../result/dummy-result.model';
+import { RawResult } from '../result/raw-result.model';
 import { TableResult } from '../result/table-result.model';
 import { Algorithm } from './algorithm.model';
 
 export const ResultUnion = createUnionType({
   name: 'ResultUnion',
-  types: () => [TableResult, DummyResult],
+  types: () => [TableResult, RawResult],
   resolveType(value) {
     if (value.headers) {
       return TableResult;
     }
     if (value.listMax) {
-      return DummyResult;
+      return RawResult;
     }
 
     return null;
diff --git a/api/src/engine/models/result/dummy-result.model.ts b/api/src/engine/models/result/dummy-result.model.ts
deleted file mode 100644
index 99e36f5..0000000
--- a/api/src/engine/models/result/dummy-result.model.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Field, ObjectType } from '@nestjs/graphql';
-import { Result } from './common/result.model';
-
-@ObjectType()
-export class DummyResult extends Result {
-  @Field()
-  name: string;
-
-  @Field(() => [[String]])
-  data: string[][];
-
-  @Field(() => [String])
-  listMax: string[];
-}
diff --git a/api/src/engine/models/result/raw-result.model.ts b/api/src/engine/models/result/raw-result.model.ts
new file mode 100644
index 0000000..5074e01
--- /dev/null
+++ b/api/src/engine/models/result/raw-result.model.ts
@@ -0,0 +1,12 @@
+import { Field, ObjectType } from '@nestjs/graphql';
+import { GraphQLJSONObject } from 'graphql-type-json';
+import { Result } from './common/result.model';
+
+@ObjectType()
+export class RawResult extends Result {
+  @Field(() => GraphQLJSONObject)
+  data: unknown;
+
+  @Field(() => [String], { defaultValue: [] })
+  listMax?: string[];
+}
diff --git a/api/src/schema.gql b/api/src/schema.gql
index 9b71c50..ba240a7 100644
--- a/api/src/schema.gql
+++ b/api/src/schema.gql
@@ -72,7 +72,7 @@ A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date
 """
 scalar DateTime
 
-union ResultUnion = TableResult | DummyResult
+union ResultUnion = TableResult | RawResult
 
 type TableResult {
   groupBy: String
@@ -81,13 +81,17 @@ type TableResult {
   headers: [Header!]!
 }
 
-type DummyResult {
+type RawResult {
   groupBy: String
-  name: String!
-  data: [[String!]!]!
+  data: JSONObject!
   listMax: [String!]!
 }
 
+"""
+The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
+"""
+scalar JSONObject @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf")
+
 type Query {
   domains(ids: [String!] = []): [Domain!]!
 }
-- 
GitLab