diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java index 5b784fba15f1d93de20c5199112f9e34834070e7..6245ed42a849c38b0c223439d52af64a38ab37eb 100644 --- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -3,8 +3,10 @@ package eu.hbp.mip.controllers; import com.google.gson.Gson; import eu.hbp.mip.akka.WokenClientController; import eu.hbp.mip.configuration.SecurityConfiguration; +import eu.hbp.mip.model.ExaremeQuery; import eu.hbp.mip.model.Mining; import eu.hbp.mip.model.User; +import eu.hbp.mip.utils.HTTPUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; @@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.sql.Date; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -43,6 +46,39 @@ public class MiningApi extends WokenClientController { LOGGER.info("Run an algorithm"); User user = securityConfiguration.getUser(); + if (isExaremeAlgo(query)) { + LOGGER.info("isExaremeAlgo"); + + String algorithm = query.getAlgorithm().getCode(); + String exaremeQuery = ExaremeQuery.query(query); + String url = ExaremeQuery.queryUrl + "/" + algorithm; + + // TODO: Threaded call + try { + StringBuilder results = new StringBuilder(); + int code = HTTPUtil.sendPost(url, exaremeQuery, results); + LOGGER.info("Results " + results); + + if (code >= 500) { + LOGGER.error("Cannot receive algorithm result from exareme"); + return ResponseEntity.status(code).build(); + } + + Mining mining = new Mining( + "exaremeJobId", + "federation", + algorithm, + "application/json", + new java.util.Date(), + results.toString()); + + return ResponseEntity.ok(gson.toJson(mining.jsonify())); + } catch (IOException e) { + LOGGER.error("Cannot receive algorithm result from exareme" + e.getMessage(), e); + return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build(); + } + } + return askWokenQuery(query.prepareQuery(user.getUsername()), 120, result -> { if (result.error().nonEmpty()) { @@ -62,4 +98,9 @@ public class MiningApi extends WokenClientController { }); } + private static boolean isExaremeAlgo(eu.hbp.mip.model.MiningQuery query) { + return query.getAlgorithm().getCode().length() > 0 && "WP_".equals( + query.getAlgorithm().getCode().substring(0, 3)); + } + } diff --git a/src/main/java/eu/hbp/mip/model/ExaremeQuery.java b/src/main/java/eu/hbp/mip/model/ExaremeQuery.java new file mode 100644 index 0000000000000000000000000000000000000000..0e930ecbf8617794ade4bea5ab9ca38d06bc3d9f --- /dev/null +++ b/src/main/java/eu/hbp/mip/model/ExaremeQuery.java @@ -0,0 +1,76 @@ +package eu.hbp.mip.model; + +import com.google.gson.Gson; +import org.springframework.beans.factory.annotation.Value; + +import java.util.LinkedList; +import java.util.List; + + +public class ExaremeQuery { + + @Value("#{'${services.query.miningExaremeUrl:http://hbps2.chuv.ch:9090/mining/query}'}") + public static String queryUrl; + + private static final Gson gson = new Gson(); + + public static String query(MiningQuery query) { + return query(query.getVariables(), query.getCovariables(), query.getGrouping(), query.getDatasets()); + } + + public static String query(Model model) { + Query query = model.getQuery(); + return query(query.getVariables(), query.getCovariables(), query.getGrouping(), null); + } + + private static String query(List<Variable> variables, List<Variable> covariables, List<Variable> groupings, List<Variable> datasets) { + List<ExaremeQueryElement> queryElements = new LinkedList<>(); + for (Variable var : variables) + { + ExaremeQueryElement el = new ExaremeQueryElement(); + el.setName("variable"); + el.setDesc(""); + el.setValue(var.getCode()); + queryElements.add(el); + } + for (Variable var : covariables) + { + ExaremeQueryElement el = new ExaremeQueryElement(); + el.setName("covariables"); + el.setDesc(""); + el.setValue(var.getCode()); + queryElements.add(el); + } + for (Variable var : groupings) + { + ExaremeQueryElement el = new ExaremeQueryElement(); + el.setName("groupings"); + el.setDesc(""); + el.setValue(var.getCode()); + queryElements.add(el); + } + for (Variable var: datasets) + { + ExaremeQueryElement el = new ExaremeQueryElement(); + el.setName("dataset"); + el.setDesc(""); + el.setValue(var.getCode()); + queryElements.add(el); + } + + ExaremeQueryElement tableEl = new ExaremeQueryElement(); + tableEl.setName("showtable"); + tableEl.setDesc(""); + tableEl.setValue("TotalResults"); + queryElements.add(tableEl); + + ExaremeQueryElement formatEl = new ExaremeQueryElement(); + formatEl.setName("format"); + formatEl.setDesc(""); + formatEl.setValue("True"); + queryElements.add(formatEl); + + return gson.toJson(queryElements); + } + +} diff --git a/src/main/java/eu/hbp/mip/model/MiningQuery.java b/src/main/java/eu/hbp/mip/model/MiningQuery.java index 1b03306c3c048901c411309cdb3c59f15fe66d60..0b0c9a76fa4ab979267777bde4305974e05a3b70 100644 --- a/src/main/java/eu/hbp/mip/model/MiningQuery.java +++ b/src/main/java/eu/hbp/mip/model/MiningQuery.java @@ -21,6 +21,7 @@ public class MiningQuery { private List<Variable> variables; private List<Variable> covariables; private List<Variable> grouping; + private List<Variable> datasets; private String filters; private Algorithm algorithm; @@ -59,6 +60,14 @@ public class MiningQuery { this.grouping = grouping; } + public List<Variable> getDatasets() { return datasets; } + + public void setDataset(List<Variable> datasets) { + this.datasets = datasets; + } + + public void addDataset(Variable variable) { this.datasets.add(variable); } + public void addGrouping(Variable variable) { this.grouping.add(variable); } public String getFilters() {