diff --git a/src/main/java/eu/hbp/mip/StartupTasks.java b/src/main/java/eu/hbp/mip/StartupTasks.java index 880603a9cae3f020a3968b586f29ff76593e8be5..a72e119529fb6fcd497b8ad90fc0b60d4dd7c14a 100644 --- a/src/main/java/eu/hbp/mip/StartupTasks.java +++ b/src/main/java/eu/hbp/mip/StartupTasks.java @@ -1,6 +1,12 @@ package eu.hbp.mip; +import ch.chuv.lren.woken.messages.datasets.Dataset; +import com.google.gson.Gson; import eu.hbp.mip.controllers.DatasetsApi; +import eu.hbp.mip.controllers.MiningApi; +import eu.hbp.mip.controllers.VariablesApi; +import eu.hbp.mip.model.Algorithm; +import eu.hbp.mip.model.MiningQuery; import eu.hbp.mip.model.Variable; import eu.hbp.mip.repositories.VariableRepository; import org.slf4j.Logger; @@ -10,10 +16,13 @@ import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; +import java.util.Collections; + @Component public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(StartupTasks.class); + private static final Gson gson = new Gson(); @Autowired private VariableRepository variableRepository; @@ -21,12 +30,18 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> @Autowired private DatasetsApi datasetsApi; + @Autowired + private VariablesApi variablesApi; + + @Autowired + private MiningApi miningApi; + @Override public void onApplicationEvent(ApplicationReadyEvent event) { // Pre-fill the local variable repository with the list of datasets, interpreted here as variables // (a bit like a categorical variable can be split into a set of variables (a.k.a one hot encoding in Data science) ) try { - for (ch.chuv.lren.woken.messages.datasets.Dataset dataset: datasetsApi.fetchDatasets()) { + for (Dataset dataset: datasetsApi.fetchDatasets()) { final String code = dataset.dataset().code(); Variable v = variableRepository.findOne(code); if (v == null) { @@ -38,6 +53,18 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> LOGGER.error("Cannot initialise the variable repository. Is the connection to Woken working?", e); } + /* + for (String variableJson: variablesApi.loadVariables()) { + String code = gson.fromJson(variableJson, Variable.class).getCode(); + MiningQuery histogram = new MiningQuery(); + histogram.setAlgorithm(new Algorithm("histogram", "histogram", false)); + histogram.setVariables(Collections.singletonList(new Variable(code))); + histogram.setCovariables(Collections.emptyList()); + histogram.setGrouping(Collections.emptyList()); + // TODO: need to get groupings from Woken + } + */ + LOGGER.info("MIP Portal backend is ready!"); } } diff --git a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java index 28d101a18b28b1dd980a202e72efa41a38c964ab..99d5b8497cd9fad5b2843b1621293e26d5f6dfe8 100644 --- a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java @@ -5,15 +5,17 @@ package eu.hbp.mip.controllers; +import ch.chuv.lren.woken.messages.datasets.Dataset; import ch.chuv.lren.woken.messages.datasets.DatasetsQuery; import ch.chuv.lren.woken.messages.datasets.DatasetsResponse; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import eu.hbp.mip.akka.WokenClientController; -import eu.hbp.mip.model.Dataset; +import eu.hbp.mip.model.DatasetDescription; import io.swagger.annotations.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import scala.Option; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -35,19 +39,22 @@ public class DatasetsApi extends WokenClientController { @ApiOperation(value = "Get dataset list", response = Dataset.class, responseContainer = "List") @RequestMapping(method = RequestMethod.GET) + @Cacheable(value = "datasets") public ResponseEntity getDatasets( ) { - LOGGER.info("Get dataset list"); + LOGGER.info("Get list of datasets"); try { - JsonArray datasets = new JsonArray(); - fetchDatasets().stream().map(d -> { - JsonObject jsObject = new JsonObject(); - jsObject.addProperty("code", d.dataset().code()); - jsObject.addProperty("label", d.label()); - datasets.add(jsObject); - return jsObject; - }); + List<DatasetDescription> datasets = new ArrayList<>(); + for (Dataset d: fetchDatasets()) { + DatasetDescription dataset = new DatasetDescription(); + LOGGER.info("Dataset {}", d); + dataset.setCode(d.dataset().code()); + dataset.setLabel(d.label()); + dataset.setDescription(d.description()); + dataset.setAnonymisationLevel(d.anonymisationLevel().toString()); + datasets.add(dataset); + } return ResponseEntity.ok(datasets); } catch (Exception e) { @@ -58,8 +65,8 @@ public class DatasetsApi extends WokenClientController { } - public Set<ch.chuv.lren.woken.messages.datasets.Dataset> fetchDatasets() throws Exception { + public List<ch.chuv.lren.woken.messages.datasets.Dataset> fetchDatasets() throws Exception { DatasetsResponse result = askWoken(new DatasetsQuery(Option.empty()), 30); - return scala.collection.JavaConversions.setAsJavaSet(result.datasets()); + return new ArrayList<>(scala.collection.JavaConversions.asJavaCollection(result.datasets())); } } diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java index 97d5943420ae4a47d6631e591079e21f80ffe358..b497da478cf525a7cf03934ba72bd4e1acfc4f3e 100644 --- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -44,7 +44,10 @@ public class MiningApi extends WokenClientController { public String queryUrl; @ApiOperation(value = "Run an algorithm", response = String.class) - @Cacheable(value = "mining", condition = "#query != null and #query.getAlgorithm().getCode() == 'histograms'", key = "#query.toString()", unless = "#result.getStatusCode().value()!=200") + @Cacheable(value = "mining", + condition = "#query != null and (#query.getAlgorithm().getCode() == 'histograms' or #query.getAlgorithm().getCode() == 'histograms')", + key = "#query.toString()", + unless = "#result.getStatusCode().value()!=200") @RequestMapping(method = RequestMethod.POST) public ResponseEntity runAlgorithm(@RequestBody eu.hbp.mip.model.MiningQuery query) { LOGGER.info("Run an algorithm"); diff --git a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java index c55cec4b05e2334b45df5e946ce96f598a8f1672..1c284f1bbb406e3907ee28888d88aa250757ad5d 100644 --- a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java @@ -166,7 +166,7 @@ public class VariablesApi { } - private List<String> loadVariables() { + public List<String> loadVariables() { String sqlQuery = String.format( "SELECT * FROM meta_variables where upper(target_table)='%s'", featuresMainTable.toUpperCase()); SqlRowSet data = metaJdbcTemplate.queryForRowSet(sqlQuery); diff --git a/src/main/java/eu/hbp/mip/model/DatasetDescription.java b/src/main/java/eu/hbp/mip/model/DatasetDescription.java new file mode 100644 index 0000000000000000000000000000000000000000..c77c50aeab3a4256ecadf78aa2f25f89a05a0b92 --- /dev/null +++ b/src/main/java/eu/hbp/mip/model/DatasetDescription.java @@ -0,0 +1,46 @@ +package eu.hbp.mip.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; + +@ApiModel +@JsonInclude(JsonInclude.Include.NON_NULL) +public class DatasetDescription { + + private String code; + private String label; + private String description; + private String anonymisationLevel; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getAnonymisationLevel() { + return anonymisationLevel; + } + + public void setAnonymisationLevel(String anonymisationLevel) { + this.anonymisationLevel = anonymisationLevel; + } +}