From 7acd1829526fa75fc722192a9757d1306a204a8e Mon Sep 17 00:00:00 2001 From: Mirco Nasuti <mirco.nasuti@chuv.ch> Date: Fri, 6 Jan 2017 15:01:31 +0100 Subject: [PATCH] add mining API --- .../eu/hbp/mip/controllers/MiningApi.java | 66 ++++++++++++++++ .../java/eu/hbp/mip/model/Experiment.java | 34 +++----- .../java/eu/hbp/mip/model/MiningQuery.java | 79 +++++++++++++++++++ .../java/eu/hbp/mip/utils/TypesConvert.java | 34 ++++++++ 4 files changed, 189 insertions(+), 24 deletions(-) create mode 100644 src/main/java/eu/hbp/mip/controllers/MiningApi.java create mode 100644 src/main/java/eu/hbp/mip/model/MiningQuery.java create mode 100644 src/main/java/eu/hbp/mip/utils/TypesConvert.java diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java new file mode 100644 index 000000000..0f6287a8a --- /dev/null +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -0,0 +1,66 @@ +package eu.hbp.mip.controllers; + +import akka.actor.ActorSelection; +import akka.actor.ActorSystem; +import akka.pattern.Patterns; +import akka.util.Timeout; +import eu.hbp.mip.messages.external.QueryResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import scala.concurrent.Await; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; + +import java.io.IOException; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * Created by mirco on 06.01.17. + */ +@RestController +@RequestMapping(value = "/mining", produces = {APPLICATION_JSON_VALUE}) +@Api(value = "/mining", description = "the mining API") +public class MiningApi { + + private static final Logger LOGGER = Logger.getLogger(MiningApi.class); + + @Autowired + public ActorSystem actorSystem; + + @Autowired + public String wokenRefPath; + + + @ApiOperation(value = "Run an algorithm", response = String.class) + @Cacheable("mining") + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity runAlgorithm(@RequestBody eu.hbp.mip.model.MiningQuery query) throws IOException { + LOGGER.info("Run an algorithm"); + + LOGGER.info("Akka is trying to reach remote " + wokenRefPath); + ActorSelection wokenActor = actorSystem.actorSelection(wokenRefPath); + + Timeout timeout = new Timeout(Duration.create(5, "seconds")); + Future<Object> future = Patterns.ask(wokenActor, query.prepareQuery(), timeout); + QueryResult result; + try { + result = (QueryResult) Await.result(future, timeout.duration()); + } catch (Exception e) { + LOGGER.error("Cannot receive methods list from woken !"); + LOGGER.trace(e.getMessage()); + return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build(); + } + + return ResponseEntity.ok(result.data().get()); + } +} diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java index f249fddba..ba05e3e00 100644 --- a/src/main/java/eu/hbp/mip/model/Experiment.java +++ b/src/main/java/eu/hbp/mip/model/Experiment.java @@ -1,15 +1,18 @@ package eu.hbp.mip.model; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import eu.hbp.mip.messages.external.Algorithm; import eu.hbp.mip.messages.external.ExperimentQuery; import eu.hbp.mip.messages.external.*; +import eu.hbp.mip.utils.TypesConvert; import org.hibernate.annotations.Cascade; import scala.collection.JavaConverters; import scala.collection.Seq; -import scala.collection.immutable.HashMap; import javax.persistence.*; import java.lang.reflect.Type; @@ -94,7 +97,7 @@ public class Experiment { List<eu.hbp.mip.model.Algorithm> algos = new Gson().fromJson(this.algorithms, algoList); for (eu.hbp.mip.model.Algorithm a: algos ) { - algorithms.add(new Algorithm(a.getCode(), a.getName(), algoParamsToHashMap(a.getParameters()))); + algorithms.add(new Algorithm(a.getCode(), a.getName(), TypesConvert.algoParamsToHashMap(a.getParameters()))); } List<Validation> validations = new LinkedList<>(); @@ -102,15 +105,15 @@ public class Experiment { List<eu.hbp.mip.model.ExperimentValidator> valids = new Gson().fromJson(this.validations, validList); for (ExperimentValidator v: valids ) { - validations.add(new Validation(v.getCode(), v.getName(), algoParamsToHashMap(v.getParameters()))); + validations.add(new Validation(v.getCode(), v.getName(), TypesConvert.algoParamsToHashMap(v.getParameters()))); } Seq<VariableId> variablesSeq = JavaConverters.asScalaIteratorConverter( - variablesToVariableIds(model.getQuery().getVariables()).iterator()).asScala().toSeq().toList(); + TypesConvert.variablesToVariableIds(model.getQuery().getVariables()).iterator()).asScala().toSeq().toList(); Seq<VariableId> covariablesSeq = JavaConverters.asScalaIteratorConverter( - variablesToVariableIds(model.getQuery().getCovariables()).iterator()).asScala().toSeq().toList(); + TypesConvert.variablesToVariableIds(model.getQuery().getCovariables()).iterator()).asScala().toSeq().toList(); Seq<VariableId> groupingSeq = JavaConverters.asScalaIteratorConverter( - variablesToVariableIds(model.getQuery().getGrouping()).iterator()).asScala().toSeq().toList(); + TypesConvert.variablesToVariableIds(model.getQuery().getGrouping()).iterator()).asScala().toSeq().toList(); Seq<Filter> filtersSeq = JavaConverters.asScalaIteratorConverter( new LinkedList<Filter>().iterator()).asScala().toSeq().toList(); Seq<Algorithm> algorithmsSeq = JavaConverters.asScalaIteratorConverter( @@ -121,23 +124,6 @@ public class Experiment { return new ExperimentQuery(variablesSeq, covariablesSeq, groupingSeq, filtersSeq, algorithmsSeq, validationsSeq); } - private HashMap<String, String> algoParamsToHashMap(List<AlgorithmParam> aps) { - HashMap<String, String> params = new HashMap<>(); - for (AlgorithmParam ap: aps - ) { - params = params.updated(ap.getCode(), ap.getValue()); - } - return params; - } - - private List<VariableId> variablesToVariableIds(List<Variable> vars) { - List<VariableId> varIds = new LinkedList<>(); - for (Variable v: vars - ) { - varIds.add(new VariableId(v.getCode())); - } - return varIds; - } public String computeExaremeQuery() { List<ExaremeQueryElement> queryElements = new LinkedList<>(); diff --git a/src/main/java/eu/hbp/mip/model/MiningQuery.java b/src/main/java/eu/hbp/mip/model/MiningQuery.java new file mode 100644 index 000000000..7cd9f7831 --- /dev/null +++ b/src/main/java/eu/hbp/mip/model/MiningQuery.java @@ -0,0 +1,79 @@ +package eu.hbp.mip.model; + +import eu.hbp.mip.messages.external.Filter; +import eu.hbp.mip.messages.external.VariableId; +import eu.hbp.mip.utils.TypesConvert; +import scala.collection.JavaConverters; +import scala.collection.Seq; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by mirco on 06.01.17. + */ +public class MiningQuery { + + private List<Variable> variables; + private List<Variable> covariables; + private List<Variable> grouping; + private List<Filter> filters; + private Algorithm algorithm; + + public List<Variable> getVariables() { + return variables; + } + + public void setVariables(List<Variable> variables) { + this.variables = variables; + } + + public List<Variable> getCovariables() { + return covariables; + } + + public void setCovariables(List<Variable> covariables) { + this.covariables = covariables; + } + + public List<Variable> getGrouping() { + return grouping; + } + + public void setGrouping(List<Variable> grouping) { + this.grouping = grouping; + } + + public List<Filter> getFilters() { + return filters; + } + + public void setFilters(List<Filter> filters) { + this.filters = filters; + } + + public Algorithm getAlgorithm() { + return algorithm; + } + + public void setAlgorithm(Algorithm algorithm) { + this.algorithm = algorithm; + } + + public eu.hbp.mip.messages.external.MiningQuery prepareQuery() { + + eu.hbp.mip.messages.external.Algorithm scalaAlgorithm = new eu.hbp.mip.messages.external.Algorithm( + algorithm.getCode(), algorithm.getName(), TypesConvert.algoParamsToHashMap(algorithm.getParameters())); + + Seq<VariableId> variablesSeq = JavaConverters.asScalaIteratorConverter( + TypesConvert.variablesToVariableIds(variables).iterator()).asScala().toSeq().toList(); + Seq<VariableId> covariablesSeq = JavaConverters.asScalaIteratorConverter( + TypesConvert.variablesToVariableIds(covariables).iterator()).asScala().toSeq().toList(); + Seq<VariableId> groupingSeq = JavaConverters.asScalaIteratorConverter( + TypesConvert.variablesToVariableIds(grouping).iterator()).asScala().toSeq().toList(); + Seq<Filter> filtersSeq = JavaConverters.asScalaIteratorConverter( + new LinkedList<Filter>().iterator()).asScala().toSeq().toList(); + + return new eu.hbp.mip.messages.external.MiningQuery(variablesSeq, covariablesSeq,groupingSeq,filtersSeq, scalaAlgorithm); + } +} diff --git a/src/main/java/eu/hbp/mip/utils/TypesConvert.java b/src/main/java/eu/hbp/mip/utils/TypesConvert.java new file mode 100644 index 000000000..a419bd043 --- /dev/null +++ b/src/main/java/eu/hbp/mip/utils/TypesConvert.java @@ -0,0 +1,34 @@ +package eu.hbp.mip.utils; + +import eu.hbp.mip.messages.external.VariableId; +import eu.hbp.mip.model.AlgorithmParam; +import eu.hbp.mip.model.Variable; +import scala.collection.immutable.HashMap; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by mirco on 06.01.17. + */ +public class TypesConvert { + + public static List<VariableId> variablesToVariableIds(List<Variable> vars) { + List<VariableId> varIds = new LinkedList<>(); + for (Variable v: vars + ) { + varIds.add(new VariableId(v.getCode())); + } + return varIds; + } + + public static HashMap<String, String> algoParamsToHashMap(List<AlgorithmParam> aps) { + HashMap<String, String> params = new HashMap<>(); + for (AlgorithmParam ap: aps + ) { + params = params.updated(ap.getCode(), ap.getValue()); + } + return params; + } + +} -- GitLab