diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts index cfa03be24607f07f1713ddcff4f5c3b0d8a1d040..1cdbb509c93a78794235c371c6fb3a62076b4792 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 5a779207338a6d115adcad5142ff1e8a81967953..ba948ad8e870efd9d4e0c326fca02949d43234c3 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 a4ecf13e8be50a1e06aafa1a83cd714f916d3254..d9a772d3d26fa469b3ee684d4061064767f1a912 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 323e65e85368da3785ba7ab8daad0a067560ca9e..0d90e92e62de3e342cc206f4579a2bf399df1f36 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 750a2d6683b9317daa7589970cbc161003698625..e3de433e113e0e13577372240cda4114aa02a193 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 0a2827e2bcb55928db0f1df2af9a69b7e341189a..d871eead0d40690fda47ec6b8ee5ff76bd173e6d 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 0000000000000000000000000000000000000000..42dd04f5b500e2e65bcc2ec2d36a12c3104287b1 --- /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 54d8e10ec9a1d6f4c98d9bb027afdc4a81bb1be0..0000000000000000000000000000000000000000 --- 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 22f917222d400c70427ea7ec89abda45f2471155..0000000000000000000000000000000000000000 --- 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 e0d4db8774b413f182643f998a0b3142e43b4712..8d97521e5e945f00017d16828f128212571b1c7c 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! }