diff --git a/api/src/engine/connectors/datashield/datashield.connector.ts b/api/src/engine/connectors/datashield/datashield.connector.ts index 05c7acdca7f1f8067c901ccafa8aa2e1d03c318e..1f0cfd9000523cc293962565a26a4762fe6a1d19 100644 --- a/api/src/engine/connectors/datashield/datashield.connector.ts +++ b/api/src/engine/connectors/datashield/datashield.connector.ts @@ -260,6 +260,10 @@ export default class DataShieldConnector implements Connector { datasets: data.datasets, algorithm: { name: data.algorithm.id, + parameters: data.algorithm.parameters.map((p) => ({ + name: p.id, + value: p.value, + })), }, }; @@ -320,15 +324,15 @@ export default class DataShieldConnector implements Connector { experiment.variables.length > 0 ? experiment.variables[0] : undefined; const expToInput = { - coVariable, - variables: experiment.coVariables, algorithm: { id: experiment.algorithm.name, + coVariable, + variables: experiment.coVariables, }, datasets: experiment.datasets, }; - experiment.algorithm.parameters.forEach((param) => { + experiment.algorithm.parameters?.forEach((param) => { if (!expToInput.algorithm[param.name]) { // FIXME: the parameter should be added in a specific key entry (e.g. expToInput.algorithm.parameters') // Should be fixed inside the Datashield API diff --git a/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.spec.ts b/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.spec.ts index b6e9dfb0273359a141a01662711b353f360ad1bc..c23fdf2b58af9e2cd0f32f273846937bff113ad4 100644 --- a/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.spec.ts +++ b/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.spec.ts @@ -1,4 +1,5 @@ import { Experiment } from '../../../../models/experiment/experiment.model'; +import { TableResult } from '../../../../models/result/table-result.model'; import LogisticRegressionHandler from './logistic-regression.handler'; const data = { @@ -79,12 +80,23 @@ const createExperiment = (): Experiment => ({ describe('Logistic Regression Handler', () => { describe('Normal usage', () => { - it('should return the correct results', () => { + it('should return two TableResult', () => { const experiment = createExperiment(); const handler = new LogisticRegressionHandler(); handler.handle(experiment, data, []); - expect(experiment.results).toHaveLength(1); + expect(experiment.results).toHaveLength(2); + + const summary = experiment.results[0] as TableResult; + const coefs = experiment.results[1] as TableResult; + + expect(coefs.headers.length).toBeGreaterThan(0); + expect(coefs.data.length).toBeGreaterThan(0); + expect(coefs.data.some((row) => row.some((cell) => !cell))); + + expect(summary.headers.length).toBe(2); + expect(summary.data.length).toBeGreaterThan(0); + expect(summary.data.some((row) => !row[0] || !row[1])).toBeFalsy(); }); }); }); diff --git a/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.ts b/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.ts index bd0771deeaad1e497fe93fb5549fc98887aa5f84..4dc980f4f875394216696e83d91f14fb7ed123e9 100644 --- a/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.ts +++ b/api/src/engine/connectors/datashield/handlers/algorithms/logistic-regression.handler.ts @@ -9,7 +9,7 @@ const lookupDict = { 'z-value': 'Z value', 'p-value': 'P value', 'low0.95CI.LP': 'Low 95% CI', - 'high0.95CI': 'High 95% CI', + 'high0.95CI.LP': 'High 95% CI', P_OR: 'P OR', 'low0.95CI.P_OR': 'Low 95% CI P_OR', 'high0.95CI.P_OR': 'High 95% CI P OR', @@ -28,9 +28,9 @@ const properties = [ 'p-value', 'low0.95CI.LP', 'high0.95CI.LP', - 'P_OR', - 'low0.95CI.P_OR', - 'high0.95CI.P_OR', + // 'P_OR', // What is P_OR? Not defined in the ds' documentation + // 'low0.95CI.P_OR', + // 'high0.95CI.P_OR', ]; const summaryProps = ['iter', 'Nvalid', 'Ntotal', 'df']; @@ -38,7 +38,8 @@ const summaryProps = ['iter', 'Nvalid', 'Ntotal', 'df']; export default class LogisticRegressionHandler extends BaseHandler { canHandle(algorithm: string, data: any): boolean { return ( - algorithm.toLowerCase() === 'logistic-regression' && data['coefficients'] + algorithm.toLowerCase() === 'logistic-regression' && + !!data['coefficients'] ); } @@ -75,9 +76,7 @@ export default class LogisticRegressionHandler extends BaseHandler { const tableResult = this.getTableResult(data, vars); const summaryTable = this.getSummaryTable(data); - if (tableResult) experiment.results.push(tableResult); if (summaryTable) experiment.results.push(summaryTable); - - this.next?.handle(experiment, data, vars); + if (tableResult) experiment.results.push(tableResult); } } diff --git a/api/src/engine/connectors/datashield/handlers/index.ts b/api/src/engine/connectors/datashield/handlers/index.ts index 3275a8ea79c49c11a5cf32e8dc41da0f703b0115..9948a2fcf9d6e9a9c6db071210202530a7a418e1 100644 --- a/api/src/engine/connectors/datashield/handlers/index.ts +++ b/api/src/engine/connectors/datashield/handlers/index.ts @@ -2,12 +2,14 @@ import { Variable } from 'src/engine/models/variable.model'; import { Experiment } from '../../../../engine/models/experiment/experiment.model'; import ErrorAlgorithmHandler from './algorithms/error-algorithm.handler'; import LinearRegressionHandler from './algorithms/linear-regression.handler'; +import LogisticRegressionHandler from './algorithms/logistic-regression.handler'; import TerminalAlgorithmHandler from './algorithms/terminal-algorithm.handler'; const start = new ErrorAlgorithmHandler(); start .setNext(new LinearRegressionHandler()) + .setNext(new LogisticRegressionHandler()) .setNext(new TerminalAlgorithmHandler()); export default (