From 457330c54a96e4576c3f0f3a2c1ba87692a73efd Mon Sep 17 00:00:00 2001
From: Steve Reis <stevereis93@gmail.com>
Date: Thu, 30 Sep 2021 17:12:35 +0200
Subject: [PATCH] WIP : uniform experiment and transient

---
 .../connectors/datashield/main.connector.ts   |  2 +-
 .../engine/connectors/exareme/converters.ts   | 20 ++++++++++-------
 .../connectors/exareme/main.connector.ts      | 16 +++++++++-----
 api/src/engine/engine.interfaces.ts           |  2 +-
 api/src/engine/engine.resolver.ts             |  2 +-
 .../models/experiment/algorithm.input.ts      | 22 -------------------
 .../input/algorithm-parameter.input.ts        | 10 +++++++++
 .../experiment/input/algorithm.input.ts       | 14 ++++++++++++
 .../{ => input}/experiment-create.input.ts    |  6 ++---
 api/src/schema.gql                            | 14 ++++++++++--
 10 files changed, 64 insertions(+), 44 deletions(-)
 delete mode 100644 api/src/engine/models/experiment/algorithm.input.ts
 create mode 100644 api/src/engine/models/experiment/input/algorithm-parameter.input.ts
 create mode 100644 api/src/engine/models/experiment/input/algorithm.input.ts
 rename api/src/engine/models/experiment/{ => input}/experiment-create.input.ts (77%)

diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts
index c5784b7..34cc6ae 100644
--- a/api/src/engine/connectors/datashield/main.connector.ts
+++ b/api/src/engine/connectors/datashield/main.connector.ts
@@ -1,7 +1,7 @@
 import { Observable } from 'rxjs';
 import { IEngineService } from 'src/engine/engine.interfaces';
 import { Domain } from 'src/engine/models/domain.model';
-import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/input/experiment-create.input';
 import { Experiment } from 'src/engine/models/experiment/experiment.model';
 
 export default class DataShieldService implements IEngineService {
diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts
index cb1c884..8520cde 100644
--- a/api/src/engine/connectors/exareme/converters.ts
+++ b/api/src/engine/connectors/exareme/converters.ts
@@ -1,6 +1,7 @@
 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 { AlgorithmParamInput } from 'src/engine/models/experiment/input/algorithm-parameter.input';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/input/experiment-create.input';
 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';
@@ -39,6 +40,13 @@ export const dataToVariable = (data: VariableEntity): Variable => {
   };
 };
 
+const algoParamInputToData = (param: AlgorithmParamInput) => {
+  return {
+    name: param.name,
+    value: param.value.join(','),
+  };
+};
+
 export const experimentInputToData = (data: ExperimentCreateInput) => {
   return {
     algorithm: {
@@ -47,10 +55,6 @@ export const experimentInputToData = (data: ExperimentCreateInput) => {
           name: 'dataset',
           value: data.datasets.join(','),
         },
-        {
-          name: 'y',
-          value: data.variables.join(','),
-        },
         {
           name: 'filter',
           value: data.filter,
@@ -59,9 +63,9 @@ export const experimentInputToData = (data: ExperimentCreateInput) => {
           name: 'pathology',
           value: data.domain,
         },
-      ],
-      type: 'string',
-      name: data.algorithm,
+      ].concat(data.algorithm.parameters.map(algoParamInputToData)),
+      type: data.algorithm.type ?? 'string',
+      name: data.algorithm.name,
     },
     name: data.name,
   };
