diff --git a/src/main/java/eu/hbp/mip/controllers/ModelsApi.java b/src/main/java/eu/hbp/mip/controllers/ModelsApi.java index 0d24b28d3eada3fcd7bfa714c03e3ae572eefc64..732ae2dfdff7a7783626def818bcd671a462b62c 100644 --- a/src/main/java/eu/hbp/mip/controllers/ModelsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ModelsApi.java @@ -5,17 +5,22 @@ package eu.hbp.mip.controllers; import com.github.slugify.Slugify; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import eu.hbp.mip.configuration.SecurityConfiguration; import eu.hbp.mip.model.Filter; import eu.hbp.mip.model.Model; import eu.hbp.mip.model.User; import eu.hbp.mip.model.Variable; import eu.hbp.mip.repositories.*; +import eu.hbp.mip.utils.DataUtil; import io.swagger.annotations.*; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -49,6 +54,11 @@ public class ModelsApi { @Autowired VariableRepository variableRepository; + @Autowired + @Qualifier("scienceJdbcTemplate") + private JdbcTemplate scienceJdbcTemplate; + + @ApiOperation(value = "Get models", response = Model.class, responseContainer = "List") @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") }) @RequestMapping(method = RequestMethod.GET) @@ -85,12 +95,12 @@ public class ModelsApi { } } - List<Model> modelsList = new LinkedList<>(); + List<Object> modelsList = new LinkedList<>(); for (Iterator<Model> i = models.iterator(); i.hasNext(); ) { Model m = i.next(); m.cureVariables(); - modelsList.add(m); + modelsList.add(getModelWithDataset(m)); } return new ResponseEntity<List<Model>>(HttpStatus.OK).ok(modelsList); @@ -107,6 +117,8 @@ public class ModelsApi { LOGGER.info("Create a model"); + model = getModelWithDataset(model); + User user = securityConfiguration.getUser(); model.setTitle(model.getConfig().getTitle().get("text")); @@ -178,7 +190,7 @@ public class ModelsApi { datasetRepository.save(model.getDataset()); modelRepository.save(model); - LOGGER.info("Model saved (also saved model.config, model.query and model.dataset)"); + LOGGER.info("Model saved (also saved model.config and model.query)"); return new ResponseEntity<Model>(HttpStatus.CREATED).ok(model); } @@ -211,7 +223,7 @@ public class ModelsApi { model.cureVariables(); - return new ResponseEntity<>(HttpStatus.OK).ok(model); + return new ResponseEntity<>(HttpStatus.OK).ok(getModelWithDataset(model)); } @@ -269,16 +281,19 @@ public class ModelsApi { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } - private static String randomStr(int length) { - char[] chars = "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); - StringBuilder sb = new StringBuilder(); - Random random = new Random(); - for (int i = 0; i < length; i++) { - char c = chars[random.nextInt(chars.length)]; - sb.append(c); - } - return sb.toString(); - } + private Model getModelWithDataset(Model model) + { + List<String> allVars = new LinkedList<>(); + allVars.addAll(model.getDataset().getVariable()); + allVars.addAll(model.getDataset().getHeader()); + allVars.addAll(model.getDataset().getGrouping()); + Gson gson = new Gson(); + JsonObject jsonModel = gson.fromJson(gson.toJson(model, Model.class), JsonObject.class); + jsonModel.get("dataset").getAsJsonObject() + .add("data", new DataUtil(scienceJdbcTemplate).getDataFromVariables(allVars)); + + return gson.fromJson(jsonModel, Model.class); + } } diff --git a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java index 1bd7c7dfc329078c12567068bad99f746e5b511b..40c97e92a8516737784f1fc4fa3ba577d5843bbe 100644 --- a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java @@ -10,6 +10,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import eu.hbp.mip.model.Dataset; import eu.hbp.mip.model.Query; +import eu.hbp.mip.utils.DataUtil; import io.swagger.annotations.*; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -83,29 +84,12 @@ public class RequestsApi { allVars.add(varCode); } - for(String varCode : allVars) - { - JsonArray currentVarData = new JsonArray(); - String sqlQuery = "SELECT " + varCode + " FROM science.adni_merge"; - for (Map resultMap : scienceJdbcTemplate.queryForList(sqlQuery)) - { - String strValue = String.valueOf(resultMap.get(varCode)); - try { - Double numValue = Double.parseDouble(strValue); - currentVarData.add(numValue); - } catch (NumberFormatException e2) { - currentVarData.add(strValue); - } - } - data.add(varCode, currentVarData); - } - dataset.addProperty("code", code); dataset.addProperty("date", date.getTime()); dataset.add("variable", gson.toJsonTree(variables)); dataset.add("grouping", gson.toJsonTree(groupings)); dataset.add("header", gson.toJsonTree(covariables)); - dataset.add("data", data); + dataset.add("data", new DataUtil(scienceJdbcTemplate).getDataFromVariables(allVars)); return ResponseEntity.ok(new Gson().fromJson(dataset, Object.class)); } diff --git a/src/main/java/eu/hbp/mip/controllers/StatsApi.java b/src/main/java/eu/hbp/mip/controllers/StatsApi.java index f001dfd5bd28ec5591d71a9e8ab5a535060ec0bf..3601b617b7375c2e4721b3ff3d29735470de61c8 100644 --- a/src/main/java/eu/hbp/mip/controllers/StatsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/StatsApi.java @@ -7,6 +7,7 @@ package eu.hbp.mip.controllers; import eu.hbp.mip.model.GeneralStats; import eu.hbp.mip.repositories.ArticleRepository; import eu.hbp.mip.repositories.UserRepository; +import eu.hbp.mip.utils.DataUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -49,17 +50,9 @@ public class StatsApi { stats.setUsers(userRepository.count()); stats.setArticles(articleRepository.count()); - stats.setVariables(countVariables()); + stats.setVariables(new DataUtil(scienceJdbcTemplate).countVariables()); return ResponseEntity.ok(stats); } - private Long countVariables() - { - Long count = scienceJdbcTemplate.queryForObject( - "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS " + - "WHERE table_schema = 'science' AND table_name = 'adni_merge'", Long.class); - return count; - } - } diff --git a/src/main/java/eu/hbp/mip/model/Dataset.java b/src/main/java/eu/hbp/mip/model/Dataset.java index 7d5192b9a71c01cc2e90fae58bc5bdafd7c04acd..3662c755252db4eae9d38ea479d018d6d7786109 100644 --- a/src/main/java/eu/hbp/mip/model/Dataset.java +++ b/src/main/java/eu/hbp/mip/model/Dataset.java @@ -5,10 +5,13 @@ package eu.hbp.mip.model; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import javax.persistence.*; -import java.util.*; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; @Entity @Table(name = "`dataset`") @@ -33,6 +36,10 @@ public class Dataset { @CollectionTable(name = "dataset_variable", joinColumns = @JoinColumn(name = "dataset_code")) private List<String> variable = new LinkedList<>(); + @Transient + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Object data = null; + public Dataset() { /* @@ -85,4 +92,11 @@ public class Dataset { this.variable = variable; } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } } diff --git a/src/main/java/eu/hbp/mip/utils/DataUtil.java b/src/main/java/eu/hbp/mip/utils/DataUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..468f008d2704510e1243ec9b6a3527fb2dc4c371 --- /dev/null +++ b/src/main/java/eu/hbp/mip/utils/DataUtil.java @@ -0,0 +1,54 @@ +package eu.hbp.mip.utils; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.List; +import java.util.Map; + +/** + * Created by mirco on 14.09.16. + */ + +public class DataUtil { + + private JdbcTemplate jdbcTemplate; + + public DataUtil(JdbcTemplate jdbcTemplate) + { + this.jdbcTemplate = jdbcTemplate; + } + + public JsonObject getDataFromVariables(List<String> vars) + { + JsonObject data = new JsonObject(); + + for (String var : vars) { + JsonArray currentVarData = new JsonArray(); + List<Map<String, Object>> queryResult = jdbcTemplate.queryForList("SELECT " + var + " FROM science.adni_merge"); + for (Map resultMap : queryResult) + { + String strValue = String.valueOf(resultMap.get(var)); + try { + double numValue = Double.parseDouble(strValue); + currentVarData.add(numValue); + } catch (NumberFormatException e2) { + currentVarData.add(strValue); + } + } + data.add(var, currentVarData); + } + + return data; + } + + public long countVariables() + { + long count = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS " + + "WHERE table_schema = 'science' AND table_name = 'adni_merge'", Long.class); + return count; + } + +}