diff --git a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java index 68eb313401323f94d237374bf5aacbbfb4971a8f..6385d89d5e1309cda7ea8b28aa5ab0b33f19c2f6 100644 --- a/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java +++ b/src/main/java/eu/hbp/mip/controllers/AlgorithmsAPI.java @@ -78,7 +78,11 @@ public class AlgorithmsAPI { LinkedList<AlgorithmDTO> algorithms = new LinkedList<>(); if (exaremeAlgorithms != null) { - algorithms.addAll(exaremeAlgorithms); + //algorithms.addAll(exaremeAlgorithms); + exaremeAlgorithms.forEach(algorithmDTO -> { + if(algorithmDTO.getName().equals("LOGISTIC_REGRESSION")) + algorithms.add(algorithmDTO); + }); } else { logger.LogUserAction("Getting exareme algorithms failed and returned null"); } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java index 216140ba22f24332a862605404e94b84f5cf113c..6d70c021567ddf258f2dc4e716cb030f27949518 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/AlgorithmDTO.java @@ -98,7 +98,7 @@ public class AlgorithmDTO { @Getter @Setter - public static class Filters + public static class Filter { @SerializedName("condition") private String condition; @@ -109,7 +109,7 @@ public class AlgorithmDTO { @SerializedName("valid") private boolean valid; - public Filters(String condition, List<Object> rules, boolean valid) { + public Filter(String condition, List<Object> rules, boolean valid) { this.condition = condition; this.rules = rules; this.valid = valid; @@ -121,36 +121,42 @@ public class AlgorithmDTO { { MIPEngineBody mipEngineBody = new MIPEngineBody(); MIPEngineBody.InputData inputData = new MIPEngineBody.InputData(); + Hashtable<String, Object> mipEngineParameters = new Hashtable<>(); List<Object> rules = new ArrayList<>(); this.parameters.forEach(parameter -> { + if(parameter.getName().equals("x")) { + System.out.println("x"); List<String> x = Arrays.asList(parameter.getValue().split(",")); x.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); inputData.setX(x); } - if(parameter.getName().equals("y")) { + else if(parameter.getName().equals("y")) { List<String> y = Arrays.asList(parameter.getValue().split(",")); y.forEach(column -> rules.add(new Rule(column, parameter.getColumnValuesSQLType(), "is_not_null", null))); inputData.setY(y); } - if(parameter.getName().equals("dataset")){ + else if(parameter.getName().equals("dataset")){ List<String> datasets = Arrays.asList(parameter.getValue().split(",")); rules.add(new Rule("dataset","string", "in", datasets)); inputData.setDatasets(datasets); } - String pathology; - if(parameter.getName().equals("pathology")) + else if(parameter.getName().equals("pathology")) inputData.setPathology(parameter.getValue()); - if(parameter.getName().equals("filter")){ + else if(parameter.getName().equals("filter")){ if (parameter.getValue() != "") - rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filters.class)); + rules.add(JsonConverters.convertJsonStringToObject(parameter.getValue(), Filter.class)); + } + else{ + mipEngineParameters.put(parameter.getName(), Arrays.asList(parameter.getValue().split(","))); } }); - Filters filters = new Filters("AND", rules, true); - inputData.setFilters(filters); + Filter filter = new Filter("AND", rules, true); + inputData.setFilters(filter); mipEngineBody.setInputdata(inputData); + mipEngineBody.setParameters(mipEngineParameters); return mipEngineBody; } } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java index f253bab6d76e156a34a59947108bb0d8866b8662..d391492d7615e6ef5892fa78c5a83227207d4afb 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineAlgorithmDTO.java @@ -1,6 +1,7 @@ package eu.hbp.mip.models.DTOs; import com.google.gson.annotations.SerializedName; +import eu.hbp.mip.utils.JsonConverters; import lombok.Getter; import lombok.Setter; @@ -26,7 +27,7 @@ public class MIPEngineAlgorithmDTO { private String type; @SerializedName("parameters") - private InputDataParamDTO parameters; + private Hashtable<String, ParameterDTO> parameters; @SerializedName("crossvalidation") private String crossvalidation; @@ -34,6 +35,54 @@ public class MIPEngineAlgorithmDTO { @SerializedName("inputdata") private Hashtable<String, InputDataParamDTO> inputdata; + @Getter + @Setter + public static class ParameterDTO { + + @SerializedName("label") + private String label; + + @SerializedName("notblank") + private String notblank; + + @SerializedName("multiple") + private String multiple; + + @SerializedName("types") + private String type; + + @SerializedName("desc") + private String desc; + + @SerializedName("min") + private String min; + + @SerializedName("max") + private String max; + + @SerializedName("default_value") + private String default_value; + + @SerializedName("enums") + private List<String> enums; + + public AlgorithmDTO.AlgorithmParamDTO convertToAlgorithmParamDTO(String name) throws Exception { + AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); + algorithmParamDTO.setName(name); + algorithmParamDTO.setDesc(this.desc); + algorithmParamDTO.setValueType(this.type); + algorithmParamDTO.setType("other"); + algorithmParamDTO.setDefaultValue(this.default_value); + algorithmParamDTO.setValueNotBlank(this.notblank); + algorithmParamDTO.setLabel(this.label); + algorithmParamDTO.setValueEnumerations(this.enums); + algorithmParamDTO.setValueMultiple(this.multiple); + algorithmParamDTO.setValueMin(this.min); + algorithmParamDTO.setValueMax(this.max); + return algorithmParamDTO; + } + } + @Getter @Setter public static class InputDataParamDTO { @@ -63,16 +112,13 @@ public class MIPEngineAlgorithmDTO { AlgorithmDTO.AlgorithmParamDTO algorithmParamDTO = new AlgorithmDTO.AlgorithmParamDTO(); algorithmParamDTO.setName(name); algorithmParamDTO.setDesc(this.desc); - if(name.equals("datasets") || name.equals("filters") || name.equals("pathology")){ - algorithmParamDTO.setValueType(this.types.get(0)); - if(name.equals("filters")){ - algorithmParamDTO.setName("filter"); - algorithmParamDTO.setType("filter"); - } + + if(name.equals("datasets") || name.equals("filter") || name.equals("pathology")){ if(name.equals("datasets")){ algorithmParamDTO.setName("dataset"); - algorithmParamDTO.setType("dataset"); } + algorithmParamDTO.setValueType(this.types.get(0)); + algorithmParamDTO.setType(algorithmParamDTO.getName()); } else{ algorithmParamDTO.setType("column"); @@ -84,7 +130,8 @@ public class MIPEngineAlgorithmDTO { algorithmParamDTO.setValueMultiple(this.multiple); String[] hidden = {"x","y","dataset", "filter","pathology","centers","formula"}; algorithmParamDTO.setLabel(Arrays.asList(hidden).contains(algorithmParamDTO.getName()) ? algorithmParamDTO.getName():this.label); - + System.out.println("-------------------------------------------------------->"); + System.out.println(JsonConverters.convertObjectToJsonString(algorithmParamDTO)); return algorithmParamDTO; } private String getColumnValuesIsCategorical(List<String> stattypes) throws Exception { @@ -120,6 +167,14 @@ public class MIPEngineAlgorithmDTO { e.printStackTrace(); } }); + this.parameters.forEach((name, parameterDTO) -> { + try { + AlgorithmDTO.AlgorithmParamDTO parameter = parameterDTO.convertToAlgorithmParamDTO(name); + parameters.add(parameter); + } catch (Exception e) { + e.printStackTrace(); + } + }); algorithmDTO.setParameters(parameters); return algorithmDTO; } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java index b8b2f957a166467890296f35baa5e55b89f2b184..1572eb7daed817717bfff4c03d1a8524e2e498eb 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/MIPEngineBody.java @@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; +import java.util.Hashtable; import java.util.List; @Getter @@ -12,7 +13,7 @@ public class MIPEngineBody { @SerializedName("inputdata") private InputData inputdata; @SerializedName("parameters") - private Object parameters; + private Hashtable<String, Object> parameters; @Getter @Setter @@ -22,7 +23,7 @@ public class MIPEngineBody { @SerializedName("datasets") private List<String> datasets; @SerializedName("filters") - private AlgorithmDTO.Filters filters; + private AlgorithmDTO.Filter filters; @SerializedName("x") private List<String> x; @SerializedName("y") diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index bc7f4dd11343e26bb888c28e5d987ec3916632ac..a48beb3aa9a975d71ad3c1bbeb0dad03cc191ebc 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -27,6 +27,9 @@ import eu.hbp.mip.utils.Exceptions.*; import eu.hbp.mip.utils.HTTPUtil; import eu.hbp.mip.utils.JsonConverters; import eu.hbp.mip.utils.Logger; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.springframework.beans.factory.annotation.Value; @@ -386,7 +389,7 @@ public class ExperimentService { .append("\n")); logger.LogUserAction("Executing " + algorithmName + parametersLogMessage); } - + /** * The getDatasetFromExperimentParameters will retrieve the dataset from the experiment parameters * @@ -508,19 +511,9 @@ public class ExperimentService { } private List<Object> formattingMIPEngienResult(String result) { - List<List<String>> resultJson = JsonConverters.convertJsonStringToObject(result, new ArrayList<ArrayList<String>>().getClass()); - String schema_json = "{\"fields\":[{\"type\":\"string\",\"name\":\"node\"},{\"type\":\"number\",\"name\":\"row-id\"},{\"type\":\"number\",\"name\":\"alzheimerbroadcategory_bin\"}]}"; - LinkedTreeMap<String,List<Object>> schema = JsonConverters.convertJsonStringToObject(schema_json, new LinkedTreeMap<String,ArrayList<Object>>().getClass()); - - - LinkedTreeMap<String,Object> data_data = new LinkedTreeMap<>(); - data_data.put("data", resultJson); - data_data.put("profile", "tabular-data-resource"); - data_data.put("schema", schema); - data_data.put("name","Logistic Regression Stuff"); - + MIPVisualization mipVisualization = JsonConverters.convertJsonStringToObject(result, MIPVisualization.class); LinkedTreeMap<String,Object> data = new LinkedTreeMap<>(); - data.put("data", data_data); + data.put("data", mipVisualization.convertToVisualization()); data.put("type", "application/vnd.dataresource+json"); List<Object> finalObject = new ArrayList<>(); finalObject.add(data); @@ -601,6 +594,7 @@ public class ExperimentService { } catch (Exception e) { throw new InternalServerError("Error occurred : " + e.getMessage()); } + System.out.println(results); // Results are stored in the experiment object List<Object> resultDTOS = formattingMIPEngienResult(String.valueOf(results)); @@ -1045,6 +1039,8 @@ public class ExperimentService { return returnError; } + @Getter + @Setter static class ExperimentResult { private final int code; private final List<Object> results; @@ -1053,13 +1049,43 @@ public class ExperimentService { this.code = code; this.results = results; } + } - public int getCode() { - return code; + @Getter + @Setter + @AllArgsConstructor + static class Visualization { + private final String title; + private final String profile; + private final List<Field> columns; + private final List<List<Object>> data; + } + + @Getter + @Setter + @AllArgsConstructor + static class MIPVisualization { + private final String title; + private final List<String> columns; + private final List<List<Object>> data; + + public Visualization convertToVisualization() { + ArrayList<Field> fields = new ArrayList<>(); + this.columns.forEach(header_name -> fields.add(new Field(header_name, "number"))); + return new Visualization(this.title, "tabular-data-resource", fields, this.data); } - public List<Object> getResults() { - return results; + } + + @Getter + @Setter + static class Field { + private final String name; + private final String type; + + Field(String name, String type) { + this.name = name; + this.type = type; } } }