From e981261a9ba5cd0fb9dcb24e39f1298bd18d3e73 Mon Sep 17 00:00:00 2001
From: stevereis <stevereis93@gmail.com>
Date: Tue, 28 Sep 2021 11:45:05 +0200
Subject: [PATCH] Refactor Transient to Experiment

---
 .../connectors/datashield/main.connector.ts   |  9 ++---
 .../engine/connectors/exareme/converters.ts   | 13 +++----
 .../connectors/exareme/main.connector.ts      | 11 +++---
 api/src/engine/engine.interfaces.ts           |  8 +++--
 api/src/engine/engine.resolver.ts             | 10 +++---
 .../experiment-create.input.ts}               |  9 +++--
 .../models/experiment/experiment.model.ts     | 23 +++++++++++++
 .../models/transient/transient.model.ts       | 11 ------
 .../engine/models/utility/extrafield.input.ts | 12 -------
 api/src/schema.gql                            | 34 ++++++++++++-------
 10 files changed, 78 insertions(+), 62 deletions(-)
 rename api/src/engine/models/{transient/transient-create.input.ts => experiment/experiment-create.input.ts} (69%)
 create mode 100644 api/src/engine/models/experiment/experiment.model.ts
 delete mode 100644 api/src/engine/models/transient/transient.model.ts
 delete mode 100644 api/src/engine/models/utility/extrafield.input.ts

diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts
index cfa03be..1cdbb50 100644
--- a/api/src/engine/connectors/datashield/main.connector.ts
+++ b/api/src/engine/connectors/datashield/main.connector.ts
@@ -1,14 +1,15 @@
 import { Observable } from 'rxjs';
 import { IEngineService } from 'src/engine/engine.interfaces';
 import { Domain } from 'src/engine/models/domain.model';
-import { TransientCreateInput } from 'src/engine/models/transient/transient-create.input';
-import { Transient } from 'src/engine/models/transient/transient.model';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input';
+import { Experiment } from 'src/engine/models/experiment/experiment.model';
 
 export default class DataShieldService implements IEngineService {
-  createTransient(data: TransientCreateInput): Promise<Transient> | Transient {
+  createTransient(
+    data: ExperimentCreateInput,
+  ): Experiment | Promise<Experiment> {
     throw new Error('Method not implemented.');
   }
-
   getDomains(): Domain[] {
     throw new Error('Method not implemented.');
   }
diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts
index 5a77920..ba948ad 100644
--- a/api/src/engine/connectors/exareme/converters.ts
+++ b/api/src/engine/connectors/exareme/converters.ts
@@ -4,9 +4,9 @@ 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 { TransientCreateInput } from 'src/engine/models/transient/transient-create.input';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input';
 import { TransientDataResult } from './interfaces/transient/transient-data-result.interface';
-import { Transient } from 'src/engine/models/transient/transient.model';
+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';
@@ -40,7 +40,7 @@ export const dataToVariable = (data: VariableEntity): Variable => {
   };
 };
 
-export const transientInputToData = (data: TransientCreateInput) => {
+export const experimentInputToData = (data: ExperimentCreateInput) => {
   return {
     algorithm: {
       parameters: [
@@ -62,9 +62,9 @@ export const transientInputToData = (data: TransientCreateInput) => {
         },
       ],
       type: 'string',
-      name: 'DESCRIPTIVE_STATS',
+      name: data.algorithm,
     },
-    name: 'Descriptive statistics',
+    name: data.name,
   };
 };
 
@@ -80,7 +80,7 @@ const dictToTable = (dict: Dictionary<string[]>, rows: number): string[][] => {
   });
 };
 
-export const dataToTransient = (data: TransientDataResult): Transient => {
+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];
@@ -116,6 +116,7 @@ export const dataToTransient = (data: TransientDataResult): Transient => {
       data: dictToTable(rows, count),
       metadatas: domains,
       name: varKey,
+      groupBy: 'single',
     };
   });
 