diff --git a/api/src/engine/connectors/exareme/main.connector.ts b/api/src/engine/connectors/exareme/main.connector.ts
index c3dea2d..8e549b4 100644
--- a/api/src/engine/connectors/exareme/main.connector.ts
+++ b/api/src/engine/connectors/exareme/main.connector.ts
@@ -4,8 +4,8 @@ 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 { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input';
 import { Experiment } from 'src/engine/models/experiment/experiment.model';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/input/experiment-create.input';
 import { Group } from 'src/engine/models/group.model';
 import { Variable } from 'src/engine/models/variable.model';
 import {
@@ -24,10 +24,16 @@ export default class ExaremeService implements IEngineService {
     private readonly options: IEngineOptions,
     private readonly httpService: HttpService,
   ) {}
-  createExperiment(
-    data: ExperimentCreateInput,
-  ): Experiment | Promise<Experiment> {
-    throw new Error('Method not implemented.');
+  async createExperiment(data: ExperimentCreateInput): Promise<Experiment> {
+    const form = experimentInputToData(data);
+
+    const path = this.options.baseurl + 'experiments';
+
+    const resultAPI = await firstValueFrom(
+      this.httpService.post<TransientDataResult>(path, form),
+    );
+
+    return dataToTransient(resultAPI.data);
   }
 
   async createTransient(data: ExperimentCreateInput): Promise<Experiment> {
diff --git a/api/src/engine/engine.interfaces.ts b/api/src/engine/engine.interfaces.ts
index 5289075..7539024 100644
--- a/api/src/engine/engine.interfaces.ts
+++ b/api/src/engine/engine.interfaces.ts
@@ -1,7 +1,7 @@
 import { Request } from 'express';
 import { Observable } from 'rxjs';
 import { Domain } from './models/domain.model';
-import { ExperimentCreateInput } from './models/experiment/experiment-create.input';
+import { ExperimentCreateInput } from './models/experiment/input/experiment-create.input';
 import { Experiment } from './models/experiment/experiment.model';
 
 export interface IEngineOptions {
diff --git a/api/src/engine/engine.resolver.ts b/api/src/engine/engine.resolver.ts
index c75c68e..6432cd1 100644
--- a/api/src/engine/engine.resolver.ts
+++ b/api/src/engine/engine.resolver.ts
@@ -3,7 +3,7 @@ import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
 import { ENGINE_SERVICE } from './engine.constants';
 import { IEngineService } from './engine.interfaces';
 import { Domain } from './models/domain.model';
-import { ExperimentCreateInput } from './models/experiment/experiment-create.input';
+import { ExperimentCreateInput } from './models/experiment/input/experiment-create.input';
 import { Experiment } from './models/experiment/experiment.model';
 
 @Resolver()
diff --git a/api/src/engine/models/experiment/algorithm.input.ts b/api/src/engine/models/experiment/algorithm.input.ts
deleted file mode 100644
index 473782c..0000000
--- a/api/src/engine/models/experiment/algorithm.input.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Field, InputType } from '@nestjs/graphql';
-
-@InputType()
-export class AlgorithmInput {
-  @Field(() => [String])
-  datasets: string[];
-
-  @Field(() => [String])
-  variables: string[];
-
-  @Field(() => String, { nullable: true })
-  filter: string;
-
-  @Field()
-  domain: string;
-
-  @Field()
-  algorithm: string;
-
-  @Field()
-  name: string;
-}
diff --git a/api/src/engine/models/experiment/input/algorithm-parameter.input.ts b/api/src/engine/models/experiment/input/algorithm-parameter.input.ts
new file mode 100644
index 0000000..8eb4cb2
--- /dev/null
+++ b/api/src/engine/models/experiment/input/algorithm-parameter.input.ts
@@ -0,0 +1,10 @@
+import { Field, InputType } from '@nestjs/graphql';
+
+@InputType()
+export class AlgorithmParamInput {
+  @Field()
+  name: string;
+
+  @Field(() => [String])
+  value: string[];
+}
diff --git a/api/src/engine/models/experiment/input/algorithm.input.ts b/api/src/engine/models/experiment/input/algorithm.input.ts
new file mode 100644
index 0000000..d435595
--- /dev/null
+++ b/api/src/engine/models/experiment/input/algorithm.input.ts
@@ -0,0 +1,14 @@
+import { Field, InputType } from '@nestjs/graphql';
+import { AlgorithmParamInput } from './algorithm-parameter.input';
+
+@InputType()
+export class AlgorithmInput {
+  @Field()
+  name: string;
+
+  @Field(() => [AlgorithmParamInput])
+  parameters: AlgorithmParamInput[];
+
+  @Field()
+  type: string;
+}
diff --git a/api/src/engine/models/experiment/experiment-create.input.ts b/api/src/engine/models/experiment/input/experiment-create.input.ts
similarity index 77%
rename from api/src/engine/models/experiment/experiment-create.input.ts
rename to api/src/engine/models/experiment/input/experiment-create.input.ts
index d871eea..746e0f5 100644
--- a/api/src/engine/models/experiment/experiment-create.input.ts
+++ b/api/src/engine/models/experiment/input/experiment-create.input.ts
@@ -1,13 +1,11 @@
 import { Field, InputType } from '@nestjs/graphql';
+import { AlgorithmInput } from './algorithm.input';
 
 @InputType()
 export class ExperimentCreateInput {
   @Field(() => [String])
   datasets: string[];
 
-  @Field(() => [String])
-  variables: string[];
-
   @Field(() => String, { nullable: true })
   filter: string;
 
@@ -15,7 +13,7 @@ export class ExperimentCreateInput {
   domain: string;
 
   @Field()
-  algorithm: string;
+  algorithm: AlgorithmInput;
 
   @Field()
   name: string;
diff --git a/api/src/schema.gql b/api/src/schema.gql
index 39dd34e..bb7d32c 100644
--- a/api/src/schema.gql
+++ b/api/src/schema.gql
@@ -79,9 +79,19 @@ type Mutation {
 
 input ExperimentCreateInput {
   datasets: [String!]!
-  variables: [String!]!
   filter: String
   domain: String!
-  algorithm: String!
+  algorithm: AlgorithmInput!
   name: String!
 }
+
+input AlgorithmInput {
+  name: String!
+  parameters: [AlgorithmParamInput!]!
+  type: String!
+}
+
+input AlgorithmParamInput {
+  name: String!
+  value: [String!]!
+}
-- 
GitLab