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