diff --git a/pom.xml b/pom.xml index 51120dec5649e3dee5ec64f7514c6e2c26111f0f..10f3ce7b4dfcc7dbc7fefc4e37408bf2bad01b81 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ <spring-data-jpa.version>1.10.11.RELEASE</spring-data-jpa.version> <spring-boot-starter-actuator.version>1.4.7.RELEASE</spring-boot-starter-actuator.version> <aspectjweaver.version>1.8.9</aspectjweaver.version> - <woken-messages.version>2.2.4</woken-messages.version> + <woken-messages.version>2.3.0</woken-messages.version> <javax-inject.version>1</javax-inject.version> <akka.version>2.5.9</akka.version> <spring-context.version>4.3.4.RELEASE</spring-context.version> @@ -366,7 +366,7 @@ <version>${scala.release.version}</version> </dependency> </defineCompiler> - <definePluginList></definePluginList> + <definePluginList/> </configuration> <executions> <execution> diff --git a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java b/src/main/java/eu/hbp/mip/akka/ExperimentActor.java index bd597509931962be9e68063441231268bc401855..3d184d2d1be1f930cca35433370b932aa4714631 100644 --- a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java +++ b/src/main/java/eu/hbp/mip/akka/ExperimentActor.java @@ -1,7 +1,7 @@ package eu.hbp.mip.akka; import akka.actor.AbstractActor; -import eu.hbp.mip.woken.messages.external.QueryResult; +import eu.hbp.mip.woken.messages.query.QueryResult; import eu.hbp.mip.model.Experiment; import eu.hbp.mip.repositories.ExperimentRepository; import org.apache.log4j.Logger; diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index 8f21186185f244ad20ac067840aad94281284fa7..3f4c865ab47b92c3936531058e03588adadfdf71 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -19,8 +19,8 @@ import eu.hbp.mip.repositories.ExperimentRepository; import eu.hbp.mip.repositories.ModelRepository; import eu.hbp.mip.utils.HTTPUtil; import eu.hbp.mip.utils.JSONUtil; -import eu.hbp.mip.woken.messages.external.MethodsQuery$; -import eu.hbp.mip.woken.messages.external.MethodsResponse; +import eu.hbp.mip.woken.messages.query.MethodsQuery$; +import eu.hbp.mip.woken.messages.query.MethodsResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -82,10 +82,10 @@ public class ExperimentApi { private ExperimentRepository experimentRepository; @Autowired - public ActorSystem actorSystem; + private ActorSystem actorSystem; @Autowired - public String wokenRefPath; + private String wokenRefPath; @ApiOperation(value = "Send a request to the workflow to run an experiment", response = Experiment.class) @@ -303,8 +303,10 @@ public class ExperimentApi { } private void sendExperiment(Experiment experiment) throws MalformedURLException { + User user = securityConfiguration.getUser(); + // this runs in the background. For future optimization: use a thread pool - final eu.hbp.mip.woken.messages.external.ExperimentQuery experimentQuery = experiment.prepareQuery(); + final eu.hbp.mip.woken.messages.query.ExperimentQuery experimentQuery = experiment.prepareQuery(user.getUsername()); LOGGER.info("Akka is trying to reach remote " + wokenRefPath); ActorSelection wokenActor = actorSystem.actorSelection(wokenRefPath); diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java index 97535eceb5232e25ba2bdb7e2753b68cf7d8ccec..da2bee0478d467e395198afab130aee52c78c20c 100644 --- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -6,7 +6,7 @@ import akka.pattern.Patterns; import akka.util.Timeout; import com.google.gson.Gson; import eu.hbp.mip.model.Mining; -import eu.hbp.mip.woken.messages.external.QueryResult; +import eu.hbp.mip.woken.messages.query.QueryResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.log4j.Logger; diff --git a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java index e3eeadaf38b5285a1b10bbc41eca64da1fc33cb9..96c6389cb9fb52355aea7227b58efb7c13c4a719 100644 --- a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java @@ -12,6 +12,7 @@ import com.google.gson.JsonObject; import eu.hbp.mip.configuration.SecurityConfiguration; import eu.hbp.mip.model.Algorithm; import eu.hbp.mip.model.MiningQuery; +import eu.hbp.mip.model.User; import eu.hbp.mip.model.Variable; import io.swagger.annotations.*; import org.apache.log4j.Logger; @@ -151,13 +152,15 @@ public class VariablesApi { ) { LOGGER.info("Get query for histograms"); + User user = securityConfiguration.getUser(); + String sqlQuery = String.format( "SELECT histogram_groupings FROM meta_variables where upper(target_table)='%s'", featuresMainTable.toUpperCase()); SqlRowSet data = metaJdbcTemplate.queryForRowSet(sqlQuery); data.next(); String histogramGroupings = data.getString("histogram_groupings"); - MiningQuery query = new MiningQuery(); + MiningQuery query = new MiningQuery(user.getUsername()); query.addVariable(new Variable(code)); List<String> newGroups = Arrays.asList(histogramGroupings.split(",")); List<Variable> groupings = query.getGrouping(); diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java index 2410eecd0a0eb75b673ff74fde02a4816561ca1f..c84c21b1a6983549e2a13c13b8edba5b4001bf67 100644 --- a/src/main/java/eu/hbp/mip/model/Experiment.java +++ b/src/main/java/eu/hbp/mip/model/Experiment.java @@ -1,15 +1,21 @@ package eu.hbp.mip.model; +import ch.chuv.lren.mip.portal.WokenConversions; 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.woken.messages.external.ExperimentQuery; -import eu.hbp.mip.woken.messages.external.*; +import eu.hbp.mip.woken.messages.datasets.DatasetId; +import eu.hbp.mip.woken.messages.query.ExperimentQuery; +import eu.hbp.mip.woken.messages.query.*; import eu.hbp.mip.utils.TypesConvert; +import eu.hbp.mip.woken.messages.query.filters.FilterRule; +import eu.hbp.mip.woken.messages.variables.FeatureIdentifier; import org.hibernate.annotations.Cascade; +import scala.None$; +import scala.Option; import scala.collection.JavaConversions; import javax.persistence.*; @@ -104,19 +110,28 @@ public class Experiment { validations.add(new ValidationSpec(v.getCode(), TypesConvert.algoParamsToScala(v.getParameters()))); } - scala.collection.immutable.List<VariableId> variablesSeq = - TypesConvert.variablesToVariableIds(model.getQuery().getVariables()); - scala.collection.immutable.List<VariableId> covariablesSeq = - TypesConvert.variablesToVariableIds(model.getQuery().getCovariables()); - scala.collection.immutable.List<VariableId> groupingSeq = - TypesConvert.variablesToVariableIds(model.getQuery().getGrouping()); + scala.collection.immutable.List<FeatureIdentifier> variablesSeq = + TypesConvert.variablesToIdentifiers(model.getQuery().getVariables()); + scala.collection.immutable.List<FeatureIdentifier> covariablesSeq = + TypesConvert.variablesToIdentifiers(model.getQuery().getCovariables()); + scala.collection.immutable.List<FeatureIdentifier> groupingSeq = + TypesConvert.variablesToIdentifiers(model.getQuery().getGrouping()); scala.collection.immutable.List<AlgorithmSpec> algorithmsSeq = JavaConversions.asScalaBuffer(algorithms).toList(); scala.collection.immutable.List<ValidationSpec> validationsSeq = JavaConversions.asScalaBuffer(validations).toList(); - String filters = model.getQuery().getFilters(); + // TODO - set values + WokenConversions conv = new WokenConversions(); + scala.collection.immutable.Set<DatasetId> trainingDatasets = conv.toDatasets(""); + scala.collection.immutable.Set<DatasetId> testingDatasets = conv.toDatasets(""); + scala.collection.immutable.Set<DatasetId> validationDatasets = conv.toDatasets(""); + + String filtersJson = model.getQuery().getFilters(); + Option<FilterRule> filters = conv.toFilterRule(filtersJson); UserId userId = new UserId(user); - return new ExperimentQuery(user, variablesSeq, covariablesSeq, groupingSeq, filters, algorithmsSeq, validationsSeq); + return new ExperimentQuery(userId, variablesSeq, covariablesSeq, groupingSeq, filters, + trainingDatasets, testingDatasets, algorithmsSeq, validationDatasets, + validationsSeq, None$.empty()); } diff --git a/src/main/java/eu/hbp/mip/model/MiningQuery.java b/src/main/java/eu/hbp/mip/model/MiningQuery.java index 2ef84a8eaa463c4959d4659b27bb615abb026f11..09bd4a576449a8397d5b7fb81a98801d4d2e6725 100644 --- a/src/main/java/eu/hbp/mip/model/MiningQuery.java +++ b/src/main/java/eu/hbp/mip/model/MiningQuery.java @@ -1,9 +1,13 @@ package eu.hbp.mip.model; +import ch.chuv.lren.mip.portal.WokenConversions; import com.google.gson.Gson; -import eu.hbp.mip.woken.messages.external.UserId; -import eu.hbp.mip.woken.messages.external.VariableId; import eu.hbp.mip.utils.TypesConvert; +import eu.hbp.mip.woken.messages.datasets.DatasetId; +import eu.hbp.mip.woken.messages.query.UserId; +import eu.hbp.mip.woken.messages.query.filters.FilterRule; +import eu.hbp.mip.woken.messages.variables.FeatureIdentifier; +import scala.Option; import java.util.LinkedList; import java.util.List; @@ -78,18 +82,27 @@ public class MiningQuery { this.algorithm = algorithm; } - public eu.hbp.mip.woken.messages.external.MiningQuery prepareQuery() { + public eu.hbp.mip.woken.messages.query.MiningQuery prepareQuery() { - eu.hbp.mip.woken.messages.external.AlgorithmSpec scalaAlgorithm = new eu.hbp.mip.woken.messages.external.AlgorithmSpec( + eu.hbp.mip.woken.messages.query.AlgorithmSpec scalaAlgorithm = new eu.hbp.mip.woken.messages.query.AlgorithmSpec( algorithm.getCode(), TypesConvert.algoParamsToScala(algorithm.getParameters())); - scala.collection.immutable.List<VariableId> variablesSeq = TypesConvert.variablesToVariableIds(variables); - scala.collection.immutable.List<VariableId> covariablesSeq = TypesConvert.variablesToVariableIds(covariables); - scala.collection.immutable.List<VariableId> groupingSeq = TypesConvert.variablesToVariableIds(grouping); + scala.collection.immutable.List<FeatureIdentifier> variablesSeq = + TypesConvert.variablesToIdentifiers(getVariables()); + scala.collection.immutable.List<FeatureIdentifier> covariablesSeq = + TypesConvert.variablesToIdentifiers(getCovariables()); + scala.collection.immutable.List<FeatureIdentifier> groupingSeq = + TypesConvert.variablesToIdentifiers(getGrouping()); UserId userId = new UserId(user); - return new eu.hbp.mip.woken.messages.external.MiningQuery(userId, - variablesSeq, covariablesSeq, groupingSeq, filters, scalaAlgorithm); + // TODO - set values + WokenConversions conv = new WokenConversions(); + scala.collection.immutable.Set<DatasetId> datasets = conv.toDatasets(""); + String filtersJson = getFilters(); + Option<FilterRule> filters = conv.toFilterRule(filtersJson); + + return new eu.hbp.mip.woken.messages.query.MiningQuery(userId, + variablesSeq, covariablesSeq, groupingSeq, filters, datasets, scalaAlgorithm); } @Override diff --git a/src/main/java/eu/hbp/mip/utils/TypesConvert.java b/src/main/java/eu/hbp/mip/utils/TypesConvert.java index 42cc99520d3c5068a2dd0ba0ca911d6e3de047d5..b4270bde5666fb60f7feeafc85829b604ee8093e 100644 --- a/src/main/java/eu/hbp/mip/utils/TypesConvert.java +++ b/src/main/java/eu/hbp/mip/utils/TypesConvert.java @@ -1,7 +1,8 @@ package eu.hbp.mip.utils; -import eu.hbp.mip.woken.messages.external.CodeValue; -import eu.hbp.mip.woken.messages.external.VariableId; +import eu.hbp.mip.woken.messages.query.CodeValue; +import eu.hbp.mip.woken.messages.variables.FeatureIdentifier; +import eu.hbp.mip.woken.messages.variables.VariableId; import eu.hbp.mip.model.AlgorithmParam; import eu.hbp.mip.model.Variable; import scala.collection.JavaConversions; @@ -15,8 +16,8 @@ import java.util.stream.Collectors; */ public class TypesConvert { - public static scala.collection.immutable.List<VariableId> variablesToVariableIds(List<Variable> vars) { - List<VariableId> varIds = new LinkedList<>(); + public static scala.collection.immutable.List<FeatureIdentifier> variablesToIdentifiers(List<Variable> vars) { + List<FeatureIdentifier> varIds = new LinkedList<>(); for (Variable v: vars) { varIds.add(new VariableId(v.getCode())); } diff --git a/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala b/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala new file mode 100644 index 0000000000000000000000000000000000000000..0e90d1f3b512fd3f4f4cd931d216464b308d669e --- /dev/null +++ b/src/main/scala/ch.chuv.lren/mip/portal/WokenConversions.scala @@ -0,0 +1,19 @@ +package ch.chuv.lren.mip.portal + +import eu.hbp.mip.woken.messages.datasets.DatasetId +import eu.hbp.mip.woken.messages.query.filters.FilterRule +import eu.hbp.mip.woken.messages.query.filters.queryFiltersProtocol._ +import org.springframework.stereotype.Component +import spray.json._ + +@Component +class WokenConversions { + + def toFilterRule(json: String): Option[FilterRule] = Some(json).map(_.parseJson.convertTo[FilterRule]) + + def toDatasets(commaSeparatedSets: String): Set[DatasetId] = commaSeparatedSets match { + case "" => Set() + case _ => commaSeparatedSets.split(",").map(DatasetId).toSet + } + +}