This is an automated email from the ASF dual-hosted git repository.
jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push:
new 51fa476 [QueryContext] Use QueryContext in all PlanNodes (#5579)
51fa476 is described below
commit 51fa4761d5e843d7007e8035a608dee42fbc8c09
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Thu Jun 18 18:42:35 2020 -0700
[QueryContext] Use QueryContext in all PlanNodes (#5579)
Replace BrokerRequest with QueryContext in all PlanNodes
This change can save the redundant expression compilation of:
- Group by expressions
- Selection expreesions
- Order by expressions
Expressions in aggregation and filter will be addressed in the following PRs
---
.../plan/AggregationGroupByOrderByPlanNode.java | 20 ++++---
.../core/plan/AggregationGroupByPlanNode.java | 20 ++++---
.../pinot/core/plan/AggregationPlanNode.java | 14 ++---
.../apache/pinot/core/plan/CombinePlanNode.java | 23 ++++----
.../plan/DictionaryBasedAggregationPlanNode.java | 8 +--
.../apache/pinot/core/plan/DocIdSetPlanNode.java | 10 +---
.../org/apache/pinot/core/plan/FilterPlanNode.java | 16 +++---
.../plan/MetadataBasedAggregationPlanNode.java | 8 +--
.../apache/pinot/core/plan/SelectionPlanNode.java | 64 +++++++++++-----------
.../apache/pinot/core/plan/TransformPlanNode.java | 29 ++++------
.../core/plan/maker/InstancePlanMakerImplV2.java | 16 +++---
.../query/request/context/ExpressionContext.java | 27 +++++++++
.../query/selection/SelectionOperatorUtils.java | 2 +
.../apache/pinot/core/startree/StarTreeUtils.java | 7 ++-
.../pinot/core/plan/CombinePlanNodeTest.java | 17 +++---
.../pinot/core/startree/v2/BaseStarTreeV2Test.java | 5 +-
.../DictionaryBasedGroupKeyGeneratorTest.java | 10 +++-
.../groupby/NoDictionaryGroupKeyGeneratorTest.java | 8 ++-
18 files changed, 171 insertions(+), 133 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 6b72e2f..817362f 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
@@ -20,7 +20,6 @@ package org.apache.pinot.core.plan;
import java.util.List;
import java.util.Set;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.utils.request.FilterQueryTree;
import org.apache.pinot.common.utils.request.RequestUtils;
@@ -28,6 +27,8 @@ import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.query.AggregationGroupByOrderByOperator;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.ExpressionContext;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.startree.StarTreeUtils;
import org.apache.pinot.core.startree.plan.StarTreeTransformPlanNode;
import org.apache.pinot.core.startree.v2.AggregationFunctionColumnPair;
@@ -48,22 +49,23 @@ public class AggregationGroupByOrderByPlanNode implements
PlanNode {
private final TransformPlanNode _transformPlanNode;
private final StarTreeTransformPlanNode _starTreeTransformPlanNode;
- public AggregationGroupByOrderByPlanNode(IndexSegment indexSegment,
BrokerRequest brokerRequest,
+ public AggregationGroupByOrderByPlanNode(IndexSegment indexSegment,
QueryContext queryContext,
int maxInitialResultHolderCapacity, int numGroupsLimit) {
_indexSegment = indexSegment;
_maxInitialResultHolderCapacity = maxInitialResultHolderCapacity;
_numGroupsLimit = numGroupsLimit;
- _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
- List<String> groupByExpressions =
brokerRequest.getGroupBy().getExpressions();
+ _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(queryContext.getBrokerRequest());
+ List<ExpressionContext> groupByExpressions =
queryContext.getGroupByExpressions();
+ assert groupByExpressions != null;
int numGroupByExpressions = groupByExpressions.size();
_groupByExpressions = new TransformExpressionTree[numGroupByExpressions];
for (int i = 0; i < numGroupByExpressions; i++) {
- _groupByExpressions[i] =
TransformExpressionTree.compileToExpressionTree(groupByExpressions.get(i));
+ _groupByExpressions[i] =
groupByExpressions.get(i).toTransformExpressionTree();
}
List<StarTreeV2> starTrees = indexSegment.getStarTrees();
if (starTrees != null) {
- if (!StarTreeUtils.isStarTreeDisabled(brokerRequest)) {
+ if (!StarTreeUtils.isStarTreeDisabled(queryContext)) {
int numAggregationFunctions = _aggregationFunctions.length;
AggregationFunctionColumnPair[] aggregationFunctionColumnPairs =
new AggregationFunctionColumnPair[numAggregationFunctions];
@@ -79,7 +81,7 @@ public class AggregationGroupByOrderByPlanNode implements
PlanNode {
}
}
if (!hasUnsupportedAggregationFunction) {
- FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(brokerRequest);
+ FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(queryContext.getBrokerRequest());
for (StarTreeV2 starTreeV2 : starTrees) {
if (StarTreeUtils
.isFitForStarTree(starTreeV2.getMetadata(),
aggregationFunctionColumnPairs, _groupByExpressions,
@@ -87,7 +89,7 @@ public class AggregationGroupByOrderByPlanNode implements
PlanNode {
_transformPlanNode = null;
_starTreeTransformPlanNode =
new StarTreeTransformPlanNode(starTreeV2,
aggregationFunctionColumnPairs, _groupByExpressions,
- rootFilterNode, brokerRequest.getDebugOptions());
+ rootFilterNode, queryContext.getDebugOptions());
return;
}
}
@@ -97,7 +99,7 @@ public class AggregationGroupByOrderByPlanNode implements
PlanNode {
Set<TransformExpressionTree> expressionsToTransform =
AggregationFunctionUtils.collectExpressionsToTransform(_aggregationFunctions,
_groupByExpressions);
- _transformPlanNode = new TransformPlanNode(_indexSegment, brokerRequest,
expressionsToTransform);
+ _transformPlanNode = new TransformPlanNode(_indexSegment, queryContext,
expressionsToTransform);
_starTreeTransformPlanNode = null;
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByPlanNode.java
index d5245a4..b652fa2 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByPlanNode.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/plan/AggregationGroupByPlanNode.java
@@ -20,7 +20,6 @@ package org.apache.pinot.core.plan;
import java.util.List;
import java.util.Set;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.utils.request.FilterQueryTree;
import org.apache.pinot.common.utils.request.RequestUtils;
@@ -28,6 +27,8 @@ import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.query.AggregationGroupByOperator;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.ExpressionContext;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.startree.StarTreeUtils;
import org.apache.pinot.core.startree.plan.StarTreeTransformPlanNode;
import org.apache.pinot.core.startree.v2.AggregationFunctionColumnPair;
@@ -48,22 +49,23 @@ public class AggregationGroupByPlanNode implements PlanNode
{
private final TransformPlanNode _transformPlanNode;
private final StarTreeTransformPlanNode _starTreeTransformPlanNode;
- public AggregationGroupByPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest,
+ public AggregationGroupByPlanNode(IndexSegment indexSegment, QueryContext
queryContext,
int maxInitialResultHolderCapacity, int numGroupsLimit) {
_indexSegment = indexSegment;
_maxInitialResultHolderCapacity = maxInitialResultHolderCapacity;
_numGroupsLimit = numGroupsLimit;
- _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
- List<String> groupByExpressions =
brokerRequest.getGroupBy().getExpressions();
+ _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(queryContext.getBrokerRequest());
+ List<ExpressionContext> groupByExpressions =
queryContext.getGroupByExpressions();
+ assert groupByExpressions != null;
int numGroupByExpressions = groupByExpressions.size();
_groupByExpressions = new TransformExpressionTree[numGroupByExpressions];
for (int i = 0; i < numGroupByExpressions; i++) {
- _groupByExpressions[i] =
TransformExpressionTree.compileToExpressionTree(groupByExpressions.get(i));
+ _groupByExpressions[i] =
groupByExpressions.get(i).toTransformExpressionTree();
}
List<StarTreeV2> starTrees = indexSegment.getStarTrees();
if (starTrees != null) {
- if (!StarTreeUtils.isStarTreeDisabled(brokerRequest)) {
+ if (!StarTreeUtils.isStarTreeDisabled(queryContext)) {
int numAggregationFunctions = _aggregationFunctions.length;
AggregationFunctionColumnPair[] aggregationFunctionColumnPairs =
new AggregationFunctionColumnPair[numAggregationFunctions];
@@ -79,7 +81,7 @@ public class AggregationGroupByPlanNode implements PlanNode {
}
}
if (!hasUnsupportedAggregationFunction) {
- FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(brokerRequest);
+ FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(queryContext.getBrokerRequest());
for (StarTreeV2 starTreeV2 : starTrees) {
if (StarTreeUtils
.isFitForStarTree(starTreeV2.getMetadata(),
aggregationFunctionColumnPairs, _groupByExpressions,
@@ -87,7 +89,7 @@ public class AggregationGroupByPlanNode implements PlanNode {
_transformPlanNode = null;
_starTreeTransformPlanNode =
new StarTreeTransformPlanNode(starTreeV2,
aggregationFunctionColumnPairs, _groupByExpressions,
- rootFilterNode, brokerRequest.getDebugOptions());
+ rootFilterNode, queryContext.getDebugOptions());
return;
}
}
@@ -97,7 +99,7 @@ public class AggregationGroupByPlanNode implements PlanNode {
Set<TransformExpressionTree> expressionsToTransform =
AggregationFunctionUtils.collectExpressionsToTransform(_aggregationFunctions,
_groupByExpressions);
- _transformPlanNode = new TransformPlanNode(_indexSegment, brokerRequest,
expressionsToTransform);
+ _transformPlanNode = new TransformPlanNode(_indexSegment, queryContext,
expressionsToTransform);
_starTreeTransformPlanNode = null;
}
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 bf92218..1d0657c 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
@@ -20,7 +20,6 @@ package org.apache.pinot.core.plan;
import java.util.List;
import java.util.Set;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.utils.request.FilterQueryTree;
import org.apache.pinot.common.utils.request.RequestUtils;
@@ -28,6 +27,7 @@ import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.query.AggregationOperator;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.startree.StarTreeUtils;
import org.apache.pinot.core.startree.plan.StarTreeTransformPlanNode;
import org.apache.pinot.core.startree.v2.AggregationFunctionColumnPair;
@@ -45,13 +45,13 @@ public class AggregationPlanNode implements PlanNode {
private final TransformPlanNode _transformPlanNode;
private final StarTreeTransformPlanNode _starTreeTransformPlanNode;
- public AggregationPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest) {
+ public AggregationPlanNode(IndexSegment indexSegment, QueryContext
queryContext) {
_indexSegment = indexSegment;
- _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
+ _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(queryContext.getBrokerRequest());
List<StarTreeV2> starTrees = indexSegment.getStarTrees();
if (starTrees != null) {
- if (!StarTreeUtils.isStarTreeDisabled(brokerRequest)) {
+ if (!StarTreeUtils.isStarTreeDisabled(queryContext)) {
int numAggregationFunctions = _aggregationFunctions.length;
AggregationFunctionColumnPair[] aggregationFunctionColumnPairs =
new AggregationFunctionColumnPair[numAggregationFunctions];
@@ -67,14 +67,14 @@ public class AggregationPlanNode implements PlanNode {
}
}
if (!hasUnsupportedAggregationFunction) {
- FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(brokerRequest);
+ FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(queryContext.getBrokerRequest());
for (StarTreeV2 starTreeV2 : starTrees) {
if (StarTreeUtils
.isFitForStarTree(starTreeV2.getMetadata(),
aggregationFunctionColumnPairs, null, rootFilterNode)) {
_transformPlanNode = null;
_starTreeTransformPlanNode =
new StarTreeTransformPlanNode(starTreeV2,
aggregationFunctionColumnPairs, null, rootFilterNode,
- brokerRequest.getDebugOptions());
+ queryContext.getDebugOptions());
return;
}
}
@@ -84,7 +84,7 @@ public class AggregationPlanNode implements PlanNode {
Set<TransformExpressionTree> expressionsToTransform =
AggregationFunctionUtils.collectExpressionsToTransform(_aggregationFunctions,
null);
- _transformPlanNode = new TransformPlanNode(_indexSegment, brokerRequest,
expressionsToTransform);
+ _transformPlanNode = new TransformPlanNode(_indexSegment, queryContext,
expressionsToTransform);
_starTreeTransformPlanNode = null;
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/CombinePlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/CombinePlanNode.java
index 3a63e64..04a7d4c 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/plan/CombinePlanNode.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/plan/CombinePlanNode.java
@@ -25,13 +25,14 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.core.common.Operator;
import org.apache.pinot.core.operator.CombineGroupByOperator;
import org.apache.pinot.core.operator.CombineGroupByOrderByOperator;
import org.apache.pinot.core.operator.CombineOperator;
import org.apache.pinot.core.operator.blocks.IntermediateResultsBlock;
import org.apache.pinot.core.query.exception.BadQueryRequestException;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import org.apache.pinot.core.query.request.context.utils.QueryContextUtils;
import org.apache.pinot.core.util.QueryOptions;
import org.apache.pinot.core.util.trace.TraceCallable;
@@ -51,7 +52,7 @@ public class CombinePlanNode implements PlanNode {
private static final int TIME_OUT_IN_MILLISECONDS_FOR_PARALLEL_RUN = 10_000;
private final List<PlanNode> _planNodes;
- private final BrokerRequest _brokerRequest;
+ private final QueryContext _queryContext;
private final ExecutorService _executorService;
private final long _timeOutMs;
private final int _numGroupsLimit;
@@ -60,15 +61,15 @@ public class CombinePlanNode implements PlanNode {
* Constructor for the class.
*
* @param planNodes List of underlying plan nodes
- * @param brokerRequest Broker request
+ * @param queryContext Query context
* @param executorService Executor service
* @param timeOutMs Time out in milliseconds for query execution (not for
planning phase)
* @param numGroupsLimit Limit of number of groups stored in each segment
*/
- public CombinePlanNode(List<PlanNode> planNodes, BrokerRequest
brokerRequest, ExecutorService executorService,
+ public CombinePlanNode(List<PlanNode> planNodes, QueryContext queryContext,
ExecutorService executorService,
long timeOutMs, int numGroupsLimit) {
_planNodes = planNodes;
- _brokerRequest = brokerRequest;
+ _queryContext = queryContext;
_executorService = executorService;
_timeOutMs = timeOutMs;
_numGroupsLimit = numGroupsLimit;
@@ -158,17 +159,19 @@ public class CombinePlanNode implements PlanNode {
}
// TODO: use the same combine operator for both aggregation and selection
query.
- if (_brokerRequest.isSetAggregationsInfo() && _brokerRequest.getGroupBy()
!= null) {
+ if (QueryContextUtils.isAggregationQuery(_queryContext) &&
_queryContext.getGroupByExpressions() != null) {
// Aggregation group-by query
- QueryOptions queryOptions = new
QueryOptions(_brokerRequest.getQueryOptions());
+ QueryOptions queryOptions = new
QueryOptions(_queryContext.getQueryOptions());
// new Combine operator only when GROUP_BY_MODE explicitly set to SQL
if (queryOptions.isGroupByModeSQL()) {
- return new CombineGroupByOrderByOperator(operators, _brokerRequest,
_executorService, _timeOutMs);
+ return new CombineGroupByOrderByOperator(operators,
_queryContext.getBrokerRequest(), _executorService,
+ _timeOutMs);
}
- return new CombineGroupByOperator(operators, _brokerRequest,
_executorService, _timeOutMs, _numGroupsLimit);
+ return new CombineGroupByOperator(operators,
_queryContext.getBrokerRequest(), _executorService, _timeOutMs,
+ _numGroupsLimit);
} else {
// Selection or aggregation only query
- return new CombineOperator(operators, _executorService, _timeOutMs,
_brokerRequest);
+ return new CombineOperator(operators, _executorService, _timeOutMs,
_queryContext.getBrokerRequest());
}
}
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/DictionaryBasedAggregationPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/DictionaryBasedAggregationPlanNode.java
index 3168759..19286b5 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/plan/DictionaryBasedAggregationPlanNode.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/plan/DictionaryBasedAggregationPlanNode.java
@@ -20,12 +20,12 @@ package org.apache.pinot.core.plan;
import java.util.HashMap;
import java.util.Map;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.query.DictionaryBasedAggregationOperator;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.segment.index.readers.Dictionary;
@@ -42,11 +42,11 @@ public class DictionaryBasedAggregationPlanNode implements
PlanNode {
* Constructor for the class.
*
* @param indexSegment Segment to process
- * @param brokerRequest Broker request
+ * @param queryContext Query context
*/
- public DictionaryBasedAggregationPlanNode(IndexSegment indexSegment,
BrokerRequest brokerRequest) {
+ public DictionaryBasedAggregationPlanNode(IndexSegment indexSegment,
QueryContext queryContext) {
_indexSegment = indexSegment;
- _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
+ _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(queryContext.getBrokerRequest());
_dictionaryMap = new HashMap<>();
for (AggregationFunction aggregationFunction : _aggregationFunctions) {
String column = ((TransformExpressionTree)
aggregationFunction.getInputExpressions().get(0)).getValue();
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/DocIdSetPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/DocIdSetPlanNode.java
index a4884cd..160fac3 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/plan/DocIdSetPlanNode.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/plan/DocIdSetPlanNode.java
@@ -19,9 +19,9 @@
package org.apache.pinot.core.plan;
import com.google.common.base.Preconditions;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.DocIdSetOperator;
+import org.apache.pinot.core.query.request.context.QueryContext;
public class DocIdSetPlanNode implements PlanNode {
@@ -30,16 +30,12 @@ public class DocIdSetPlanNode implements PlanNode {
private final FilterPlanNode _filterPlanNode;
private final int _maxDocPerCall;
- public DocIdSetPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest, int maxDocPerCall) {
+ public DocIdSetPlanNode(IndexSegment indexSegment, QueryContext
queryContext, int maxDocPerCall) {
Preconditions.checkState(maxDocPerCall > 0 && maxDocPerCall <=
MAX_DOC_PER_CALL);
- _filterPlanNode = new FilterPlanNode(indexSegment, brokerRequest);
+ _filterPlanNode = new FilterPlanNode(indexSegment, queryContext);
_maxDocPerCall = maxDocPerCall;
}
- public DocIdSetPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest) {
- this(indexSegment, brokerRequest, MAX_DOC_PER_CALL);
- }
-
@Override
public DocIdSetOperator run() {
return new DocIdSetOperator(_filterPlanNode.run(), _maxDocPerCall);
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 7090599..12dceba 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
@@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.FilterOperator;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.utils.request.FilterQueryTree;
@@ -40,22 +39,23 @@ import
org.apache.pinot.core.operator.filter.MatchAllFilterOperator;
import org.apache.pinot.core.operator.filter.TextMatchFilterOperator;
import org.apache.pinot.core.operator.filter.predicate.PredicateEvaluator;
import
org.apache.pinot.core.operator.filter.predicate.PredicateEvaluatorProvider;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.segment.index.readers.NullValueVectorReader;
public class FilterPlanNode implements PlanNode {
- private final BrokerRequest _brokerRequest;
- private final IndexSegment _segment;
+ private final IndexSegment _indexSegment;
+ private final QueryContext _queryContext;
- public FilterPlanNode(IndexSegment segment, BrokerRequest brokerRequest) {
- _segment = segment;
- _brokerRequest = brokerRequest;
+ public FilterPlanNode(IndexSegment indexSegment, QueryContext queryContext) {
+ _indexSegment = indexSegment;
+ _queryContext = queryContext;
}
@Override
public BaseFilterOperator run() {
- FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(_brokerRequest);
- return constructPhysicalOperator(rootFilterNode, _segment,
_brokerRequest.getDebugOptions());
+ FilterQueryTree rootFilterNode =
RequestUtils.generateFilterQueryTree(_queryContext.getBrokerRequest());
+ return constructPhysicalOperator(rootFilterNode, _indexSegment,
_queryContext.getDebugOptions());
}
/**
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/MetadataBasedAggregationPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/MetadataBasedAggregationPlanNode.java
index 72263e7..66f4cb1 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/plan/MetadataBasedAggregationPlanNode.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/plan/MetadataBasedAggregationPlanNode.java
@@ -21,13 +21,13 @@ package org.apache.pinot.core.plan;
import java.util.HashMap;
import java.util.Map;
import org.apache.pinot.common.function.AggregationFunctionType;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.core.common.DataSource;
import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.query.MetadataBasedAggregationOperator;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.QueryContext;
/**
@@ -43,11 +43,11 @@ public class MetadataBasedAggregationPlanNode implements
PlanNode {
* Constructor for the class.
*
* @param indexSegment Segment to process
- * @param brokerRequest Broker request
+ * @param queryContext Query context
*/
- public MetadataBasedAggregationPlanNode(IndexSegment indexSegment,
BrokerRequest brokerRequest) {
+ public MetadataBasedAggregationPlanNode(IndexSegment indexSegment,
QueryContext queryContext) {
_indexSegment = indexSegment;
- _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
+ _aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(queryContext.getBrokerRequest());
_dataSourceMap = new HashMap<>();
for (AggregationFunction aggregationFunction : _aggregationFunctions) {
if (aggregationFunction.getType() != AggregationFunctionType.COUNT) {
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/SelectionPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/SelectionPlanNode.java
index 7d5ef46..f770780 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/plan/SelectionPlanNode.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/plan/SelectionPlanNode.java
@@ -18,12 +18,10 @@
*/
package org.apache.pinot.core.plan;
-import java.util.LinkedHashSet;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.Selection;
-import org.apache.pinot.common.request.SelectionSort;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.core.common.Operator;
import org.apache.pinot.core.indexsegment.IndexSegment;
@@ -32,7 +30,10 @@ import
org.apache.pinot.core.operator.query.EmptySelectionOperator;
import org.apache.pinot.core.operator.query.SelectionOnlyOperator;
import org.apache.pinot.core.operator.query.SelectionOrderByOperator;
import org.apache.pinot.core.operator.transform.TransformOperator;
-import org.apache.pinot.pql.parsers.pql2.ast.IdentifierAstNode;
+import org.apache.pinot.core.query.request.context.ExpressionContext;
+import org.apache.pinot.core.query.request.context.OrderByExpressionContext;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import org.apache.pinot.core.query.selection.SelectionOperatorUtils;
/**
@@ -40,58 +41,55 @@ import
org.apache.pinot.pql.parsers.pql2.ast.IdentifierAstNode;
*/
public class SelectionPlanNode implements PlanNode {
private final IndexSegment _indexSegment;
- private final Selection _selection;
+ private final QueryContext _queryContext;
private final TransformPlanNode _transformPlanNode;
- public SelectionPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest) {
+ public SelectionPlanNode(IndexSegment indexSegment, QueryContext
queryContext) {
_indexSegment = indexSegment;
- _selection = brokerRequest.getSelections();
- _transformPlanNode =
- new TransformPlanNode(_indexSegment, brokerRequest,
collectExpressionsToTransform(indexSegment, brokerRequest));
+ _queryContext = queryContext;
+ _transformPlanNode = new TransformPlanNode(_indexSegment, queryContext,
collectExpressions());
}
@Override
public Operator<IntermediateResultsBlock> run() {
TransformOperator transformOperator = _transformPlanNode.run();
- if (_selection.getSize() > 0) {
- if (_selection.getSelectionSortSequence() == null) {
- return new SelectionOnlyOperator(_indexSegment, _selection,
transformOperator);
+ Selection selection = _queryContext.getBrokerRequest().getSelections();
+ if (_queryContext.getLimit() > 0) {
+ if (_queryContext.getOrderByExpressions() == null) {
+ return new SelectionOnlyOperator(_indexSegment, selection,
transformOperator);
} else {
- return new SelectionOrderByOperator(_indexSegment, _selection,
transformOperator);
+ return new SelectionOrderByOperator(_indexSegment, selection,
transformOperator);
}
} else {
- return new EmptySelectionOperator(_indexSegment, _selection,
transformOperator);
+ return new EmptySelectionOperator(_indexSegment, selection,
transformOperator);
}
}
- private Set<TransformExpressionTree>
collectExpressionsToTransform(IndexSegment indexSegment,
- BrokerRequest brokerRequest) {
-
- Set<TransformExpressionTree> expressionTrees = new LinkedHashSet<>();
- Selection selection = brokerRequest.getSelections();
+ private Set<TransformExpressionTree> collectExpressions() {
+ Set<TransformExpressionTree> expressionTrees = new HashSet<>();
// Extract selection expressions
- List<String> selectionColumns = selection.getSelectionColumns();
- if (selectionColumns.size() == 1 && selectionColumns.get(0).equals("*")) {
- for (String column : indexSegment.getPhysicalColumnNames()) {
- expressionTrees.add(new TransformExpressionTree(new
IdentifierAstNode(column)));
+ List<ExpressionContext> selectExpressions =
_queryContext.getSelectExpressions();
+ if (selectExpressions.size() == 1 &&
selectExpressions.get(0).equals(SelectionOperatorUtils.IDENTIFIER_STAR)) {
+ for (String column : _indexSegment.getPhysicalColumnNames()) {
+ expressionTrees
+ .add(new
TransformExpressionTree(TransformExpressionTree.ExpressionType.IDENTIFIER,
column, null));
}
} else {
- for (String selectionColumn : selectionColumns) {
-
expressionTrees.add(TransformExpressionTree.compileToExpressionTree(selectionColumn));
+ for (ExpressionContext selectExpression : selectExpressions) {
+ expressionTrees.add(selectExpression.toTransformExpressionTree());
}
}
- // Extract order-by expressions.
- if (selection.getSize() > 0) {
- List<SelectionSort> sortSequence = selection.getSelectionSortSequence();
- if (sortSequence != null) {
- for (SelectionSort selectionSort : sortSequence) {
- String orderByColumn = selectionSort.getColumn();
-
expressionTrees.add(TransformExpressionTree.compileToExpressionTree(orderByColumn));
- }
+ // Extract order-by expressions
+ List<OrderByExpressionContext> orderByExpressions =
_queryContext.getOrderByExpressions();
+ // NOTE: queries with LIMIT 0 are solved by EmptySelectionOperator where
order-by expressions are not required.
+ if (_queryContext.getLimit() > 0 && orderByExpressions != null) {
+ for (OrderByExpressionContext orderByExpression : orderByExpressions) {
+
expressionTrees.add(orderByExpression.getExpression().toTransformExpressionTree());
}
}
+
return expressionTrees;
}
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/TransformPlanNode.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/TransformPlanNode.java
index 6de2c2e..931da55 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/plan/TransformPlanNode.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/plan/TransformPlanNode.java
@@ -19,14 +19,12 @@
package org.apache.pinot.core.plan;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
-import org.apache.pinot.common.request.BrokerRequest;
-import org.apache.pinot.common.request.Selection;
-import org.apache.pinot.common.request.SelectionSort;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.operator.transform.TransformOperator;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import org.apache.pinot.core.query.request.context.utils.QueryContextUtils;
/**
@@ -37,15 +35,15 @@ public class TransformPlanNode implements PlanNode {
private final Set<TransformExpressionTree> _expressions;
private int _maxDocPerNextCall = DocIdSetPlanNode.MAX_DOC_PER_CALL;
- public TransformPlanNode(IndexSegment indexSegment, BrokerRequest
brokerRequest,
+ public TransformPlanNode(IndexSegment indexSegment, QueryContext
queryContext,
Set<TransformExpressionTree> expressionsToPlan) {
- setMaxDocsForSelection(brokerRequest);
+ setMaxDocsForSelection(queryContext);
Set<String> projectionColumns = new HashSet<>();
extractProjectionColumns(expressionsToPlan, projectionColumns);
_expressions = expressionsToPlan;
_projectionPlanNode = new ProjectionPlanNode(indexSegment,
projectionColumns,
- new DocIdSetPlanNode(indexSegment, brokerRequest, _maxDocPerNextCall));
+ new DocIdSetPlanNode(indexSegment, queryContext, _maxDocPerNextCall));
}
private void extractProjectionColumns(Set<TransformExpressionTree>
expressionsToPlan, Set<String> projectionColumns) {
@@ -79,16 +77,13 @@ public class TransformPlanNode implements PlanNode {
/**
* Helper method to set the max number of docs to return for selection
queries
*/
- private void setMaxDocsForSelection(BrokerRequest brokerRequest) {
- if (!brokerRequest.isSetAggregationsInfo()) {
- Selection selection = brokerRequest.getSelections();
-
- // Update MaxDocPerNextCall
- if (selection.getSize() > 0) {
- List<SelectionSort> sortSequence =
selection.getSelectionSortSequence();
- if (sortSequence == null) {
- // For selection only queries, select minimum number of documents
- _maxDocPerNextCall = Math.min(selection.getSize(),
_maxDocPerNextCall);
+ private void setMaxDocsForSelection(QueryContext queryContext) {
+ if (!QueryContextUtils.isAggregationQuery(queryContext)) {
+ // Selection queries
+ if (queryContext.getLimit() > 0) {
+ if (queryContext.getOrderByExpressions() == null) {
+ // For selection-only queries, select minimum number of documents
+ _maxDocPerNextCall = Math.min(queryContext.getLimit(),
_maxDocPerNextCall);
}
} else {
// For LIMIT 0 queries, fetch at least 1 document per
DocIdSetPlanNode's requirement
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/plan/maker/InstancePlanMakerImplV2.java
b/pinot-core/src/main/java/org/apache/pinot/core/plan/maker/InstancePlanMakerImplV2.java
index 4b388a3..3d81a51 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/plan/maker/InstancePlanMakerImplV2.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/plan/maker/InstancePlanMakerImplV2.java
@@ -23,7 +23,6 @@ import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.core.indexsegment.IndexSegment;
import org.apache.pinot.core.plan.AggregationGroupByOrderByPlanNode;
import org.apache.pinot.core.plan.AggregationGroupByPlanNode;
@@ -102,13 +101,12 @@ public class InstancePlanMakerImplV2 implements PlanMaker
{
planNodes.add(makeSegmentPlanNode(indexSegment, queryContext));
}
CombinePlanNode combinePlanNode =
- new CombinePlanNode(planNodes, queryContext.getBrokerRequest(),
executorService, timeOutMs, _numGroupsLimit);
+ new CombinePlanNode(planNodes, queryContext, executorService,
timeOutMs, _numGroupsLimit);
return new GlobalPlanImplV0(new InstanceResponsePlanNode(combinePlanNode));
}
@Override
public PlanNode makeSegmentPlanNode(IndexSegment indexSegment, QueryContext
queryContext) {
- BrokerRequest brokerRequest = queryContext.getBrokerRequest();
if (QueryContextUtils.isAggregationQuery(queryContext)) {
// Aggregation query
List<ExpressionContext> groupByExpressions =
queryContext.getGroupByExpressions();
@@ -117,25 +115,25 @@ public class InstancePlanMakerImplV2 implements PlanMaker
{
QueryOptions queryOptions = new
QueryOptions(queryContext.getQueryOptions());
// new Combine operator only when GROUP_BY_MODE explicitly set to SQL
if (queryOptions.isGroupByModeSQL()) {
- return new AggregationGroupByOrderByPlanNode(indexSegment,
brokerRequest, _maxInitialResultHolderCapacity,
+ return new AggregationGroupByOrderByPlanNode(indexSegment,
queryContext, _maxInitialResultHolderCapacity,
_numGroupsLimit);
}
- return new AggregationGroupByPlanNode(indexSegment, brokerRequest,
_maxInitialResultHolderCapacity,
+ return new AggregationGroupByPlanNode(indexSegment, queryContext,
_maxInitialResultHolderCapacity,
_numGroupsLimit);
} else {
// Aggregation only query
if (queryContext.getFilter() == null) {
if (isFitForMetadataBasedPlan(queryContext)) {
- return new MetadataBasedAggregationPlanNode(indexSegment,
brokerRequest);
+ return new MetadataBasedAggregationPlanNode(indexSegment,
queryContext);
} else if (isFitForDictionaryBasedPlan(queryContext, indexSegment)) {
- return new DictionaryBasedAggregationPlanNode(indexSegment,
brokerRequest);
+ return new DictionaryBasedAggregationPlanNode(indexSegment,
queryContext);
}
}
- return new AggregationPlanNode(indexSegment, brokerRequest);
+ return new AggregationPlanNode(indexSegment, queryContext);
}
} else {
// Selection query
- return new SelectionPlanNode(indexSegment, brokerRequest);
+ return new SelectionPlanNode(indexSegment, queryContext);
}
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/ExpressionContext.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/ExpressionContext.java
index 75fc467..8ff881f 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/ExpressionContext.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/ExpressionContext.java
@@ -18,8 +18,12 @@
*/
package org.apache.pinot.core.query.request.context;
+import com.google.common.base.Preconditions;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
+import org.apache.pinot.common.request.transform.TransformExpressionTree;
/**
@@ -85,6 +89,29 @@ public class ExpressionContext {
}
}
+ /**
+ * Temporary helper method to help the migration from BrokerRequest to
QueryContext.
+ */
+ public TransformExpressionTree toTransformExpressionTree() {
+ switch (_type) {
+ case LITERAL:
+ return new
TransformExpressionTree(TransformExpressionTree.ExpressionType.LITERAL, _value,
null);
+ case IDENTIFIER:
+ return new
TransformExpressionTree(TransformExpressionTree.ExpressionType.IDENTIFIER,
_value, null);
+ case FUNCTION:
+ Preconditions.checkState(_function.getType() ==
FunctionContext.Type.TRANSFORM);
+ List<ExpressionContext> arguments = _function.getArguments();
+ List<TransformExpressionTree> children = new
ArrayList<>(arguments.size());
+ for (ExpressionContext argument : arguments) {
+ children.add(argument.toTransformExpressionTree());
+ }
+ return new
TransformExpressionTree(TransformExpressionTree.ExpressionType.FUNCTION,
_function.getFunctionName(),
+ children);
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorUtils.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorUtils.java
index 7bdd38c..8632d3c 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorUtils.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/selection/SelectionOperatorUtils.java
@@ -40,6 +40,7 @@ import org.apache.pinot.common.utils.DataSchema;
import org.apache.pinot.common.utils.DataTable;
import org.apache.pinot.core.common.datatable.DataTableBuilder;
import org.apache.pinot.core.indexsegment.IndexSegment;
+import org.apache.pinot.core.query.request.context.ExpressionContext;
import org.apache.pinot.core.util.ArrayCopyUtils;
import org.apache.pinot.pql.parsers.pql2.ast.IdentifierAstNode;
import org.apache.pinot.spi.utils.ByteArray;
@@ -68,6 +69,7 @@ public class SelectionOperatorUtils {
private SelectionOperatorUtils() {
}
+ public static final ExpressionContext IDENTIFIER_STAR =
ExpressionContext.forIdentifier("*");
public static final int MAX_ROW_HOLDER_INITIAL_CAPACITY = 10_000;
private static final String INT_PATTERN = "##########";
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 3810826..f87f03c 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
@@ -26,6 +26,7 @@ import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.FilterOperator;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.utils.request.FilterQueryTree;
+import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.startree.v2.AggregationFunctionColumnPair;
import org.apache.pinot.core.startree.v2.StarTreeV2Metadata;
@@ -37,10 +38,10 @@ public class StarTreeUtils {
public static final String USE_STAR_TREE_KEY = "useStarTree";
/**
- * Returns whether star-tree is disabled in broker request.
+ * Returns whether star-tree is disabled for the query.
*/
- public static boolean isStarTreeDisabled(BrokerRequest brokerRequest) {
- Map<String, String> debugOptions = brokerRequest.getDebugOptions();
+ public static boolean isStarTreeDisabled(QueryContext queryContext) {
+ Map<String, String> debugOptions = queryContext.getDebugOptions();
return debugOptions != null &&
"false".equalsIgnoreCase(debugOptions.get(USE_STAR_TREE_KEY));
}
diff --git
a/pinot-core/src/test/java/org/apache/pinot/core/plan/CombinePlanNodeTest.java
b/pinot-core/src/test/java/org/apache/pinot/core/plan/CombinePlanNodeTest.java
index 17b5ab8..4785d69 100644
---
a/pinot-core/src/test/java/org/apache/pinot/core/plan/CombinePlanNodeTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/core/plan/CombinePlanNodeTest.java
@@ -27,12 +27,16 @@ import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.Assert;
-import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.core.plan.maker.InstancePlanMakerImplV2;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import
org.apache.pinot.core.query.request.context.utils.BrokerRequestToQueryContextConverter;
+import org.apache.pinot.pql.parsers.Pql2Compiler;
import org.testng.annotations.Test;
public class CombinePlanNodeTest {
+ private final QueryContext _queryContext =
+ BrokerRequestToQueryContextConverter.convert(new
Pql2Compiler().compileToBrokerRequest("SELECT * FROM table"));
private final ExecutorService _executorService =
Executors.newFixedThreadPool(10);
/**
@@ -40,7 +44,6 @@ public class CombinePlanNodeTest {
*/
@Test
public void testParallelExecution() {
-
AtomicInteger count = new AtomicInteger(0);
Random rand = new Random();
@@ -54,7 +57,7 @@ public class CombinePlanNodeTest {
return null;
});
}
- CombinePlanNode combinePlanNode = new CombinePlanNode(planNodes, new
BrokerRequest(), _executorService, 1000,
+ CombinePlanNode combinePlanNode = new CombinePlanNode(planNodes,
_queryContext, _executorService, 1000,
InstancePlanMakerImplV2.DEFAULT_NUM_GROUPS_LIMIT);
combinePlanNode.run();
Assert.assertEquals(numPlans, count.get());
@@ -80,8 +83,8 @@ public class CombinePlanNodeTest {
return null;
});
}
- CombinePlanNode combinePlanNode =
- new CombinePlanNode(planNodes, null, _executorService, 0,
InstancePlanMakerImplV2.DEFAULT_NUM_GROUPS_LIMIT);
+ CombinePlanNode combinePlanNode = new CombinePlanNode(planNodes,
_queryContext, _executorService, 0,
+ InstancePlanMakerImplV2.DEFAULT_NUM_GROUPS_LIMIT);
try {
combinePlanNode.run();
} catch (RuntimeException e) {
@@ -101,8 +104,8 @@ public class CombinePlanNodeTest {
throw new RuntimeException("Inner exception message.");
});
}
- CombinePlanNode combinePlanNode =
- new CombinePlanNode(planNodes, null, _executorService, 0,
InstancePlanMakerImplV2.DEFAULT_NUM_GROUPS_LIMIT);
+ CombinePlanNode combinePlanNode = new CombinePlanNode(planNodes,
_queryContext, _executorService, 0,
+ InstancePlanMakerImplV2.DEFAULT_NUM_GROUPS_LIMIT);
try {
combinePlanNode.run();
} catch (RuntimeException e) {
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 5c4c864..6cc4a67 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
@@ -50,6 +50,8 @@ import org.apache.pinot.core.plan.FilterPlanNode;
import org.apache.pinot.core.plan.PlanNode;
import org.apache.pinot.core.query.aggregation.function.AggregationFunction;
import
org.apache.pinot.core.query.aggregation.function.AggregationFunctionUtils;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import
org.apache.pinot.core.query.request.context.utils.BrokerRequestToQueryContextConverter;
import
org.apache.pinot.core.segment.creator.impl.SegmentIndexCreationDriverImpl;
import org.apache.pinot.core.segment.index.readers.Dictionary;
import org.apache.pinot.core.startree.plan.StarTreeFilterPlanNode;
@@ -181,6 +183,7 @@ abstract class BaseStarTreeV2Test<R, A> {
@SuppressWarnings("unchecked")
void testQuery(String query) {
BrokerRequest brokerRequest = COMPILER.compileToBrokerRequest(query);
+ QueryContext queryContext =
BrokerRequestToQueryContextConverter.convert(brokerRequest);
// Aggregations
AggregationFunction[] aggregationFunctions =
AggregationFunctionUtils.getAggregationFunctions(brokerRequest);
@@ -230,7 +233,7 @@ abstract class BaseStarTreeV2Test<R, A> {
starTreeGroupByColumnValueSets);
// Extract values without star-tree
- PlanNode nonStarTreeFilterPlanNode = new FilterPlanNode(_indexSegment,
brokerRequest);
+ PlanNode nonStarTreeFilterPlanNode = new FilterPlanNode(_indexSegment,
queryContext);
List<SingleValueSet> nonStarTreeAggregationColumnValueSets = new
ArrayList<>(numAggregations);
List<Dictionary> nonStarTreeAggregationColumnDictionaries = new
ArrayList<>(numAggregations);
for (AggregationFunctionColumnPair aggregationFunctionColumnPair :
functionColumnPairs) {
diff --git
a/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/DictionaryBasedGroupKeyGeneratorTest.java
b/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/DictionaryBasedGroupKeyGeneratorTest.java
index 4fffcef..7d4aa3a 100644
---
a/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/DictionaryBasedGroupKeyGeneratorTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/DictionaryBasedGroupKeyGeneratorTest.java
@@ -31,6 +31,7 @@ import java.util.Random;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
+import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.segment.ReadMode;
import org.apache.pinot.core.data.readers.GenericRowRecordReader;
@@ -43,6 +44,8 @@ import org.apache.pinot.core.plan.TransformPlanNode;
import org.apache.pinot.core.plan.maker.InstancePlanMakerImplV2;
import
org.apache.pinot.core.query.aggregation.groupby.DictionaryBasedGroupKeyGenerator;
import org.apache.pinot.core.query.aggregation.groupby.GroupKeyGenerator;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import
org.apache.pinot.core.query.request.context.utils.BrokerRequestToQueryContextConverter;
import
org.apache.pinot.core.segment.creator.impl.SegmentIndexCreationDriverImpl;
import org.apache.pinot.pql.parsers.Pql2Compiler;
import org.apache.pinot.spi.config.table.TableConfig;
@@ -145,18 +148,19 @@ public class DictionaryBasedGroupKeyGeneratorTest {
String query = String
.format("SELECT COUNT(*) FROM table WHERE %s IN (%d, %d) GROUP BY %s,
%s", FILTER_COLUMN, docId1, docId2,
StringUtils.join(SV_COLUMNS, ", "), StringUtils.join(MV_COLUMNS,
", "));
+ BrokerRequest brokerRequest = new
Pql2Compiler().compileToBrokerRequest(query);
+ QueryContext queryContext =
BrokerRequestToQueryContextConverter.convert(brokerRequest);
// Compute the transform expressions
Set<TransformExpressionTree> expressionTrees = new LinkedHashSet<>();
ArrayList<String> allColumns = new ArrayList<>(Arrays.asList(SV_COLUMNS));
allColumns.addAll(Arrays.asList(MV_COLUMNS));
- for (String columnName: allColumns) {
+ for (String columnName : allColumns) {
expressionTrees.add(TransformExpressionTree.compileToExpressionTree(columnName));
}
- TransformPlanNode transformPlanNode =
- new TransformPlanNode(indexSegment, new
Pql2Compiler().compileToBrokerRequest(query), expressionTrees);
+ TransformPlanNode transformPlanNode = new TransformPlanNode(indexSegment,
queryContext, expressionTrees);
_transformOperator = transformPlanNode.run();
_transformBlock = _transformOperator.nextBlock();
}
diff --git
a/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/NoDictionaryGroupKeyGeneratorTest.java
b/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/NoDictionaryGroupKeyGeneratorTest.java
index e8ca22a..0fc13e8 100644
---
a/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/NoDictionaryGroupKeyGeneratorTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/query/aggregation/groupby/NoDictionaryGroupKeyGeneratorTest.java
@@ -31,6 +31,7 @@ import java.util.Random;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.transform.TransformExpressionTree;
import org.apache.pinot.common.segment.ReadMode;
import org.apache.pinot.core.data.readers.GenericRowRecordReader;
@@ -44,6 +45,8 @@ import
org.apache.pinot.core.plan.maker.InstancePlanMakerImplV2;
import org.apache.pinot.core.query.aggregation.groupby.GroupKeyGenerator;
import
org.apache.pinot.core.query.aggregation.groupby.NoDictionaryMultiColumnGroupKeyGenerator;
import
org.apache.pinot.core.query.aggregation.groupby.NoDictionarySingleColumnGroupKeyGenerator;
+import org.apache.pinot.core.query.request.context.QueryContext;
+import
org.apache.pinot.core.query.request.context.utils.BrokerRequestToQueryContextConverter;
import
org.apache.pinot.core.segment.creator.impl.SegmentIndexCreationDriverImpl;
import org.apache.pinot.pql.parsers.Pql2Compiler;
import org.apache.pinot.spi.config.table.TableConfig;
@@ -93,14 +96,15 @@ public class NoDictionaryGroupKeyGeneratorTest {
// Create transform operator and block
// NOTE: put all columns into group-by so that transform operator has
expressions for all columns
String query = String.format("SELECT COUNT(*) FROM table GROUP BY %s",
StringUtils.join(COLUMN_NAMES, ", "));
+ BrokerRequest brokerRequest = new
Pql2Compiler().compileToBrokerRequest(query);
+ QueryContext queryContext =
BrokerRequestToQueryContextConverter.convert(brokerRequest);
// Compute the transform expressions
Set<TransformExpressionTree> expressionTrees = new LinkedHashSet<>();
for (String columnName : COLUMN_NAMES) {
expressionTrees.add(TransformExpressionTree.compileToExpressionTree(columnName));
}
- TransformPlanNode transformPlanNode =
- new TransformPlanNode(indexSegment, new
Pql2Compiler().compileToBrokerRequest(query), expressionTrees);
+ TransformPlanNode transformPlanNode = new TransformPlanNode(indexSegment,
queryContext, expressionTrees);
_transformOperator = transformPlanNode.run();
_transformBlock = _transformOperator.nextBlock();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]