diff --git a/api/src/engine/connectors/csv/main.connector.ts b/api/src/engine/connectors/csv/main.connector.ts index bcb8c7ee8ae11d0bb8dea161b198fe83fbc36b5a..41e141d1d3e1ad724493a4d97169ad2cc7be5fb6 100644 --- a/api/src/engine/connectors/csv/main.connector.ts +++ b/api/src/engine/connectors/csv/main.connector.ts @@ -10,6 +10,8 @@ import { ListExperiments } from 'src/engine/models/experiment/list-experiments.m import { ExperimentEditInput } from 'src/engine/models/experiment/input/experiment-edit.input'; import { Algorithm } from 'src/engine/models/experiment/algorithm.model'; import { HttpService } from '@nestjs/axios'; +import { Group } from 'src/engine/models/group.model'; +import { Dictionary } from 'src/common/interfaces/utilities.interface'; export default class CSVService implements IEngineService { constructor( @@ -54,26 +56,76 @@ export default class CSVService implements IEngineService { async getDomains(): Promise<Domain[]> { const path = - 'https://docs.google.com/spreadsheets/d/e/2PACX-1vSuqAuC9YZkWbY-eU_zh9-lEh7tBUwSj2TGA_flvGkQ3KdA82RZchHICl6zbffl8yZ39IwPtNgk15Wd/pub?gid=0&single=true&output=tsv'; + 'https://docs.google.com/spreadsheets/d/1yjslZQCOMCxkjr4xQ-NmTMNEjhpdmZgijbn83za80Ak/export?format=tsv'; const { data } = await firstValueFrom(this.httpService.get<string>(path)); - console.log(data.split('\n').map((row) => row.split('\t'))); + const rows = data + .split('\r\n') + .map((row) => row.split('\t').filter((i) => i)) + .filter((row) => row.length >= 2); + + rows.shift(); // headers + + const vars = []; + const groups: Dictionary<Group> = {}; + const rootGroup: Group = { + id: 'root', + groups: [], + }; + + rows.forEach((row) => { + const variable = { + id: row[0].toLowerCase(), + label: row[0], + }; + + row.shift(); + + vars.push(variable); + + row + .filter((group) => !groups[group.toLowerCase()]) + .forEach((group, i) => { + const groupId = group.toLowerCase(); + if (i === 0) rootGroup.groups.push(groupId); + groups[groupId] = { + id: groupId, + label: group, + variables: [], + groups: [], + }; + }); + + const groupId = row[row.length - 1].toLowerCase(); + + groups[groupId].variables = [...groups[groupId].variables, variable.id]; + + row + .reverse() + .map((group) => group.toLowerCase()) + .forEach((group, i) => { + const groupId = group.toLowerCase(); + + if (i !== row.length - 1) { + const parentId = row[i + 1].toLowerCase(); + groups[parentId].groups = groups[parentId].groups + ? [...new Set([...groups[parentId].groups, groupId])] + : [groupId]; + } + }); + }); + + rootGroup.groups = [...new Set(rootGroup.groups)]; return [ { id: 'Dummy', label: 'Dummy', datasets: [{ id: 'DummyDataset', label: 'DummyDataset' }], - groups: [ - { - id: 'DummyGroup', - variables: ['DummyVar'], - groups: [], - }, - ], - rootGroup: { id: 'DummyGroup' }, - variables: [{ id: 'DummyVar', type: 'string' }], + groups: Object.values(groups), + rootGroup: rootGroup, + variables: vars, }, ]; } diff --git a/api/src/engine/connectors/exareme/converters.ts b/api/src/engine/connectors/exareme/converters.ts index 07fb2b4b0cfa378b1950147be5862307d4ff4ea9..ab840843a6c698c24142eb228343d819584ee8a6 100644 --- a/api/src/engine/connectors/exareme/converters.ts +++ b/api/src/engine/connectors/exareme/converters.ts @@ -27,7 +27,9 @@ export const dataToGroup = (data: Hierarchy): Group => { return { id: data.code, label: data.label, - groups: data.groups ? data.groups.map(dataToGroup) : [], + groups: data.groups + ? data.groups.map(dataToGroup).map((group) => group.id) + : [], variables: data.variables ? data.variables.map((data: VariableEntity) => data.code) : [], diff --git a/api/src/engine/models/variable.model.ts b/api/src/engine/models/variable.model.ts index 8650f48b1044bb07c88964ae36aeb00d0d9a3d1b..bd54afed70a025ce6c5673bf0627a657d77926cb 100644 --- a/api/src/engine/models/variable.model.ts +++ b/api/src/engine/models/variable.model.ts @@ -5,8 +5,8 @@ import { Group } from './group.model'; @ObjectType() export class Variable extends Entity { - @Field() - type: string; + @Field({ nullable: true }) + type?: string; @Field({ nullable: true }) description?: string; diff --git a/api/src/schema.gql b/api/src/schema.gql index c906a1951ce36cba5961ced0c2853ef6ddb2658c..86b31a4d2dcb38a15ab00200462ce2c5bd220d97 100644 --- a/api/src/schema.gql +++ b/api/src/schema.gql @@ -11,7 +11,7 @@ type Group { id: String! label: String description: String - groups: [Group!] + groups: [String!] """List of variable's ids""" variables: [String!] @@ -20,7 +20,7 @@ type Group { type Variable { id: String! label: String - type: String! + type: String description: String enumerations: [Category!] groups: [Group!]