diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts index c5784b7914d89e62ac7feaab3635692166976889..34cc6ae3b4a5f09c44cd9b032ba30a6544db28f4 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 cb1c884c6101bec8de814accda529690cb92896f..8520cdebb43b3e909b4f4bd9776860b70c510d79 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 c3dea2df35773cafe6341fa1b79b201657903d09..8e549b464180d1d2f56525971369fa697021d8f4 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 5289075ea86bbcae6d7fd333b5bcf76985598dc0..753902446cf3731575018b49e919807626aef2f5 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 c75c68e9c5d4a482a13dbef9878d3e211d978b13..6432cd16f26c341aad44afd90f993a2bf649880e 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 473782c5b6cc0a43091b654bcdbeda9b7685536a..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..8eb4cb26b5dade932440b6fef169275988d33b03 --- /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 0000000000000000000000000000000000000000..d435595b03a92692d84811fa4f7400b03127f603 --- /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 d871eead0d40690fda47ec6b8ee5ff76bd173e6d..746e0f5c6645b2715c74ac98108afd6d3ae97c36 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 39dd34e76af27f6833af38d7a3f53aacf41be2f1..bb7d32c0cc9d125f610017d8eedd3f1f24f5de70 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!]! +}