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

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


The following commit(s) were added to refs/heads/master by this push:
     new 088da3f8c2 deduplicate predicates optimistically (#8687)
088da3f8c2 is described below

commit 088da3f8c2f7077c51b7d8531b7b967ad1cf58c6
Author: Richard Startin <rich...@startree.ai>
AuthorDate: Thu May 12 21:07:03 2022 +0200

    deduplicate predicates optimistically (#8687)
---
 .../plan/AggregationGroupByOrderByPlanNode.java    |  2 +-
 .../pinot/core/plan/AggregationPlanNode.java       |  2 +-
 .../org/apache/pinot/core/plan/FilterPlanNode.java | 20 ++++++++----------
 .../apache/pinot/core/startree/StarTreeUtils.java  | 24 ++++++++++++++--------
 .../pinot/core/startree/v2/BaseStarTreeV2Test.java |  2 +-
 .../org/apache/pinot/perf/BenchmarkQueries.java    |  6 +++++-
 6 files changed, 31 insertions(+), 25 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByOrderByPlanNode.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByOrderByPlanNode.java
index 58118f4960..6451b43c83 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByOrderByPlanNode.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByOrderByPlanNode.java
@@ -70,7 +70,7 @@ public class AggregationGroupByOrderByPlanNode implements 
PlanNode {
       if (aggregationFunctionColumnPairs != null) {
         Map<String, List<CompositePredicateEvaluator>> predicateEvaluatorsMap =
             StarTreeUtils.extractPredicateEvaluatorsMap(_indexSegment, 
_queryContext.getFilter(),
-                filterPlanNode.getPredicateEvaluatorMap());
+                filterPlanNode.getPredicateEvaluators());
         if (predicateEvaluatorsMap != null) {
           for (StarTreeV2 starTreeV2 : starTrees) {
             if (StarTreeUtils.isFitForStarTree(starTreeV2.getMetadata(), 
aggregationFunctionColumnPairs,
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationPlanNode.java 
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationPlanNode.java
index 7ee09c300c..e0ea896609 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationPlanNode.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationPlanNode.java
@@ -204,7 +204,7 @@ public class AggregationPlanNode implements PlanNode {
       if (aggregationFunctionColumnPairs != null) {
         Map<String, List<CompositePredicateEvaluator>> predicateEvaluatorsMap =
             StarTreeUtils.extractPredicateEvaluatorsMap(_indexSegment, 
_queryContext.getFilter(),
-                filterPlanNode.getPredicateEvaluatorMap());
+                filterPlanNode.getPredicateEvaluators());
         if (predicateEvaluatorsMap != null) {
           for (StarTreeV2 starTreeV2 : starTrees) {
             if (StarTreeUtils.isFitForStarTree(starTreeV2.getMetadata(), 
aggregationFunctionColumnPairs, null,
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/plan/FilterPlanNode.java 
b/pinot-core/src/main/java/org/apache/pinot/core/plan/FilterPlanNode.java
index 7bc1a4f642..14b0146ff1 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/plan/FilterPlanNode.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/plan/FilterPlanNode.java
@@ -21,10 +21,9 @@ package org.apache.pinot.core.plan;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import javax.annotation.Nullable;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.pinot.common.request.context.ExpressionContext;
 import org.apache.pinot.common.request.context.FilterContext;
 import org.apache.pinot.common.request.context.FunctionContext;
@@ -68,7 +67,7 @@ public class FilterPlanNode implements PlanNode {
   private final FilterContext _filter;
 
   // Cache the predicate evaluators
-  private final Map<Predicate, PredicateEvaluator> _predicateEvaluatorMap = 
new HashMap<>();
+  private final List<Pair<Predicate, PredicateEvaluator>> _predicateEvaluators 
= new ArrayList<>(4);
 
   public FilterPlanNode(IndexSegment indexSegment, QueryContext queryContext) {
     this(indexSegment, queryContext, null);
@@ -106,10 +105,10 @@ public class FilterPlanNode implements PlanNode {
   }
 
   /**
-   * Returns a map from predicates to their evaluators.
+   * Returns a mapping from predicates to their evaluators.
    */
-  public Map<Predicate, PredicateEvaluator> getPredicateEvaluatorMap() {
-    return _predicateEvaluatorMap;
+  public List<Pair<Predicate, PredicateEvaluator>> getPredicateEvaluators() {
+    return _predicateEvaluators;
   }
 
   /**
@@ -240,10 +239,7 @@ public class FilterPlanNode implements PlanNode {
         } else {
           String column = lhs.getIdentifier();
           DataSource dataSource = _indexSegment.getDataSource(column);
-          PredicateEvaluator predicateEvaluator = 
_predicateEvaluatorMap.get(predicate);
-          if (predicateEvaluator != null) {
-            return 
FilterOperatorUtils.getLeafFilterOperator(predicateEvaluator, dataSource, 
numDocs);
-          }
+          PredicateEvaluator predicateEvaluator;
           switch (predicate.getType()) {
             case TEXT_CONTAINS:
               TextIndexReader textIndexReader = dataSource.getTextIndex();
@@ -278,7 +274,7 @@ public class FilterPlanNode implements PlanNode {
                     
PredicateEvaluatorProvider.getPredicateEvaluator(predicate, 
dataSource.getDictionary(),
                         dataSource.getDataSourceMetadata().getDataType());
               }
-              _predicateEvaluatorMap.put(predicate, predicateEvaluator);
+              _predicateEvaluators.add(Pair.of(predicate, predicateEvaluator));
               return 
FilterOperatorUtils.getLeafFilterOperator(predicateEvaluator, dataSource, 
numDocs);
             case JSON_MATCH:
               JsonIndexReader jsonIndex = dataSource.getJsonIndex();
@@ -303,7 +299,7 @@ public class FilterPlanNode implements PlanNode {
               predicateEvaluator =
                   PredicateEvaluatorProvider.getPredicateEvaluator(predicate, 
dataSource.getDictionary(),
                       dataSource.getDataSourceMetadata().getDataType());
-              _predicateEvaluatorMap.put(predicate, predicateEvaluator);
+              _predicateEvaluators.add(Pair.of(predicate, predicateEvaluator));
               return 
FilterOperatorUtils.getLeafFilterOperator(predicateEvaluator, dataSource, 
numDocs);
           }
         }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/startree/StarTreeUtils.java 
b/pinot-core/src/main/java/org/apache/pinot/core/startree/StarTreeUtils.java
index 12c2ee5bd3..ada24ad19b 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/startree/StarTreeUtils.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/startree/StarTreeUtils.java
@@ -18,11 +18,11 @@
  */
 package org.apache.pinot.core.startree;
 
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
@@ -94,13 +94,13 @@ public class StarTreeUtils {
    */
   @Nullable
   public static Map<String, List<CompositePredicateEvaluator>> 
extractPredicateEvaluatorsMap(IndexSegment indexSegment,
-      @Nullable FilterContext filter, Map<Predicate, PredicateEvaluator> 
predicateEvaluatorMap) {
+      @Nullable FilterContext filter, List<Pair<Predicate, 
PredicateEvaluator>> predicateEvaluatorMapping) {
     if (filter == null) {
       return Collections.emptyMap();
     }
 
     Map<String, List<CompositePredicateEvaluator>> predicateEvaluatorsMap = 
new HashMap<>();
-    Queue<FilterContext> queue = new LinkedList<>();
+    Queue<FilterContext> queue = new ArrayDeque<>();
     queue.add(filter);
     FilterContext filterNode;
     while ((filterNode = queue.poll()) != null) {
@@ -110,7 +110,7 @@ public class StarTreeUtils {
           break;
         case OR:
           Pair<String, List<PredicateEvaluator>> pair =
-              isOrClauseValidForStarTree(indexSegment, filterNode, 
predicateEvaluatorMap);
+              isOrClauseValidForStarTree(indexSegment, filterNode, 
predicateEvaluatorMapping);
           if (pair == null) {
             return null;
           }
@@ -126,7 +126,8 @@ public class StarTreeUtils {
           return null;
         case PREDICATE:
           Predicate predicate = filterNode.getPredicate();
-          PredicateEvaluator predicateEvaluator = 
getPredicateEvaluator(indexSegment, predicate, predicateEvaluatorMap);
+          PredicateEvaluator predicateEvaluator = 
getPredicateEvaluator(indexSegment, predicate,
+              predicateEvaluatorMapping);
           if (predicateEvaluator == null) {
             // The predicate cannot be solved with star-tree
             return null;
@@ -187,7 +188,7 @@ public class StarTreeUtils {
    */
   @Nullable
   private static Pair<String, List<PredicateEvaluator>> 
isOrClauseValidForStarTree(IndexSegment indexSegment,
-      FilterContext filter, Map<Predicate, PredicateEvaluator> 
predicateEvaluatorMap) {
+      FilterContext filter, List<Pair<Predicate, PredicateEvaluator>> 
predicateEvaluatorMapping) {
     assert filter.getType() == FilterContext.Type.OR;
 
     List<Predicate> predicates = new ArrayList<>();
@@ -198,7 +199,7 @@ public class StarTreeUtils {
     String identifier = null;
     List<PredicateEvaluator> predicateEvaluators = new ArrayList<>();
     for (Predicate predicate : predicates) {
-      PredicateEvaluator predicateEvaluator = 
getPredicateEvaluator(indexSegment, predicate, predicateEvaluatorMap);
+      PredicateEvaluator predicateEvaluator = 
getPredicateEvaluator(indexSegment, predicate, predicateEvaluatorMapping);
       if (predicateEvaluator == null) {
         // The predicate cannot be solved with star-tree
         return null;
@@ -258,7 +259,7 @@ public class StarTreeUtils {
    */
   @Nullable
   private static PredicateEvaluator getPredicateEvaluator(IndexSegment 
indexSegment, Predicate predicate,
-      Map<Predicate, PredicateEvaluator> predicateEvaluatorMap) {
+      List<Pair<Predicate, PredicateEvaluator>> predicatesEvaluatorMapping) {
     ExpressionContext lhs = predicate.getLhs();
     if (lhs.getType() != ExpressionContext.Type.IDENTIFIER) {
       // Star-tree does not support non-identifier expression
@@ -283,6 +284,11 @@ public class StarTreeUtils {
       default:
         break;
     }
-    return predicateEvaluatorMap.get(predicate);
+    for (Pair<Predicate, PredicateEvaluator> pair : 
predicatesEvaluatorMapping) {
+      if (pair.getKey().equals(predicate)) {
+        return pair.getValue();
+      }
+    }
+    return null;
   }
 }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/startree/v2/BaseStarTreeV2Test.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/startree/v2/BaseStarTreeV2Test.java
index eab94b4594..ae15c597ef 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/startree/v2/BaseStarTreeV2Test.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/startree/v2/BaseStarTreeV2Test.java
@@ -244,7 +244,7 @@ abstract class BaseStarTreeV2Test<R, A> {
     filterPlanNode.run();
     Map<String, List<CompositePredicateEvaluator>> predicateEvaluatorsMap =
         StarTreeUtils.extractPredicateEvaluatorsMap(_indexSegment, 
queryContext.getFilter(),
-            filterPlanNode.getPredicateEvaluatorMap());
+            filterPlanNode.getPredicateEvaluators());
     assertNotNull(predicateEvaluatorsMap);
 
     // Extract values with star-tree
diff --git 
a/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkQueries.java 
b/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkQueries.java
index 714a6ede56..f1059b94d9 100644
--- a/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkQueries.java
+++ b/pinot-perf/src/main/java/org/apache/pinot/perf/BenchmarkQueries.java
@@ -156,6 +156,10 @@ public class BenchmarkQueries extends BaseQueriesTest {
   public static final String STARTREE_SUM_QUERY = "SELECT INT_COL, SORTED_COL, 
SUM(RAW_INT_COL) from MyTable "
       + "GROUP BY INT_COL, SORTED_COL ORDER BY SORTED_COL, INT_COL ASC";
 
+  public static final String STARTREE_FILTER_QUERY = "SELECT INT_COL, 
SORTED_COL, SUM(RAW_INT_COL) FROM MyTable "
+      + "WHERE INT_COL = 0 and SORTED_COL = 1"
+      + "GROUP BY INT_COL, SORTED_COL ORDER BY SORTED_COL, INT_COL ASC";
+
   @Param("1500000")
   private int _numRows;
   @Param({"EXP(0.001)", "EXP(0.5)", "EXP(0.999)"})
@@ -164,7 +168,7 @@ public class BenchmarkQueries extends BaseQueriesTest {
       MULTI_GROUP_BY_WITH_RAW_QUERY, MULTI_GROUP_BY_WITH_RAW_QUERY_2, 
FILTERED_QUERY, NON_FILTERED_QUERY,
       SUM_QUERY, NO_INDEX_LIKE_QUERY, MULTI_GROUP_BY_ORDER_BY, 
MULTI_GROUP_BY_ORDER_BY_LOW_HIGH, TIME_GROUP_BY,
       RAW_COLUMN_SUMMARY_STATS, COUNT_OVER_BITMAP_INDEX_IN, 
COUNT_OVER_BITMAP_INDEXES,
-      COUNT_OVER_BITMAP_AND_SORTED_INDEXES, COUNT_OVER_BITMAP_INDEX_EQUALS, 
STARTREE_SUM_QUERY
+      COUNT_OVER_BITMAP_AND_SORTED_INDEXES, COUNT_OVER_BITMAP_INDEX_EQUALS, 
STARTREE_SUM_QUERY, STARTREE_FILTER_QUERY
   })
   String _query;
   private IndexSegment _indexSegment;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to