From 1ff2c038c9084cfc07c7174ee686fd78aa826700 Mon Sep 17 00:00:00 2001
From: Manuel Spuhler <manuel.spuhler@chuv.ch>
Date: Thu, 23 May 2019 16:50:09 +0200
Subject: [PATCH] Removed (most) Exareme static definitions

---
 .../eu/hbp/mip/controllers/ExperimentApi.java | 134 ++++++-----
 .../eu/hbp/mip/controllers/MethodsApi.java    |   2 +-
 .../eu/hbp/mip/controllers/MiningApi.java     |   3 -
 .../java/eu/hbp/mip/model/AlgorithmParam.java |   9 +
 .../eu/hbp/mip/model/ExaremeQueryElement.java |  43 ----
 .../java/eu/hbp/mip/model/Experiment.java     | 224 +-----------------
 src/main/java/eu/hbp/mip/model/Variable.java  |  14 +-
 7 files changed, 106 insertions(+), 323 deletions(-)
 delete mode 100644 src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java

diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
index caa8ea97b..0507c49cb 100644
--- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
@@ -25,18 +25,14 @@ import scala.concurrent.ExecutionContext;
 import scala.concurrent.Future;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-
+import java.util.*;
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 
 /**
  * Created by habfast on 21/04/16.
  */
 @RestController
