You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by ta...@apache.org on 2021/02/04 11:52:58 UTC

[unomi] 01/01: UNOMI-424 Fix buildQuery for BooleanConditionESQueryBuilder

This is an automated email from the ASF dual-hosted git repository.

taybou pushed a commit to branch UNOMI-424-build-query
in repository https://gitbox.apache.org/repos/asf/unomi.git

commit 24036e01f461a3e559675bd06d881c28162947c8
Author: Taybou <be...@gmail.com>
AuthorDate: Thu Feb 4 12:52:41 2021 +0100

    UNOMI-424 Fix buildQuery for BooleanConditionESQueryBuilder
    
    add and fix IT
---
 .../apache/unomi/itests/ConditionEvaluatorIT.java  | 105 ++++++++++++---------
 .../conditions/BooleanConditionESQueryBuilder.java |   6 +-
 2 files changed, 59 insertions(+), 52 deletions(-)

diff --git a/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java b/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java
index 5a2421e..a1f93a6 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java
@@ -43,7 +43,6 @@ import static org.junit.Assert.*;
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerSuite.class)
 public class ConditionEvaluatorIT extends BaseIT {
-
     protected ConditionBuilder builder;
     protected Item item;
     protected Date lastVisit;
@@ -61,8 +60,9 @@ public class ConditionEvaluatorIT extends BaseIT {
     public void setUp() {
         assertNotNull("Definition service should be available", definitionsService);
         assertNotNull("Persistence service should be available", persistenceService);
+        builder = new ConditionBuilder(definitionsService);
 
-        lastVisit = new GregorianCalendar(2015,1,1,20,30,0).getTime();
+        lastVisit = new GregorianCalendar(2015, Calendar.FEBRUARY,1,20,30,0).getTime();
 
         Profile profile = new Profile("profile-" + UUID.randomUUID().toString());
         profile.setProperty("firstVisit", lastVisit);
@@ -70,37 +70,34 @@ public class ConditionEvaluatorIT extends BaseIT {
         profile.setProperty("gender", "female");
         profile.setProperty("lastVisit", lastVisit);
         profile.setProperty("randomStats", 0.15);
-        profile.setSegments(new HashSet<String>(Arrays.asList("s1", "s2", "s3")));
-        this.item = profile;
-        builder = new ConditionBuilder(definitionsService);
-
+        profile.setSegments(new HashSet<>(Arrays.asList("s1", "s2", "s3")));
+        item = profile;
     }
 
     @Test
     public void testCompound() {
         // test AND
         assertTrue(eval(builder.and(builder.profileProperty("properties.gender").equalTo("female"),
-                builder.profileProperty("properties.age").equalTo(Integer.valueOf(30))).build()));
-        //assertFalse(eval(builder.and(builder.profileProperty("properties.gender").equalTo("male"),
-        //        builder.profileProperty("properties.age").equalTo(Integer.valueOf(30))).build()));
-        //assertFalse(eval(builder.and(builder.profileProperty("properties.gender").equalTo("female"),
-        //        builder.profileProperty("properties.age").equalTo(Integer.valueOf(40))).build()));
+                builder.profileProperty("properties.age").equalTo(30)).build()));
+        assertFalse(eval(builder.and(builder.profileProperty("properties.gender").equalTo("male"),
+                builder.profileProperty("properties.age").equalTo(30)).build()));
+        assertFalse(eval(builder.and(builder.profileProperty("properties.gender").equalTo("female"),
+                builder.profileProperty("properties.age").equalTo(40)).build()));
 
         // test OR
         assertTrue(eval(builder.or(builder.profileProperty("properties.gender").equalTo("female"),
-                builder.profileProperty("properties.age").equalTo(Integer.valueOf(40))).build()));
+                builder.profileProperty("properties.age").equalTo(40)).build()));
         assertTrue(eval(builder.or(builder.profileProperty("properties.gender").equalTo("male"),
-                builder.profileProperty("properties.age").equalTo(Integer.valueOf(30))).build()));
-        //assertFalse(eval(builder.or(builder.profileProperty("properties.gender").equalTo("male"),
-        //        builder.profileProperty("properties.age").equalTo(Integer.valueOf(40))).build()));
+                builder.profileProperty("properties.age").equalTo(30)).build()));
+        assertFalse(eval(builder.or(builder.profileProperty("properties.gender").equalTo("male"),
+                builder.profileProperty("properties.age").equalTo(40)).build()));
 
         // test NOT
         assertTrue(eval(builder.not(builder.profileProperty("properties.gender").equalTo("male")).build()));
