Jackie-Jiang commented on a change in pull request #8451:
URL: https://github.com/apache/pinot/pull/8451#discussion_r840896309



##########
File path: 
pinot-core/src/main/java/org/apache/pinot/core/plan/maker/InstancePlanMakerImplV2.java
##########
@@ -281,4 +287,80 @@ public PlanNode makeStreamingSegmentPlanNode(IndexSegment 
indexSegment, QueryCon
       return new StreamingSelectionPlanNode(indexSegment, queryContext);
     }
   }
+
+  /**
+   * In-place rewrite QueryContext based on the information from local 
IndexSegment.
+   *
+   * @param queryContext
+   * @param indexSegment
+   */
+  @VisibleForTesting
+  public static void rewriteQueryContextWithHints(QueryContext queryContext, 
IndexSegment indexSegment) {
+    Map<ExpressionContext, ExpressionContext> expressionOverrideHints = 
queryContext.getExpressionOverrideHints();
+    if (MapUtils.isEmpty(expressionOverrideHints)) {
+      return;
+    }
+
+    List<ExpressionContext> selectExpressions = 
queryContext.getSelectExpressions();
+    selectExpressions.replaceAll(
+        expression -> overrideWithExpressionHints(expression, indexSegment, 
expressionOverrideHints));
+
+    List<ExpressionContext> groupByExpressions = 
queryContext.getGroupByExpressions();
+    if (CollectionUtils.isNotEmpty(groupByExpressions)) {
+      groupByExpressions.replaceAll(
+          expression -> overrideWithExpressionHints(expression, indexSegment, 
expressionOverrideHints));
+    }
+
+    List<OrderByExpressionContext> orderByExpressions = 
queryContext.getOrderByExpressions();
+    if (CollectionUtils.isNotEmpty(orderByExpressions)) {
+      orderByExpressions.replaceAll(expression -> new OrderByExpressionContext(
+          overrideWithExpressionHints(expression.getExpression(), 
indexSegment, expressionOverrideHints),
+          expression.isAsc()));
+    }
+
+    // In-place override
+    FilterContext filter = queryContext.getFilter();
+    if (filter != null) {
+      overrideWithExpressionHints(filter, indexSegment, 
expressionOverrideHints);
+    }
+
+    // In-place override
+    FilterContext havingFilter = queryContext.getHavingFilter();
+    if (havingFilter != null) {
+      overrideWithExpressionHints(havingFilter, indexSegment, 
expressionOverrideHints);
+    }
+  }
+
+  @VisibleForTesting
+  public static void overrideWithExpressionHints(FilterContext filter, 
IndexSegment indexSegment,
+      Map<ExpressionContext, ExpressionContext> expressionOverrideHints) {
+    if (filter.getChildren() != null) {
+      // AND, OR, NOT
+      for (FilterContext child : filter.getChildren()) {
+        overrideWithExpressionHints(child, indexSegment, 
expressionOverrideHints);
+      }
+    } else {
+      // PREDICATE
+      Predicate predicate = filter.getPredicate();
+      predicate.setLhs(overrideWithExpressionHints(predicate.getLhs(), 
indexSegment, expressionOverrideHints));
+    }
+  }
+
+  @VisibleForTesting
+  public static ExpressionContext 
overrideWithExpressionHints(ExpressionContext expression, IndexSegment 
indexSegment,
+      Map<ExpressionContext, ExpressionContext> expressionOverrideHints) {
+    if (expression.getType() != ExpressionContext.Type.FUNCTION) {
+      return expression;
+    }
+    ExpressionContext overrideExpression = 
expressionOverrideHints.get(expression);
+    if (overrideExpression != null && overrideExpression.getIdentifier() != 
null
+        && 
indexSegment.getColumnNames().contains(overrideExpression.getIdentifier())) {
+      return overrideExpression;
+    }
+    List<ExpressionContext> arguments = 
expression.getFunction().getArguments();
+    for (int i = 0; i < arguments.size(); i++) {
+      arguments.set(i, overrideWithExpressionHints(arguments.get(i), 
indexSegment, expressionOverrideHints));

Review comment:
       (minor) Use `replaceAll`




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to