-@RequestMapping(value = "/experiments", produces = {APPLICATION_JSON_VALUE})
+@RequestMapping(value = "/experiments", produces = { APPLICATION_JSON_VALUE })
 @Api(value = "/experiments", description = "the experiments API")
 public class ExperimentApi extends WokenClientController {
 
@@ -44,11 +40,8 @@ public class ExperimentApi extends WokenClientController {
 
     private static final Gson gson = new Gson();
 
-    private static final Gson gsonOnlyExposed = new GsonBuilder()
-            .serializeNulls()
-            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
-            .excludeFieldsWithoutExposeAnnotation()
-            .create();
+    private static final Gson gsonOnlyExposed = new GsonBuilder().serializeNulls()
+            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").excludeFieldsWithoutExposeAnnotation().create();
 
     @Value("#{'${services.exareme.miningExaremeUrl:http://localhost:9090/mining/query}'}")
     public String miningExaremeQueryUrl;
@@ -79,21 +72,38 @@ public class ExperimentApi extends WokenClientController {
         experimentRepository.save(experiment);
 
         LOGGER.info("Experiment saved");
+        sendExperiment(experiment);
 
-        if (!experiment.isExaremeAlgorithm()._1) {
-            sendExperiment(experiment);
-        } else {
-            String algoCode = expQuery.getAlgorithms().get(0).getCode();
-            List<AlgorithmParam> params =  expQuery.getAlgorithms().get(0).getParameters();
-            sendExaremeExperiment(experiment, algoCode, params);
-        }
+        return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "Create an experiment on Exareme", response = Experiment.class)
+    @RequestMapping(value = "/exareme", method = RequestMethod.POST)
+    public ResponseEntity<String> runExaremeExperiment(@RequestBody ExperimentQuery expQuery) {
+        LOGGER.info("sendExaremeExperiment");
+
+        Experiment experiment = new Experiment();
+        experiment.setUuid(UUID.randomUUID());
+        User user = userInfo.getUser();
+
+        experiment.setAlgorithms(gson.toJson(expQuery.getAlgorithms()));
+        experiment.setValidations(gson.toJson(expQuery.getValidations()));
+        experiment.setName(expQuery.getName());
+        experiment.setCreatedBy(user);
+        experiment.setModel(modelRepository.findOne(expQuery.getModel()));
+        experimentRepository.save(experiment);
+
+        String algoCode = expQuery.getAlgorithms().get(0).getCode();
+        List<AlgorithmParam> params = expQuery.getAlgorithms().get(0).getParameters();
+        sendExaremeExperiment(experiment, algoCode, params);
 
         return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK);
     }
 
     @ApiOperation(value = "get an experiment", response = Experiment.class)
     @RequestMapping(value = "/{uuid}", method = RequestMethod.GET)
-    public ResponseEntity<String> getExperiment(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
+    public ResponseEntity<String> getExperiment(
+            @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
         LOGGER.info("Get an experiment");
 
         Experiment experiment;
@@ -117,7 +127,8 @@ public class ExperimentApi extends WokenClientController {
 
     @ApiOperation(value = "Mark an experiment as viewed", response = Experiment.class)
     @RequestMapping(value = "/{uuid}/markAsViewed", method = RequestMethod.GET)
-    public ResponseEntity<String> markExperimentAsViewed(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
+    public ResponseEntity<String> markExperimentAsViewed(
+            @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
         LOGGER.info("Mark an experiment as viewed");
 
         Experiment experiment;
@@ -144,7 +155,8 @@ public class ExperimentApi extends WokenClientController {
 
     @ApiOperation(value = "Mark an experiment as shared", response = Experiment.class)
     @RequestMapping(value = "/{uuid}/markAsShared", method = RequestMethod.GET)
-    public ResponseEntity<String> markExperimentAsShared(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
+    public ResponseEntity<String> markExperimentAsShared(
+            @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
         LOGGER.info("Mark an experiment as shared");
 
         return doMarkExperimentAsShared(uuid, true);
@@ -152,72 +164,62 @@ public class ExperimentApi extends WokenClientController {
 
     @ApiOperation(value = "Mark an experiment as unshared", response = Experiment.class)
     @RequestMapping(value = "/{uuid}/markAsUnshared", method = RequestMethod.GET)
-    public ResponseEntity<String> markExperimentAsUnshared(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
+    public ResponseEntity<String> markExperimentAsUnshared(
+            @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) {
         LOGGER.info("Mark an experiment as unshared");
 
         return doMarkExperimentAsShared(uuid, false);
     }
 
     @ApiOperation(value = "list experiments", response = Experiment.class, responseContainer = "List")
-    @RequestMapping(method = RequestMethod.GET, params = {"maxResultCount"})
+    @RequestMapping(method = RequestMethod.GET, params = { "maxResultCount" })
     public ResponseEntity<String> listExperiments(
-            @ApiParam(value = "maxResultCount") @RequestParam int maxResultCount
-    ) {
+            @ApiParam(value = "maxResultCount") @RequestParam int maxResultCount) {
         LOGGER.info("List experiments");
 
         return doListExperiments(false, null);
     }
 
     @ApiOperation(value = "list experiments", response = Experiment.class, responseContainer = "List")
-    @RequestMapping(method = RequestMethod.GET, params = {"slug", "maxResultCount"})
-    public ResponseEntity<String> listExperiments(
-            @ApiParam(value = "slug") @RequestParam("slug") String modelSlug,
-            @ApiParam(value = "maxResultCount") @RequestParam("maxResultCount") int maxResultCount
-    ) {
+    @RequestMapping(method = RequestMethod.GET, params = { "slug", "maxResultCount" })
+    public ResponseEntity<String> listExperiments(@ApiParam(value = "slug") @RequestParam("slug") String modelSlug,
+            @ApiParam(value = "maxResultCount") @RequestParam("maxResultCount") int maxResultCount) {
         LOGGER.info("List experiments");
 
         if (maxResultCount <= 0 && (modelSlug == null || "".equals(modelSlug))) {
-            return new ResponseEntity<>("You must provide at least a slug or a limit of result", HttpStatus.BAD_REQUEST);
+            return new ResponseEntity<>("You must provide at least a slug or a limit of result",
+                    HttpStatus.BAD_REQUEST);
         }
 
         return doListExperiments(false, modelSlug);
     }
 
     @ApiOperation(value = "list my experiments", response = Experiment.class, responseContainer = "List")
-    @RequestMapping(method = RequestMethod.GET, params = {"mine"})
-    public ResponseEntity<String> listMyExperiments(
-            @ApiParam(value = "mine") @RequestParam("mine") boolean mine
-    ) {
+    @RequestMapping(method = RequestMethod.GET, params = { "mine" })
+    public ResponseEntity<String> listMyExperiments(@ApiParam(value = "mine") @RequestParam("mine") boolean mine) {
         LOGGER.info("List my experiments");
 
         return doListExperiments(true, null);
     }
 
-
-    private ResponseEntity<String> doListExperiments(
-            boolean mine,
-            String modelSlug
-    ) {
+    private ResponseEntity<String> doListExperiments(boolean mine, String modelSlug) {
         User user = userInfo.getUser();
 
         Iterable<Experiment> myExperiments = experimentRepository.findByCreatedBy(user);
         List<Experiment> expList = Lists.newLinkedList(myExperiments);
-        if(!mine)
-        {
+        if (!mine) {
             Iterable<Experiment> sharedExperiments = experimentRepository.findByShared(true);
             List<Experiment> sharedExpList = Lists.newLinkedList(sharedExperiments);
             expList.addAll(sharedExpList);
         }
 
         if (modelSlug != null && !"".equals(modelSlug)) {
-            for(Iterator<Experiment> it = expList.iterator(); it.hasNext();)
-            {
+            for (Iterator<Experiment> it = expList.iterator(); it.hasNext();) {
                 Experiment e = it.next();
                 e.setResult(null);
                 e.setAlgorithms(null);
                 e.setValidations(null);
-                if(!e.getModel().getSlug().equals(modelSlug))
-                {
+                if (!e.getModel().getSlug().equals(modelSlug)) {
                     it.remove();
                 }
             }
@@ -255,10 +257,11 @@ public class ExperimentApi extends WokenClientController {
         User user = userInfo.getUser();
 
         // this runs in the background. For future optimization: use a thread pool
-        final ch.chuv.lren.woken.messages.query.ExperimentQuery experimentQuery = experiment.prepareQuery(user.getUsername());
+        final ch.chuv.lren.woken.messages.query.ExperimentQuery experimentQuery = experiment
+                .prepareQuery(user.getUsername());
         final ExecutionContext ec = getExecutor();
 
-        Future<Object> response = sendWokenQuery(experimentQuery, 24*3600);
+        Future<Object> response = sendWokenQuery(experimentQuery, 24 * 3600);
         response.onSuccess(new OnSuccess<Object>() {
             public void onSuccess(Object result) {
                 QueryResult queryResult = (QueryResult) result;
@@ -282,11 +285,27 @@ public class ExperimentApi extends WokenClientController {
         }, ec);
     }
 
-    private void sendExaremeExperiment(Experiment experiment, String algoCode, List <AlgorithmParam> params) {
-        // >> Temporary: we should integrate exareme in a proper way in the future
+    private void sendExaremeExperiment(Experiment experiment, String algoCode, List<AlgorithmParam> params) {
         // this runs in the background. For future optimization: use a thread pool
         new Thread(() -> {
-            String query = experiment.computeExaremeQuery(params);
+            List<HashMap<String, String>> queryList = new ArrayList<HashMap<String, String>>();
+
+            Query modelQuery = experiment.getModel().getQuery();
+            queryList.add(makeObject("x", Variable.stringFromVariables(modelQuery.getVariables(), ",")));
+
+            List<Variable> mergedCovariables = new ArrayList<Variable>(modelQuery.getCovariables());
+            queryList.add(makeObject("y", Variable.stringFromVariables(mergedCovariables, ",")));
+
+            List<Variable> mergedDatasets = new ArrayList<Variable>(modelQuery.getTrainingDatasets());
+            queryList.add(makeObject("dataset", Variable.stringFromVariables(mergedDatasets, ",")));
+
+            if (params != null) {
+                for (AlgorithmParam p : params) {
+                    queryList.add(makeObject(p.getName(), p.getValue()));
+                }
+            }
+
+            String query = gson.toJson(queryList);
             String url = miningExaremeQueryUrl + "/" + algoCode;
 
             // Results are stored in the experiment object
@@ -305,14 +324,21 @@ public class ExperimentApi extends WokenClientController {
             }
             finishExperiment(experiment);
         }).start();
-        // << Temporary
     }
 
-    private void finishExperiment(Experiment experiment)
-    {
+    private void finishExperiment(Experiment experiment) {
         experiment.setFinished(new Date());
         experimentRepository.save(experiment);
 
         LOGGER.info("Experiment updated (finished)");
     }
+
+    private HashMap<String, String> makeObject(String name, String value) {
+        HashMap<String, String> o =  new HashMap<String, String>();
+        o.put("name", name);
+        o.put("value", value);
+
+        return o;
+    }
+
 }
diff --git a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java
index 29e69e325..21d3b9f2f 100644
--- a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java
@@ -26,7 +26,7 @@ public class MethodsApi extends WokenClientController {
     private static final Logger LOGGER = LoggerFactory.getLogger(MethodsApi.class);
 
     private static final Gson gson = new Gson();
-d
+
     @Value("#{'${services.exareme.algorithmsUrl:http://localhost:9090/mining/algorithms.json}'}")
     private String exaremeAlgorithmsUrl;
 
diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java
index bf89261eb..24356234e 100644
--- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java
@@ -38,9 +38,6 @@ public class MiningApi extends WokenClientController {
     @Autowired
     private UserInfo userInfo;
 
-    @Value("#{'${services.query.miningExaremeUrl:http://localhost:9090/mining/query}'}")
-    public String queryUrl;
-
     @ApiOperation(value = "Run an algorithm", response = String.class)
     @Cacheable(value = "mining",
             condition = "#query != null and (#query.getAlgorithm().getCode() == 'histograms' or #query.getAlgorithm().getCode() == 'histograms')",
diff --git a/src/main/java/eu/hbp/mip/model/AlgorithmParam.java b/src/main/java/eu/hbp/mip/model/AlgorithmParam.java
index e4e5eac8d..62c48ba13 100644
--- a/src/main/java/eu/hbp/mip/model/AlgorithmParam.java
+++ b/src/main/java/eu/hbp/mip/model/AlgorithmParam.java
@@ -11,6 +11,15 @@ public class AlgorithmParam {
 
     public String getCode() {
         return code;
+
+    }
+
+    public void setName(String name) {
+        this.code = name;
+    }
+
+    public String getName() {
+        return this.code;
     }
 
     public void setCode(String code) {
diff --git a/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java b/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java
deleted file mode 100644
index 0b7005c19..000000000
--- a/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package eu.hbp.mip.model;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-
-/**
- * Created by mirco on 20.06.16.
- */
-
-@ApiModel
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class ExaremeQueryElement {
-
-    private String name;
-
-    private String desc;
-
-    private String value;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public void setDesc(String desc) {
-        this.desc = desc;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-}
diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java
index 8f4dd0a34..21bf9461a 100644
--- a/src/main/java/eu/hbp/mip/model/Experiment.java
+++ b/src/main/java/eu/hbp/mip/model/Experiment.java
@@ -28,12 +28,6 @@ import scala.Tuple2;
 @Table(name = "`experiment`")
 public class Experiment {
 
-    public static final String WP_K_MEANS = "K_MEANS";
-    public static final String WP_LINEAR_REGRESSION = "WP_LINEAR_REGRESSION";
-    public static final String WP_VARIABLES_HISTOGRAM = "WP_VARIABLES_HISTOGRAM";
-    public static final String WP_REGRESSION_TREE = "PIPELINE_ISOUP_REGRESSION_TREE_SERIALIZER";
-    public static final String WP_MODEL_TREE = "PIPELINE_ISOUP_MODEL_TREE_SERIALIZER";
-
     private static final Logger LOGGER = LoggerFactory.getLogger(Experiment.class);
 
     private static final Gson gson = new Gson();
@@ -137,159 +131,9 @@ public class Experiment {
                 validationsSeq, Option.empty());
     }
 
-    private String chainsParams(List<String> params, String operator) {
-        StringBuilder sb = new StringBuilder();
-        int i = 0;
-        for (String s : params)
-        {
-            i++;
-            sb.append(s);
-            if (i < params.size()) {
-                sb.append(operator);
-            }
-        }
-        return sb.toString();
-    }
-
-    public String computeExaremeQuery(List<AlgorithmParam> params) {
-        List<ExaremeQueryElement> queryElements = new LinkedList<>();
-
-        // parameters
-        String design = ""; // TODO: don't assign to a global
-        String nobuckets = "";
-
-        if (params != null) {
-            for (AlgorithmParam p : params)
-            {
-                ExaremeQueryElement paramEl = new ExaremeQueryElement();
-                paramEl.setName(p.getCode());
-                paramEl.setDesc("");
-                paramEl.setValue(p.getValue());
-                queryElements.add(paramEl);
-
-                if (p.getCode().equals("design")) {
-                    design = p.getValue();
-                }
-
-                if (p.getCode().equals("nobuckets")) {
-                    nobuckets = p.getValue();
-                }
-            }
-        }
-
-        List<String> variables = new ArrayList<>();
-        List<String> covariables = new ArrayList<>();
-        List<String> groupings = new ArrayList<>();
-
-        for (Variable var : model.getQuery().getVariables()) { variables.add(var.getCode()); }
-        for (Variable var : model.getQuery().getCovariables()) { covariables.add(var.getCode()); }
-        for (Variable var : model.getQuery().getGrouping()) { groupings.add(var.getCode()); }
-
-        // Set algorithm specific queries
-        String algoName = this.isExaremeAlgorithm()._2;
-        if (algoName.equals(WP_K_MEANS)) {
-            // columns
-            List<String> columns = variables;
-            columns.addAll(covariables);
-            columns.addAll(groupings);
-
-            ExaremeQueryElement columnsEl = new ExaremeQueryElement();
-            columnsEl.setName("columns");
-            columnsEl.setDesc("");
-            columnsEl.setValue(chainsParams(columns, ","));
-            queryElements.add(columnsEl);
-        } else if (algoName.equals(WP_LINEAR_REGRESSION)) {
-            List<String> nominals = covariables.isEmpty() ? groupings : covariables;
-            nominals.addAll(groupings);
-
-            String operator = design.equals("factorial") ? "*" : "+";
-
-            ExaremeQueryElement xEl = new ExaremeQueryElement();
-            xEl.setName("x");
-            xEl.setDesc("");
-            xEl.setValue(chainsParams(nominals, operator));
-            queryElements.add(xEl);
-
-            ExaremeQueryElement yEl = new ExaremeQueryElement();
-            yEl.setName("y");
-            yEl.setDesc("");
-            yEl.setValue(chainsParams(variables, ","));
-            queryElements.add(yEl);
-        } else if (algoName.equals(WP_VARIABLES_HISTOGRAM)) {
-            List<String> column1 = variables;
-            ExaremeQueryElement columnsEl = new ExaremeQueryElement();
-            columnsEl.setName("column1");
-            columnsEl.setDesc("");
-            columnsEl.setValue(chainsParams(column1, ","));
-            queryElements.add(columnsEl);
-
-            List<String> column2 = covariables.isEmpty() ? groupings : covariables;
-            ExaremeQueryElement columnsEl2 = new ExaremeQueryElement();
-            columnsEl2.setName("column2");
-            columnsEl2.setDesc("");
-            columnsEl2.setValue(chainsParams(column2, ","));
-            queryElements.add(columnsEl2);
-
-            if (!nobuckets.isEmpty()) {
-                ExaremeQueryElement columnsEl3 = new ExaremeQueryElement();
-                columnsEl3.setName("nobuckets");
-                columnsEl3.setDesc("");
-                columnsEl3.setValue(nobuckets);
-                queryElements.add(columnsEl3);
-            }
-        } else if (algoName.equals(WP_REGRESSION_TREE) || algoName.equals(WP_MODEL_TREE)) {
-            List<String> target = variables;
-            List<String> descriptive = covariables.isEmpty() ? groupings : covariables;
-            descriptive.addAll(groupings);
-
-            ExaremeQueryElement xEl = new ExaremeQueryElement();
-            xEl.setName("target_attributes");
-            xEl.setDesc("");
-            xEl.setValue(chainsParams(target, ","));
-            queryElements.add(xEl);
-
-            ExaremeQueryElement yEl = new ExaremeQueryElement();
-            yEl.setName("descriptive_attributes");
-            yEl.setDesc("");
-            yEl.setValue(chainsParams(descriptive, ","));
-            queryElements.add(yEl);
-        }
-
-        // datasets
-        StringBuilder datasets = new StringBuilder();
-        List<Variable> trainingDatasets = model.getQuery().getTrainingDatasets();
-        int j = 0;
-        for (Variable var : trainingDatasets)
-        {
-            j++;
-            datasets.append(var.getCode());
-            if (j < trainingDatasets.size() ) {
-                datasets.append(",");
-            }
-        }
-
-        ExaremeQueryElement datasetsEl = new ExaremeQueryElement();
-        datasetsEl.setName("dataset");
-        datasetsEl.setDesc("");
-        // datasetsEl.setValue("adni,ppmi,edsd,fbf,clm");
-        datasetsEl.setValue(datasets.toString());
-        queryElements.add(datasetsEl);
-
-        // filter
-        String filter = model.getQuery().getFilters();
-        ExaremeQueryElement filterEl = new ExaremeQueryElement();
-        filterEl.setName("filter");
-        filterEl.setDesc("");
-        filterEl.setValue(filter);
-        queryElements.add(filterEl);
-
-        return gson.toJson(queryElements);
-    }
-
     public JsonObject jsonify() {
         JsonObject exp = gson.toJsonTree(this).getAsJsonObject();
         JsonParser parser = new JsonParser();
-        Tuple2<Boolean, String> isExaremeAlgorithm = this.isExaremeAlgorithm();
 
         if (this.algorithms != null)
         {
@@ -308,45 +152,9 @@ public class Experiment {
         if (this.result != null && !this.hasServerError) {
             exp.remove("result");
 
-            if (!isExaremeAlgorithm._1) {
-                JsonElement jsonResult = parser.parse(this.result);
-                exp.add("result", jsonResult);
-            } else {
-                JsonArray jsonArrayResult = new JsonArray();
-                JsonObject jsonObjectResult = new JsonObject();
-
-                JsonObject algoObject = parser.parse(this.algorithms).getAsJsonArray().get(0).getAsJsonObject();
-                jsonObjectResult.add("algorithm", algoObject.get("name"));
-                jsonObjectResult.add("code", algoObject.get("code"));
-
-                exp.remove("result");
-                JsonObject tryJson;
-                try {
-                    tryJson = parser.parse(this.result).getAsJsonArray().get(0).getAsJsonObject();
-                } catch(JsonParseException e) {
-                    tryJson = new JsonObject();
-                    tryJson.add("result", new JsonPrimitive(this.result));
-                }
-
-                JsonObject jsonData = tryJson;
-                jsonObjectResult.add("data", jsonData);
-
-                // add mime-type
-                String algo = isExaremeAlgorithm._2;
-                if (jsonData.get("Error") != null) {
-                    jsonObjectResult.add("type", new JsonPrimitive("text/plain+error"));
-                } else if (algo.equals( WP_K_MEANS) || algo.equals( WP_VARIABLES_HISTOGRAM)) {
-                    jsonObjectResult.add("type", new JsonPrimitive("application/vnd.highcharts+json"));
-                } else if (algo.equals(WP_LINEAR_REGRESSION)) {
-                    jsonObjectResult.add("type", new JsonPrimitive("application/vnd.dataresource+json"));
-                } else if (algo.equals(WP_REGRESSION_TREE) || algo.equals(WP_MODEL_TREE)) {
-                    jsonObjectResult.add("type", new JsonPrimitive("application/vnd.visjs+javascript"));
-                }
-
-                jsonArrayResult.add(jsonObjectResult);
-
-                exp.add("result", jsonArrayResult);
-            }
+            JsonElement jsonResult = parser.parse(this.result);
+            exp.add("result", jsonResult);
+
         }
 
         return exp;
@@ -455,30 +263,4 @@ public class Experiment {
     public void setShared(boolean shared) {
         this.shared = shared;
     }
-
-    public Tuple2<Boolean, String> isExaremeAlgorithm() {
-        Boolean isExareme = false;
-        String algorithm = "";
-
-        String algorithms = this.algorithms;
-
-        if (algorithms.contains(WP_K_MEANS)) {
-            isExareme = true;
-            algorithm = WP_K_MEANS;
-        } else if (algorithms.contains(WP_LINEAR_REGRESSION)) {
-            isExareme = true;
-            algorithm = WP_LINEAR_REGRESSION;
-        } else if (algorithms.contains(WP_VARIABLES_HISTOGRAM)) {
-            isExareme = true;
-            algorithm = WP_VARIABLES_HISTOGRAM;
-        } else if (algorithms.contains(WP_REGRESSION_TREE)) {
-            isExareme = true;
-            algorithm = WP_REGRESSION_TREE;
-        } else if (algorithms.contains(WP_MODEL_TREE)) {
-            isExareme = true;
-            algorithm = WP_MODEL_TREE;
-        }
-
-        return new Tuple2<Boolean, String>(isExareme, algorithm);
-    }
 }
diff --git a/src/main/java/eu/hbp/mip/model/Variable.java b/src/main/java/eu/hbp/mip/model/Variable.java
index 0947cdd7d..1fcce2e48 100644
--- a/src/main/java/eu/hbp/mip/model/Variable.java
+++ b/src/main/java/eu/hbp/mip/model/Variable.java
@@ -12,6 +12,7 @@ import io.swagger.annotations.ApiModel;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import java.util.List;
 
 @Entity
 @Table(name = "`variable`")
@@ -42,6 +43,17 @@ public class Variable {
         this.code = code;
     }
 
-
+    public static String stringFromVariables(List<Variable> variables, String operator) {
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        for (Variable s : variables) {
+            i++;
+            sb.append(s.getCode());
+            if (i < variables.size()) {
+                sb.append(operator);
+            }
+        }
+        return sb.toString();
+    }
 
 }
-- 
GitLab