From b5eef58c942a22c70d36a943cc32d1b3bc77db4d Mon Sep 17 00:00:00 2001
From: Mirco Nasuti <mirco.nasuti@chuv.ch>
Date: Tue, 18 Oct 2016 13:31:32 +0200
Subject: [PATCH] make filters work

---
 .../eu/hbp/mip/controllers/ModelsApi.java     |  5 --
 .../eu/hbp/mip/controllers/RequestsApi.java   | 19 ++++-
 src/main/java/eu/hbp/mip/model/Filter.java    | 78 -------------------
 src/main/java/eu/hbp/mip/model/Query.java     | 14 ++--
 .../mip/repositories/FilterRepository.java    | 11 ---
 .../db/migration/V3_0__AddFilter.sql          |  9 ++-
 6 files changed, 32 insertions(+), 104 deletions(-)
 delete mode 100644 src/main/java/eu/hbp/mip/model/Filter.java
 delete mode 100644 src/main/java/eu/hbp/mip/repositories/FilterRepository.java

diff --git a/src/main/java/eu/hbp/mip/controllers/ModelsApi.java b/src/main/java/eu/hbp/mip/controllers/ModelsApi.java
index 34ac327dc..03bae52c1 100644
--- a/src/main/java/eu/hbp/mip/controllers/ModelsApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/ModelsApi.java
@@ -8,7 +8,6 @@ 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;
@@ -218,10 +217,6 @@ public class ModelsApi {
         Collection<String> yAxisVarsColl = new LinkedHashSet<>(yAxisVars);
         model.getConfig().setyAxisVariables(new LinkedList<>(yAxisVarsColl));
 
-        List<Filter> fltrs = queryRepository.findOne(model.getQuery().getId()).getFilters();
-        Collection<Filter> fltrsColl = new LinkedHashSet<>(fltrs);
-        model.getQuery().setFilters(new LinkedList<>(fltrsColl));
-
         return new ResponseEntity<>(HttpStatus.OK).ok(getModelWithDataset(model));
     }
 
diff --git a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java
index f5f2ff009..a0938937a 100644
--- a/src/main/java/eu/hbp/mip/controllers/RequestsApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/RequestsApi.java
@@ -23,7 +23,9 @@ 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.Date;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -59,13 +61,15 @@ public class RequestsApi {
         List<String> variables = new LinkedList<>();
         List<String> groupings = new LinkedList<>();
         List<String> covariables = new LinkedList<>();
+        List<String> filters = new LinkedList<>();
 
         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");
+        JsonArray queryVars = q.getAsJsonArray("variables") != null ? q.getAsJsonArray("variables") : new JsonArray();
+        JsonArray queryGrps = q.getAsJsonArray("grouping") != null ? q.getAsJsonArray("grouping") : new JsonArray();
+        JsonArray queryCoVars = q.getAsJsonArray("covariables") != null ? q.getAsJsonArray("covariables") : new JsonArray();
+        JsonArray queryfltrs = q.getAsJsonArray("filter") != null ? q.getAsJsonArray("filter") : new JsonArray();
 
         List<String> allVars = new LinkedList<>();
 
@@ -87,11 +91,18 @@ public class RequestsApi {
             allVars.add(varCode);
         }
 
+        for (JsonElement var : queryfltrs) {
+            String fltCode = var.getAsJsonObject().get("code").getAsString();
+            filters.add(fltCode);
+            allVars.add(fltCode);
+        }
+
         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("filter", gson.toJsonTree(filters));
         dataset.add("data", new DataUtil(scienceJdbcTemplate, scienceMainTable).getDataFromVariables(allVars));
 
         return ResponseEntity.ok(new Gson().fromJson(dataset, Object.class));
diff --git a/src/main/java/eu/hbp/mip/model/Filter.java b/src/main/java/eu/hbp/mip/model/Filter.java
deleted file mode 100644
index e55b405e9..000000000
--- a/src/main/java/eu/hbp/mip/model/Filter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Created by mirco on 04.12.15.
- */
-
-package eu.hbp.mip.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-
-import javax.persistence.*;
-import java.util.LinkedList;
-import java.util.List;
-
-@Entity
-@Table(name = "`filter`")
-@ApiModel
-@JsonIgnoreProperties(value = { "id" })
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class Filter {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE)
-    private Long id = null;
-
-    @ManyToOne
-    private Variable variable = null;
-
-    private String operator = null;
-
-    @ElementCollection(fetch = FetchType.EAGER)
-    @CollectionTable(name = "filter_values", joinColumns = @JoinColumn(name = "filter_id"))
-    private List<String> values = new LinkedList<>();
-
-
-    public Filter() {
-        /*
-        *  Empty constructor is needed by Hibernate
-        */
-    }
-
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-
-    public Variable getVariable() {
-        return variable;
-    }
-
-    public void setVariable(Variable variable) {
-        this.variable = variable;
-    }
-
-
-    public String getOperator() {
-        return operator;
-    }
-
-    public void setOperator(String operator) {
-        this.operator = operator;
-    }
-
-
-    public List<String> getValues() {
-        return values;
-    }
-
-    public void setValues(List<String> values) {
-        this.values = values;
-    }
-
-}
diff --git a/src/main/java/eu/hbp/mip/model/Query.java b/src/main/java/eu/hbp/mip/model/Query.java
index 83d13a1fe..9073b1236 100644
--- a/src/main/java/eu/hbp/mip/model/Query.java
+++ b/src/main/java/eu/hbp/mip/model/Query.java
@@ -47,8 +47,12 @@ public class Query {
                     nullable = false, updatable = false) })
     private List<Variable> grouping = new LinkedList<>();
 
