diff --git a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java index 2d55bc4f6d0564979dfd9f9930e27b457d45cad8..c8cd4a29195aa3c963df172cd21bccbfef7b102a 100644 --- a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java @@ -4,16 +4,27 @@ package eu.hbp.mip.controllers; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import eu.hbp.mip.model.Dataset; import eu.hbp.mip.model.Query; 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.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; 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 java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @@ -23,16 +34,90 @@ public class RequestsApi { private static final Logger LOGGER = Logger.getLogger(RequestsApi.class); + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + @ApiOperation(value = "Post a request", response = Dataset.class) @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") }) @RequestMapping(method = RequestMethod.POST) @Deprecated - public ResponseEntity<Dataset> postRequests( + public ResponseEntity<Object> postRequests( @RequestBody @ApiParam(value = "Query to process", required = true) Query query ) { LOGGER.info("Post a request"); - return ResponseEntity.ok(null); // TODO: Get data from second datasource + JsonObject dataset = new JsonObject(); + + String code = generateDSCode(query); + Date date = new Date(); + List<String> variables = new LinkedList<>(); + List<String> groupings = new LinkedList<>(); + List<String> covariables = new LinkedList<>(); + Map<String, LinkedList<Object>> data = new HashMap<>(); + + Gson gson = new Gson(); + JsonObject q = gson.fromJson(gson.toJson(query, Query.class), JsonObject.class); + + JsonArray queryVars = q.getAsJsonArray("variables"); + JsonArray queryGrps = q.getAsJsonArray("grouping"); + JsonArray queryCoVars = q.getAsJsonArray("covariables"); + + List<String> allVars = new LinkedList<>(); + + for (JsonElement var : queryVars) { + String varCode = var.getAsJsonObject().get("code").getAsString(); + variables.add(varCode); + allVars.add(varCode); + } + + for (JsonElement var : queryGrps) { + String varCode = var.getAsJsonObject().get("code").getAsString(); + groupings.add(varCode); + allVars.add(varCode); + } + + for (JsonElement var : queryCoVars) { + String varCode = var.getAsJsonObject().get("code").getAsString(); + covariables.add(varCode); + allVars.add(varCode); + } + + for(String varCode : allVars) + { + String sqlQuery = "SELECT " + varCode + " FROM adni_merge"; + for (Map resultMap : jdbcTemplate.queryForList(sqlQuery)) + { + resultMap.get(varCode); + } + } + + 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", new Gson().toJsonTree(data)); + + return ResponseEntity.ok(new Gson().fromJson(dataset, Object.class)); + } + + + private String generateDSCode(Query query) { + String prefix = "DS"; + String queryStr = Integer.toString(query.hashCode()); + + Pattern p = Pattern.compile("@(\\w+)"); + Matcher m = p.matcher(queryStr); + + String memId; + if (m.find()) { + memId = m.group(1); + } else { + memId = Long.toString(new Date().getTime()); // "This should never happen" + } + + return prefix + memId; } }