-        //assertFalse(eval(builder.not(builder.profileProperty("properties.age").equalTo(Integer.valueOf(30))).build()));
-
+        assertFalse(eval(builder.not(builder.profileProperty("properties.age").equalTo(30)).build()));
     }
 
-    //@Test
+    @Test
     public void testDate() {
         assertTrue(eval(builder.profileProperty("properties.lastVisit").equalTo(lastVisit).build()));
         assertTrue(eval(builder.profileProperty("properties.lastVisit")
@@ -118,34 +115,31 @@ public class ConditionEvaluatorIT extends BaseIT {
                 .all(new Date(lastVisit.getTime() + 10000), lastVisit).build()));
 
         assertTrue(eval(builder.profileProperty("properties.lastVisit").isDay(lastVisit).build()));
-        assertTrue(eval(builder.profileProperty("properties.lastVisit").isNotDay(new Date(lastVisit.getTime() + 10000)).build()));
+        assertTrue(eval(builder.profileProperty("properties.lastVisit").isNotDay(new Date(lastVisit.getTime() + (24*60*60*1000))).build()));
     }
 
     @Test
     public void testExistence() {
-        /*assertTrue("Gender property does not exist",
-                eval(builder.profileProperty("properties.gender").exists().build()));
+        assertTrue("Gender property does not exist", eval(builder.profileProperty("properties.gender").exists().build()));
         assertFalse("Gender property missing", eval(builder.profileProperty("properties.gender").missing().build()));
         assertTrue("Strange property exists", eval(builder.profileProperty("properties.unknown").missing().build()));
-        assertFalse("Strange property exists", eval(builder.profileProperty("properties.unknown").exists().build()));*/
+        assertFalse("Strange property exists", eval(builder.profileProperty("properties.unknown").exists().build()));
     }
 
     @Test
     public void testInteger() {
-        assertTrue(eval(builder.profileProperty("properties.age").equalTo(Integer.valueOf(30)).build()));
-        assertTrue(eval(builder.not(builder.profileProperty("properties.age").equalTo(Integer.valueOf(40))).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").notEqualTo(Integer.valueOf(40)).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").lessThan(Integer.valueOf(40)).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").greaterThan(Integer.valueOf(20)).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").greaterThanOrEqualTo(Integer.valueOf(30)).build()));
-        //assertFalse(eval(builder.profileProperty("properties.age").greaterThanOrEqualTo(Integer.valueOf(31)).build()));
-
-        assertTrue(eval(builder.profileProperty("properties.age").in(Integer.valueOf(30)).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").in(Integer.valueOf(31), Integer.valueOf(30)).build()));
-        assertTrue(eval(builder.profileProperty("properties.age").notIn(Integer.valueOf(25), Integer.valueOf(26))
-                .build()));
-        //assertFalse(eval(builder.profileProperty("properties.age").notIn(Integer.valueOf(25), Integer.valueOf(30))
-        //        .build()));
+        assertTrue(eval(builder.profileProperty("properties.age").equalTo(30).build()));
+        assertTrue(eval(builder.not(builder.profileProperty("properties.age").equalTo(40)).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").notEqualTo(40).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").lessThan(40).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").greaterThan(20).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").greaterThanOrEqualTo(30).build()));
+        assertFalse(eval(builder.profileProperty("properties.age").greaterThanOrEqualTo(31).build()));
+
+        assertTrue(eval(builder.profileProperty("properties.age").in(30).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").in(31, 30).build()));
+        assertTrue(eval(builder.profileProperty("properties.age").notIn(25, 26).build()));
+        assertFalse(eval(builder.profileProperty("properties.age").notIn(25, 30).build()));
     }
 
     @Test
@@ -167,34 +161,51 @@ public class ConditionEvaluatorIT extends BaseIT {
     public void testMultiValue() {
         assertTrue(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "in")
                 .parameter("segments", "s10", "s20", "s2").build()));
-        //assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "in")
-        //        .parameter("segments", "s10", "s20", "s30").build()));
+        assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "in")
+                .parameter("segments", "s10", "s20", "s30").build()));
         assertTrue(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "notIn")
                 .parameter("segments", "s10", "s20", "s30").build()));
-        //assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "notIn")
-        //        .parameter("segments", "s10", "s20", "s2").build()));
+        assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "notIn")
+                .parameter("segments", "s10", "s20", "s2").build()));
         assertTrue(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "all")
                 .parameter("segments", "s1", "s2").build()));
-        //assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "all")
-        //        .parameter("segments", "s1", "s5").build()));
+        assertFalse(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "all")
+                .parameter("segments", "s1", "s5").build()));
     }
 
     @Test
     public void testString() {
         assertTrue(eval(builder.profileProperty("properties.gender").equalTo("female").build()));
-        //assertFalse(eval(builder.not(builder.profileProperty("properties.gender").equalTo("female")).build()));
+        assertFalse(eval(builder.not(builder.profileProperty("properties.gender").equalTo("female")).build()));
         assertTrue(eval(builder.profileProperty("properties.gender").notEqualTo("male").build()));
-        //assertFalse(eval(builder.not(builder.profileProperty("properties.gender").notEqualTo("male")).build()));
+        assertFalse(eval(builder.not(builder.profileProperty("properties.gender").notEqualTo("male")).build()));
         assertTrue(eval(builder.profileProperty("properties.gender").startsWith("fe").build()));
         assertTrue(eval(builder.profileProperty("properties.gender").endsWith("le").build()));
         assertTrue(eval(builder.profileProperty("properties.gender").contains("fem").build()));
-        //assertFalse(eval(builder.profileProperty("properties.gender").contains("mu").build()));
+        assertFalse(eval(builder.profileProperty("properties.gender").contains("mu").build()));
         assertTrue(eval(builder.profileProperty("properties.gender").matchesRegex(".*ale").build()));
 
         assertTrue(eval(builder.profileProperty("properties.gender").in("male", "female").build()));
         assertTrue(eval(builder.profileProperty("properties.gender").notIn("one", "two").build()));
-        //assertFalse(eval(builder.profileProperty("properties.gender").notIn("one", "two", "female").build()));
+        assertFalse(eval(builder.profileProperty("properties.gender").notIn("one", "two", "female").build()));
         assertTrue(eval(builder.profileProperty("properties.gender").all("female").build()));
-        //assertFalse(eval(builder.profileProperty("properties.gender").all("male", "female").build()));
+        assertFalse(eval(builder.profileProperty("properties.gender").all("male", "female").build()));
+    }
+
+    @Test
+    public void testRange() {
+        // test AND
+        Condition condition = builder.and(
+                builder.profileProperty("properties.gender").equalTo("female"),
+                builder.profileProperty("properties.age").greaterThanOrEqualTo(40)
+        ).build();
+        assertFalse(eval(condition));
+
+        // test OR
+        condition = builder.or(
+                builder.profileProperty("properties.gender").equalTo("female"),
+                builder.profileProperty("properties.age").greaterThanOrEqualTo(40)
+        ).build();
+        assertTrue(eval(condition));
     }
 }
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
index 8a7a381..574fcc8 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
@@ -65,11 +65,7 @@ public class BooleanConditionESQueryBuilder implements ConditionESQueryBuilder {
             } else {
                 QueryBuilder orFilter = dispatcher.buildFilter(conditions.get(i), context);
                 if (orFilter != null) {
-                    if (orFilter.getName().equals("range")) {
-                        boolQueryBuilder.filter(orFilter);
-                    } else {
-                        boolQueryBuilder.should(orFilter);
-                    }
+                    boolQueryBuilder.should(orFilter);
                 } else {
                     logger.warn("Null filter for boolean OR sub condition " + conditions.get(i));
                 }