-    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
-    private List<Filter> filters = new LinkedList<>();
+    @ManyToMany
+    @JoinTable(name = "query_filter", joinColumns = {
+            @JoinColumn(name = "query_id", nullable = false, updatable = false) },
+            inverseJoinColumns = { @JoinColumn(name = "code",
+                    nullable = false, updatable = false) })
+    private List<Variable> filters = new LinkedList<>();
 
     @Column(columnDefinition = "text", name = "sql_filter")
     private String sqlFilter = null;
@@ -99,15 +103,15 @@ public class Query {
     }
 
 
-    public List<Filter> getFilters() {
+    @JsonProperty("filter")
+    public List<Variable> getFilters() {
         return filters;
     }
 
-    public void setFilters(List<Filter> filters) {
+    public void setFilters(List<Variable> filters) {
         this.filters = filters;
     }
 
-
     public String getRequest() {
         return request;
     }
diff --git a/src/main/java/eu/hbp/mip/repositories/FilterRepository.java b/src/main/java/eu/hbp/mip/repositories/FilterRepository.java
deleted file mode 100644
index d8d8e5ff4..000000000
--- a/src/main/java/eu/hbp/mip/repositories/FilterRepository.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package eu.hbp.mip.repositories;
-
-import eu.hbp.mip.model.Filter;
-import org.springframework.data.repository.CrudRepository;
-
-/**
- * Created by mirco on 11.07.16.
- */
-
-public interface FilterRepository extends CrudRepository<Filter, Long> {
-}
diff --git a/src/main/resources/db/migration/V3_0__AddFilter.sql b/src/main/resources/db/migration/V3_0__AddFilter.sql
index 202fc3d8e..731e54b8e 100644
--- a/src/main/resources/db/migration/V3_0__AddFilter.sql
+++ b/src/main/resources/db/migration/V3_0__AddFilter.sql
@@ -1 +1,8 @@
-ALTER TABLE query ADD COLUMN sql_filter text;
\ No newline at end of file
+ALTER TABLE query ADD COLUMN sql_filter text;
+
+ALTER TABLE query_filter DROP COLUMN filters_id;
+DROP TABLE filter_values, filter;
+
+ALTER TABLE query_filter ADD COLUMN code character varying(255) NOT NULL;
+ALTER TABLE ONLY query_filter
+    ADD CONSTRAINT fk_1 FOREIGN KEY (query_id) REFERENCES query(id);
\ No newline at end of file
-- 
GitLab