diff --git a/api/src/engine/connectors/exareme/main.connector.ts b/api/src/engine/connectors/exareme/main.connector.ts
index a4ecf13..d9a772d 100644
--- a/api/src/engine/connectors/exareme/main.connector.ts
+++ b/api/src/engine/connectors/exareme/main.connector.ts
@@ -5,15 +5,15 @@ 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 { TransientCreateInput } from 'src/engine/models/transient/transient-create.input';
-import { Transient } from 'src/engine/models/transient/transient.model';
+import { ExperimentCreateInput } from 'src/engine/models/experiment/experiment-create.input';
+import { Experiment } from 'src/engine/models/experiment/experiment.model';
 import { Variable } from 'src/engine/models/variable.model';
 import {
   dataToCategory,
   dataToGroup,
   dataToTransient,
   dataToVariable,
-  transientInputToData,
+  experimentInputToData,
 } from './converters';
 import { Hierarchy } from './interfaces/hierarchy.interface';
 import { Pathology } from './interfaces/pathology.interface';
@@ -25,8 +25,8 @@ export default class ExaremeService implements IEngineService {
     private readonly httpService: HttpService,
   ) {}
 
-  async createTransient(data: TransientCreateInput): Promise<Transient> {
-    const form = transientInputToData(data);
+  async createTransient(data: ExperimentCreateInput): Promise<Experiment> {
+    const form = experimentInputToData(data);
 
     const path = this.options.baseurl + 'experiments/transient';
 
@@ -40,7 +40,6 @@ export default class ExaremeService implements IEngineService {
                 ppmi: {
                   data: {
                     std: 1.2048783713787277,
-                    max: 15.0815,
                     min: 7.6335,
                     mean: 11.38076218487395,
                   },
diff --git a/api/src/engine/engine.interfaces.ts b/api/src/engine/engine.interfaces.ts
index 323e65e..0d90e92 100644
--- a/api/src/engine/engine.interfaces.ts
+++ b/api/src/engine/engine.interfaces.ts
@@ -1,8 +1,8 @@
 import { Request } from 'express';
 import { Observable } from 'rxjs';
 import { Domain } from './models/domain.model';
-import { TransientCreateInput } from './models/transient/transient-create.input';
-import { Transient } from './models/transient/transient.model';
+import { ExperimentCreateInput } from './models/experiment/experiment-create.input';
+import { Experiment } from './models/experiment/experiment.model';
 
 export interface IEngineOptions {
   type: string;
@@ -24,7 +24,9 @@ export interface IEngineService {
 
   startExperimentTransient(request: Request): Observable<string>;
 
-  createTransient(data: TransientCreateInput): Promise<Transient> | Transient;
+  createTransient(
+    data: ExperimentCreateInput,
+  ): Promise<Experiment> | Experiment;
 
   startExperiment(request: Request): Observable<string>;
 
diff --git a/api/src/engine/engine.resolver.ts b/api/src/engine/engine.resolver.ts
index 750a2d6..e3de433 100644
--- a/api/src/engine/engine.resolver.ts
+++ b/api/src/engine/engine.resolver.ts
@@ -3,8 +3,8 @@ 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 { TransientCreateInput } from './models/transient/transient-create.input';
-import { Transient } from './models/transient/transient.model';
+import { ExperimentCreateInput } from './models/experiment/experiment-create.input';
+import { Experiment } from './models/experiment/experiment.model';
 
 @Resolver()
 export class EngineResolver {
@@ -20,10 +20,10 @@ export class EngineResolver {
     return this.engineService.getDomains(ids);
   }
 
-  @Mutation(() => Transient)
+  @Mutation(() => Experiment)
   async createTransient(
-    @Args('data') transientCreateInput: TransientCreateInput,
+    @Args('data') experimentCreateInput: ExperimentCreateInput,
   ) {
-    return this.engineService.createTransient(transientCreateInput);
+    return this.engineService.createTransient(experimentCreateInput);
   }
 }
diff --git a/api/src/engine/models/transient/transient-create.input.ts b/api/src/engine/models/experiment/experiment-create.input.ts
similarity index 69%
rename from api/src/engine/models/transient/transient-create.input.ts
rename to api/src/engine/models/experiment/experiment-create.input.ts
index 0a2827e..d871eea 100644
--- a/api/src/engine/models/transient/transient-create.input.ts
+++ b/api/src/engine/models/experiment/experiment-create.input.ts
@@ -1,8 +1,7 @@
 import { Field, InputType } from '@nestjs/graphql';
-import { Extrafield } from '../utility/extrafield.input';
 
 @InputType()
-export class TransientCreateInput extends Extrafield {
+export class ExperimentCreateInput {
   @Field(() => [String])
   datasets: string[];
 
@@ -14,4 +13,10 @@ export class TransientCreateInput extends Extrafield {
 
   @Field()
   domain: string;
+
+  @Field()
+  algorithm: string;
+
+  @Field()
+  name: string;
 }
diff --git a/api/src/engine/models/experiment/experiment.model.ts b/api/src/engine/models/experiment/experiment.model.ts
new file mode 100644
index 0000000..42dd04f
--- /dev/null
+++ b/api/src/engine/models/experiment/experiment.model.ts
@@ -0,0 +1,23 @@
+import { Field, GraphQLISODateTime, ObjectType } from '@nestjs/graphql';
+import { Result } from '../result/result.model';
+
+@ObjectType()
+export class Experiment {
+  @Field()
+  title: string;
+
+  @Field({ nullable: true })
+  uuid?: string;
+
+  @Field(() => GraphQLISODateTime, { nullable: true })
+  created_at?: Date;
+
+  @Field(() => GraphQLISODateTime, { nullable: true })
+  update_at?: Date;
+
+  @Field(() => GraphQLISODateTime, { nullable: true })
+  finished_at?: Date;
+
+  @Field(() => [Result])
+  result: Result[];
+}
diff --git a/api/src/engine/models/transient/transient.model.ts b/api/src/engine/models/transient/transient.model.ts
deleted file mode 100644
index 54d8e10..0000000
--- a/api/src/engine/models/transient/transient.model.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Field, ObjectType } from '@nestjs/graphql';
-import { TableResult } from '../result/table-result.model';
-
-@ObjectType()
-export class Transient {
-  @Field()
-  title: string;
-
-  @Field(() => [TableResult])
-  result: TableResult[];
-}
diff --git a/api/src/engine/models/utility/extrafield.input.ts b/api/src/engine/models/utility/extrafield.input.ts
deleted file mode 100644
index 22f9172..0000000
--- a/api/src/engine/models/utility/extrafield.input.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Field, InputType } from '@nestjs/graphql';
-
-/**
- * This class is used to add a common extra field to
- * an input class in order to provide specific
- * information for a connector
- */
-@InputType()
-export class Extrafield {
-  @Field({ nullable: true })
-  extradata: string;
-}
diff --git a/api/src/schema.gql b/api/src/schema.gql
index e0d4db8..8d97521 100644
--- a/api/src/schema.gql
+++ b/api/src/schema.gql
@@ -34,20 +34,27 @@ type Domain {
   rootGroup: Group!
 }
 
-type MetaData {
-  name: String!
-  type: String!
+type Result {
+  groupBy: String
 }
 
-type TableResult {
-  name: String!
-  data: [[String!]!]!
-  metadatas: [MetaData!]!
+type Experiment {
+  title: String!
+  uuid: String
+  created_at: DateTime
+  update_at: DateTime
+  finished_at: DateTime
+  result: [Result!]!
 }
 
-type Transient {
-  title: String!
-  result: [TableResult!]!
+"""
+A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format.
+"""
+scalar DateTime
+
+type MetaData {
+  name: String!
+  type: String!
 }
 
 type Query {
@@ -55,13 +62,14 @@ type Query {
 }
 
 type Mutation {
-  createTransient(data: TransientCreateInput!): Transient!
+  createTransient(data: ExperimentCreateInput!): Experiment!
 }
 
-input TransientCreateInput {
-  extradata: String
+input ExperimentCreateInput {
   datasets: [String!]!
   variables: [String!]!
   filter: String
   domain: String!
+  algorithm: String!
+  name: String!
 }
-- 
GitLab