Skip to content
Snippets Groups Projects
Commit 7bc7615c authored by Steve Reis's avatar Steve Reis
Browse files

Merge branch 'feat/datahield-integration' into 'develop'

Datashield last integration

See merge request sibmip/gateway!42
parents 7b25bcc4 432d6d5c
No related branches found
No related tags found
No related merge requests found
api/src/engine/connectors/datashield/assets/SOPHIA_logo.png

32.5 KiB

......@@ -20,7 +20,10 @@ import { ExperimentCreateInput } from 'src/engine/models/experiment/input/experi
import { ExperimentEditInput } from 'src/engine/models/experiment/input/experiment-edit.input';
import { ListExperiments } from 'src/engine/models/experiment/list-experiments.model';
import { RawResult } from 'src/engine/models/result/raw-result.model';
import { TableResult } from 'src/engine/models/result/table-result.model';
import {
TableResult,
ThemeType,
} from 'src/engine/models/result/table-result.model';
import {
transformToDomains,
transformToHisto,
......@@ -60,12 +63,12 @@ export default class DataShieldService implements IEngineService {
}),
);
if (response.data['breaks'] === undefined) {
if (response.data['global'] === undefined) {
DataShieldService.logger.warn('Inconsistency on histogram result');
DataShieldService.logger.verbose(path);
return {
rawdata: {
data: response.data[0],
data: 'Engine result are inconsitent',
type: MIME_TYPES.ERROR,
},
};
......@@ -73,6 +76,7 @@ export default class DataShieldService implements IEngineService {
const title = variable.replace(/\./g, ' ').trim();
const data = { ...response.data, title };
const chart = transformToHisto.evaluate(data);
return {
......@@ -96,7 +100,11 @@ export default class DataShieldService implements IEngineService {
const title = variable.replace(/\./g, ' ').trim();
const data = { ...response.data, title };
return transformToTable.evaluate(data);
const table = transformToTable.evaluate(data);
return {
...table,
theme: ThemeType.NORMAL,
};
}
async createExperiment(
......@@ -164,16 +172,16 @@ export default class DataShieldService implements IEngineService {
}
async getDomains(): Promise<Domain[]> {
const path = this.options.baseurl + 'start';
const loginPath = this.options.baseurl + 'login';
const response = await firstValueFrom(
this.httpService.get(path, {
const loginData = await firstValueFrom(
this.httpService.get(loginPath, {
auth: { username: 'guest', password: 'guest123' },
}),
);
if (response.headers && response.headers['set-cookie']) {
const cookies = response.headers['set-cookie'] as string[];
const cookies = (loginData.headers['set-cookie'] as string[]) ?? [];
if (loginData.headers && loginData.headers['set-cookie']) {
cookies.forEach((cookie) => {
const [key, value] = cookie.split(/={1}/);
this.req.res.cookie(key, value, {
......@@ -183,6 +191,16 @@ export default class DataShieldService implements IEngineService {
});
}
const path = this.options.baseurl + 'getvars';
const response = await firstValueFrom(
this.httpService.get(path, {
headers: {
cookie: cookies.join(';'),
},
}),
);
return [transformToDomains.evaluate(response.data)];
}
......
// query /histogram?var=Alanine.aminotransferase..Enzymatic.activity.volume..in.Serum.or.Plasma&type=combine
export {};
const data = {
global: {
breaks: [
1.9766, 15.083, 28.1893, 41.2957, 54.4021, 67.5085, 80.6149, 93.7212,
106.8276, 119.934, 133.0404,
],
counts: [69, 388, 74, 17, 10, 0, 0, 0, 0, 0],
density: [0.0093, 0.0526, 0.0104, 0.0023, 0.0014, 0, 0, 0, 0, 0],
mids: [
8.5298, 21.6361, 34.7425, 47.8489, 60.9553, 74.0617, 87.168, 100.2744,
113.3808, 126.4872,
],
xname: 'xvect',
equidist: true,
intensities: [0.0093, 0.0526, 0.0104, 0.0023, 0.0014, 0, 0, 0, 0, 0],
},
};
describe('Histograms', () => {
test.todo('TODO');
});
// query : quantiles?var=Alanine.aminotransferase..Enzymatic.activity.volume..in.Serum.or.Plasma&type=split
export {};
const data = {
'omop_test.db': {
'5%': 14.175,
'10%': 16,
'25%': 17.3,
'50%': 20.8,
'75%': 23.85,
'90%': 36.75,
'95%': 42.775,
Mean: 22.5667,
},
'test.db': {
'5%': 14.305,
'10%': 14.9,
'25%': 16.7,
'50%': 21.05,
'75%': 24.15,
'90%': 35.4,
'95%': 40.76,
Mean: 22.9203,
},
'sophia.db': {
'5%': 17.05,
'10%': 20.5,
'25%': 21,
'50%': 22.4,
'75%': 24.775,
'90%': 36.37,
'95%': 43.79,
Mean: 25.5347,
},
title: 'test',
};
describe('Quantiles', () => {
test.todo('TODO');
});
......@@ -31,83 +31,50 @@ export const transformToDomains = jsonata(`
export const transformToHisto = jsonata(`
(
$nbBreaks := $count(breaks);
$nbBreaks := $count(global.breaks);
$params := ["counts"];
{
"chart": {
"type": 'column'
},
"legend": {
"enabled": false
},
"series": [
{
"data": counts,
"dataLabels": {
"enabled": true
}
}
],
"title": {
"text": title ? title : ''
},
"tooltip": {
"enabled": true
},
"xAxis": {
"categories": breaks#$i[$i < $nbBreaks-1].[$ & ' - ' & %.*[$i+1]]
},
"yAxis": {
"min": 0,
"minRange": 0.1,
"allowDecimals": true
}
{
"chart": {
"type": 'column'
},
"legend": {
"enabled": false
},
"series": global.$each(function ($v, $k) {
$k in $params ? {
"name": $k,
"data": $v
} : undefined
})[],
"title": {
"text": title ? title : ''
},
"tooltip": {
"enabled": true
},
"xAxis": {
"categories": global.breaks#$i[$i < $nbBreaks-1].[$ & ' - ' & %.*[$i+1]]
},
"yAxis": {
"min": 0,
"minRange": 0.1,
"allowDecimals": true
}
})
`);
export const transformToTable = jsonata(`
{
"name": "Descriptive Statistics",
"headers": $append(title, ['5%','10%','25%','50%','75%','90%','95%','Mean']).{
"name": $,
"type": "string"
},
"data": $.message.$each(function($v, $k) {
$append($k,$v)
})
}
`);
/*export const transformToTable = jsonata(`
(
$params := ["xname", "equidist", "breaks"];
$concat := function($i, $j) {
$append($i, $j)
};
{
"name": "test",
"headers": $append('', $.*[0].breaks).{
"name": $,
"type": "string"
},
"data": $.$each(function($v, $k) {
[[$k],$v.$each(function($v, $k) {$not($k in $params) ? $append($k, $v) : undefined})]
}) ~> $reduce($concat, [])
}
)
`);*/
/* export const transformToTable = jsonata(`
(
$params := ["xname", "equidist", "breaks"];
$.$each(function($v, $k) {
{
"name": $k,
"headers": $v.breaks,
"data": $v.$each(function($v, $k) {$not($k in $params) ? $append($k, $v) : undefined})
}
})
)
`); */
$params := ["title"];
{
"name": "Descriptive Statistics",
"headers": $append(title, ['5%','10%','25%','50%','75%','90%','95%','Mean']).{
"name": $,
"type": "string"
},
"data": $.$each(function($v, $k) {
$not($k in $params) ? $append($k,$v.*) : undefined
})
})
`);
import { Field, ObjectType } from '@nestjs/graphql';
import { Field, ObjectType, registerEnumType } from '@nestjs/graphql';
import { Header } from './common/header.model';
import { Result } from './common/result.model';
export enum ThemeType {
DEFAULT,
NORMAL,
}
registerEnumType(ThemeType, {
name: 'ThemeType',
});
@ObjectType()
export class TableResult extends Result {
@Field()
......@@ -12,4 +21,7 @@ export class TableResult extends Result {
@Field(() => [Header])
headers: Header[];
@Field(() => ThemeType, { defaultValue: ThemeType.DEFAULT })
theme?: ThemeType;
}
......@@ -82,6 +82,12 @@ type TableResult {
name: String!
data: [[String!]!]!
headers: [Header!]!
theme: ThemeType!
}
enum ThemeType {
DEFAULT
NORMAL
}
type RawResult {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment