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/17 14:55:08 UTC

[unomi] branch master updated: UNOMI-419 - on segment creation, validate segment condition and logging errors (#238)

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

taybou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/master by this push:
     new 1565f21  UNOMI-419 - on segment creation, validate segment condition and logging errors (#238)
1565f21 is described below

commit 1565f21c6c0f8c2a37a401a2c33247e3eb4f0e4c
Author: giladw <gw...@yotpo.com>
AuthorDate: Wed Feb 17 16:55:01 2021 +0200

    UNOMI-419 - on segment creation, validate segment condition and logging errors (#238)
    
    * on segment creation, validate segment condition and logging errors
    
    * use save with alwaysOverwrite to ensure update of segment
    
    * change condition validation to return boolean
---
 .../elasticsearch/ElasticSearchPersistenceServiceImpl.java | 14 ++++++++++++++
 .../apache/unomi/persistence/spi/PersistenceService.java   |  8 ++++++++
 .../unomi/services/impl/segments/SegmentServiceImpl.java   |  8 ++++++--
 3 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
index 5ddeafd..2f5a3bc 100644
--- a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
+++ b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
@@ -1537,6 +1537,20 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService,
     }
 
     @Override
+    public boolean isValidCondition(Condition query, Item item) {
+        try {
+            conditionEvaluatorDispatcher.eval(query, item);
+            QueryBuilder builder = QueryBuilders.boolQuery()
+                    .must(QueryBuilders.idsQuery().addIds(item.getItemId()))
+                    .must(conditionESQueryBuilderDispatcher.buildFilter(query));
+        } catch (Exception e) {
+            logger.error("failed at setSegmentDefinition, condition={}", query.toString(), e);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
     public boolean testMatch(Condition query, Item item) {
         long startTime = System.currentTimeMillis();
         try {
diff --git a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
index ef669a0..c054ba0 100644
--- a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
+++ b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PersistenceService.java
@@ -306,6 +306,14 @@ public interface PersistenceService {
     boolean testMatch(Condition query, Item item);
 
     /**
+     * validates if a condition throws exception at query build.
+     *
+     * @param query the condition we're testing the specified item against
+     * @param item  the item we're checking against the specified condition
+     * @return {@code true} if the item satisfies the condition, {@code false} otherwise
+     */
+    boolean isValidCondition(Condition query, Item item);
+    /**
      * Same as {@code query(fieldName, fieldValue, sortBy, clazz, 0, -1).getList()}
      *
      * @see #query(Condition, String, Class, int, int)
diff --git a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
index e971432..a0a1a02 100644
--- a/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/impl/segments/SegmentServiceImpl.java
@@ -234,12 +234,14 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
 
     public void setSegmentDefinition(Segment segment) {
         ParserHelper.resolveConditionType(definitionsService, segment.getCondition());
+        if (persistenceService.isValidCondition(segment.getCondition(), new Profile()) == false)
+            throw new BadSegmentConditionException();
+
         if (segment.getMetadata().isEnabled() && !segment.getMetadata().isMissingPlugins()) {
             updateAutoGeneratedRules(segment.getMetadata(), segment.getCondition());
         }
         // make sure we update the name and description metadata that might not match, so first we remove the entry from the map
-        persistenceService.save(segment);
-
+        persistenceService.save(segment, null, true);
         updateExistingProfilesForSegment(segment);
     }
 
@@ -1098,4 +1100,6 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
         this.taskExecutionPeriod = taskExecutionPeriod;
     }
 
+    private class BadSegmentConditionException extends RuntimeException {
+    }
 }