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/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new cb065e4 Refactor QueryOptions into QueryOptionsUtils to avoid
redundant parsing (#7601)
cb065e4 is described below
commit cb065e4f7ab74d4e8d4e485667bba8fb80aa307d
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Wed Oct 20 11:42:33 2021 -0700
Refactor QueryOptions into QueryOptionsUtils to avoid redundant parsing
(#7601)
---
.../requesthandler/BaseBrokerRequestHandler.java | 79 +++++++++++-----------
.../broker/requesthandler/QueryValidationTest.java | 4 +-
.../core/common/datatable/DataTableUtils.java | 4 +-
.../combine/GroupByOrderByCombineOperator.java | 12 ++--
.../plan/AggregationGroupByOrderByPlanNode.java | 11 +--
.../apache/pinot/core/plan/CombinePlanNode.java | 6 +-
.../org/apache/pinot/core/plan/FilterPlanNode.java | 24 +++----
.../core/plan/maker/InstancePlanMakerImplV2.java | 23 +++----
.../query/executor/ServerQueryExecutorV1Impl.java | 26 ++++---
.../query/reduce/AggregationDataTableReducer.java | 12 ++--
.../query/reduce/DistinctDataTableReducer.java | 8 +--
.../core/query/reduce/GroupByDataTableReducer.java | 10 +--
.../query/reduce/SelectionDataTableReducer.java | 17 ++---
.../core/query/request/context/QueryContext.java | 8 ++-
.../{QueryOptions.java => QueryOptionsUtils.java} | 58 ++++------------
15 files changed, 128 insertions(+), 174 deletions(-)
diff --git
a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/BaseBrokerRequestHandler.java
b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/BaseBrokerRequestHandler.java
index b767fc0..2ac2f2a 100644
---
a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/BaseBrokerRequestHandler.java
+++
b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/BaseBrokerRequestHandler.java
@@ -80,7 +80,7 @@ import org.apache.pinot.core.query.optimizer.QueryOptimizer;
import org.apache.pinot.core.query.reduce.BrokerReduceService;
import org.apache.pinot.core.requesthandler.PinotQueryParserFactory;
import org.apache.pinot.core.transport.ServerInstance;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.pql.parsers.pql2.ast.FilterKind;
import org.apache.pinot.segment.spi.AggregationFunctionType;
import org.apache.pinot.spi.config.table.TableConfig;
@@ -158,9 +158,9 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
_numDroppedLogRateLimiter = RateLimiter.create(1.0);
_brokerReduceService = new BrokerReduceService(_config);
- LOGGER
- .info("Broker Id: {}, timeout: {}ms, query response limit: {}, query
log length: {}, query log max rate: {}qps",
- _brokerId, _brokerTimeoutMs, _queryResponseLimit, _queryLogLength,
_queryLogRateLimiter.getRate());
+ LOGGER.info(
+ "Broker Id: {}, timeout: {}ms, query response limit: {}, query log
length: {}, query log max rate: {}qps",
+ _brokerId, _brokerTimeoutMs, _queryResponseLimit, _queryLogLength,
_queryLogRateLimiter.getRate());
}
private String getDefaultBrokerId() {
@@ -226,17 +226,16 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
return processLiteralOnlyQuery(pinotQuery, compilationStartTimeNs,
requestStatistics);
} catch (Exception e) {
// TODO: refine the exceptions here to early termination the queries
won't requires to send to servers.
- LOGGER
- .warn("Unable to execute literal request {}: {} at broker,
fallback to server query. {}", requestId, query,
- e.getMessage());
+ LOGGER.warn("Unable to execute literal request {}: {} at broker,
fallback to server query. {}", requestId,
+ query, e.getMessage());
}
}
try {
handleSubquery(pinotQuery, requestId, request, requesterIdentity,
requestStatistics);
} catch (Exception e) {
- LOGGER
- .info("Caught exception while handling the subquery in request {}:
{}, {}", requestId, query, e.getMessage());
+ LOGGER.info("Caught exception while handling the subquery in request {}:
{}, {}", requestId, query,
+ e.getMessage());
requestStatistics.setErrorCode(QueryException.QUERY_EXECUTION_ERROR_CODE);
return new
BrokerResponseNative(QueryException.getException(QueryException.QUERY_EXECUTION_ERROR,
e));
}
@@ -249,8 +248,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
try {
updateColumnNames(rawTableName, pinotQuery);
} catch (Exception e) {
- LOGGER
- .warn("Caught exception while updating column names in request {}:
{}, {}", requestId, query, e.getMessage());
+ LOGGER.warn("Caught exception while updating column names in request {}:
{}, {}", requestId, query,
+ e.getMessage());
}
if (_defaultHllLog2m > 0) {
handleHLLLog2mOverride(pinotQuery, _defaultHllLog2m);
@@ -274,8 +273,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
requestStatistics.setErrorCode(QueryException.ACCESS_DENIED_ERROR_CODE);
return new BrokerResponseNative(QueryException.ACCESS_DENIED_ERROR);
}
- _brokerMetrics
- .addPhaseTiming(rawTableName, BrokerQueryPhase.AUTHORIZATION,
System.nanoTime() - compilationEndTimeNs);
+ _brokerMetrics.addPhaseTiming(rawTableName, BrokerQueryPhase.AUTHORIZATION,
+ System.nanoTime() - compilationEndTimeNs);
// Get the tables hit by the request
String offlineTableName = null;
@@ -346,11 +345,11 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
if (offlineTableName != null && realtimeTableName != null) {
// Hybrid
offlineBrokerRequest = getOfflineBrokerRequest(brokerRequest);
- _queryOptimizer
- .optimize(offlineBrokerRequest.getPinotQuery(),
_tableCache.getTableConfig(offlineTableName), schema);
+ _queryOptimizer.optimize(offlineBrokerRequest.getPinotQuery(),
_tableCache.getTableConfig(offlineTableName),
+ schema);
realtimeBrokerRequest = getRealtimeBrokerRequest(brokerRequest);
- _queryOptimizer
- .optimize(realtimeBrokerRequest.getPinotQuery(),
_tableCache.getTableConfig(realtimeTableName), schema);
+ _queryOptimizer.optimize(realtimeBrokerRequest.getPinotQuery(),
_tableCache.getTableConfig(realtimeTableName),
+ schema);
requestStatistics.setFanoutType(RequestStatistics.FanoutType.HYBRID);
requestStatistics.setOfflineServerTenant(getServerTenant(offlineTableName));
requestStatistics.setRealtimeServerTenant(getServerTenant(realtimeTableName));
@@ -481,8 +480,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
processBrokerRequest(requestId, brokerRequest, offlineBrokerRequest,
offlineRoutingTable, realtimeBrokerRequest,
realtimeRoutingTable, remainingTimeMs, serverStats,
requestStatistics);
long executionEndTimeNs = System.nanoTime();
- _brokerMetrics
- .addPhaseTiming(rawTableName, BrokerQueryPhase.QUERY_EXECUTION,
executionEndTimeNs - routingEndTimeNs);
+ _brokerMetrics.addPhaseTiming(rawTableName,
BrokerQueryPhase.QUERY_EXECUTION,
+ executionEndTimeNs - routingEndTimeNs);
// Track number of queries with number of groups limit reached
if (brokerResponse.isNumGroupsLimitReached()) {
@@ -589,8 +588,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
try {
handleSubquery(brokerRequest, requestId, request, requesterIdentity,
requestStatistics);
} catch (Exception e) {
- LOGGER
- .info("Caught exception while handling the subquery in request {}:
{}, {}", requestId, query, e.getMessage());
+ LOGGER.info("Caught exception while handling the subquery in request {}:
{}, {}", requestId, query,
+ e.getMessage());
requestStatistics.setErrorCode(QueryException.QUERY_EXECUTION_ERROR_CODE);
return new
BrokerResponseNative(QueryException.getException(QueryException.QUERY_EXECUTION_ERROR,
e));
}
@@ -603,8 +602,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
try {
updateColumnNames(rawTableName, brokerRequest);
} catch (Exception e) {
- LOGGER
- .warn("Caught exception while updating column names in request {}:
{}, {}", requestId, query, e.getMessage());
+ LOGGER.warn("Caught exception while updating column names in request {}:
{}, {}", requestId, query,
+ e.getMessage());
}
if (_defaultHllLog2m > 0) {
handleHyperloglogLog2mOverride(brokerRequest, _defaultHllLog2m);
@@ -628,8 +627,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
requestStatistics.setErrorCode(QueryException.ACCESS_DENIED_ERROR_CODE);
return new BrokerResponseNative(QueryException.ACCESS_DENIED_ERROR);
}
- _brokerMetrics
- .addPhaseTiming(rawTableName, BrokerQueryPhase.AUTHORIZATION,
System.nanoTime() - compilationEndTimeNs);
+ _brokerMetrics.addPhaseTiming(rawTableName, BrokerQueryPhase.AUTHORIZATION,
+ System.nanoTime() - compilationEndTimeNs);
// Get the tables hit by the request
String offlineTableName = null;
@@ -794,8 +793,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
processBrokerRequest(requestId, brokerRequest, offlineBrokerRequest,
offlineRoutingTable, realtimeBrokerRequest,
realtimeRoutingTable, remainingTimeMs, serverStats,
requestStatistics);
long executionEndTimeNs = System.nanoTime();
- _brokerMetrics
- .addPhaseTiming(rawTableName, BrokerQueryPhase.QUERY_EXECUTION,
executionEndTimeNs - routingEndTimeNs);
+ _brokerMetrics.addPhaseTiming(rawTableName,
BrokerQueryPhase.QUERY_EXECUTION,
+ executionEndTimeNs - routingEndTimeNs);
// Track number of queries with number of groups limit reached
if (brokerResponse.isNumGroupsLimitReached()) {
@@ -902,8 +901,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
String serializedIdSet = (String)
response.getAggregationResults().get(0).getValue();
expression.setValue(TransformFunctionType.INIDSET.name());
- children
- .set(1, new
TransformExpressionTree(TransformExpressionTree.ExpressionType.LITERAL,
serializedIdSet, null));
+ children.set(1,
+ new
TransformExpressionTree(TransformExpressionTree.ExpressionType.LITERAL,
serializedIdSet, null));
} else {
for (TransformExpressionTree child : children) {
handleSubquery(child, requestId, jsonRequest, requesterIdentity,
requestStatistics);
@@ -1535,7 +1534,7 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
private long setQueryTimeout(String tableNameWithType, Map<String, String>
queryOptions, long timeSpentMs)
throws TimeoutException {
long queryTimeoutMs;
- Long queryLevelTimeoutMs = QueryOptions.getTimeoutMs(queryOptions);
+ Long queryLevelTimeoutMs = QueryOptionsUtils.getTimeoutMs(queryOptions);
if (queryLevelTimeoutMs != null) {
// Use query-level timeout if exists
queryTimeoutMs = queryLevelTimeoutMs;
@@ -1552,8 +1551,8 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
long remainingTimeMs = queryTimeoutMs - timeSpentMs;
if (remainingTimeMs <= 0) {
- String errorMessage = String
- .format("Query timed out (time spent: %dms, timeout: %dms) for
table: %s before scattering the request",
+ String errorMessage =
+ String.format("Query timed out (time spent: %dms, timeout: %dms) for
table: %s before scattering the request",
timeSpentMs, queryTimeoutMs, tableNameWithType);
throw new TimeoutException(errorMessage);
}
@@ -1651,10 +1650,10 @@ public abstract class BaseBrokerRequestHandler
implements BrokerRequestHandler {
// The results of PQL groupByMode (if numAggregations > 1) cannot be
returned in SQL responseFormat, as the
// results are non-tabular
// Checking for this upfront, to avoid executing the query and wasting
resources
- QueryOptions queryOptions = new
QueryOptions(brokerRequest.getQueryOptions());
if (brokerRequest.isSetAggregationsInfo() && brokerRequest.getGroupBy() !=
null) {
- if (brokerRequest.getAggregationsInfoSize() > 1 &&
queryOptions.isResponseFormatSQL() && !queryOptions
- .isGroupByModeSQL()) {
+ Map<String, String> queryOptions = brokerRequest.getQueryOptions();
+ if (brokerRequest.getAggregationsInfoSize() > 1 &&
!QueryOptionsUtils.isGroupByModeSQL(queryOptions)
+ && QueryOptionsUtils.isResponseFormatSQL(queryOptions)) {
throw new UnsupportedOperationException(
"The results of a GROUP BY query with multiple aggregations in PQL
is not tabular, and cannot be returned"
+ " in SQL responseFormat");
@@ -1716,8 +1715,9 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
// SQL query should always have response format and group-by mode set to
SQL
// TODO: Remove these 2 options after deprecating PQL
- QueryOptions queryOptions = new QueryOptions(pinotQuery.getQueryOptions());
- if (!queryOptions.isGroupByModeSQL() ||
!queryOptions.isResponseFormatSQL()) {
+ Map<String, String> queryOptions = pinotQuery.getQueryOptions();
+ if (queryOptions == null ||
!QueryOptionsUtils.isGroupByModeSQL(queryOptions)
+ || !QueryOptionsUtils.isResponseFormatSQL(queryOptions)) {
throw new IllegalStateException("SQL query should always have response
format and group-by mode set to SQL");
}
}
@@ -1767,8 +1767,9 @@ public abstract class BaseBrokerRequestHandler implements
BrokerRequestHandler {
Expression timeFilterExpression = RequestUtils.getFunctionExpression(
isOfflineRequest ? FilterKind.LESS_THAN_OR_EQUAL.name() :
FilterKind.GREATER_THAN.name());
- timeFilterExpression.getFunctionCall().setOperands(Arrays
- .asList(RequestUtils.createIdentifierExpression(timeColumn),
RequestUtils.getLiteralExpression(timeValue)));
+ timeFilterExpression.getFunctionCall().setOperands(
+ Arrays.asList(RequestUtils.createIdentifierExpression(timeColumn),
+ RequestUtils.getLiteralExpression(timeValue)));
Expression filterExpression = pinotQuery.getFilterExpression();
if (filterExpression != null) {
diff --git
a/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/QueryValidationTest.java
b/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/QueryValidationTest.java
index a5a7dd0..96e7768 100644
---
a/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/QueryValidationTest.java
+++
b/pinot-broker/src/test/java/org/apache/pinot/broker/requesthandler/QueryValidationTest.java
@@ -126,7 +126,7 @@ public class QueryValidationTest {
BaseBrokerRequestHandler.validateRequest(brokerRequest, 1000);
Assert.fail("Query should have failed");
} catch (Exception e) {
- Assert.assertEquals(errorMessage, e.getMessage());
+ Assert.assertEquals(e.getMessage(), errorMessage);
}
}
@@ -136,7 +136,7 @@ public class QueryValidationTest {
BaseBrokerRequestHandler.validateRequest(pinotQuery, 1000);
Assert.fail("Query should have failed");
} catch (Exception e) {
- Assert.assertEquals(errorMessage, e.getMessage());
+ Assert.assertEquals(e.getMessage(), errorMessage);
}
}
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/common/datatable/DataTableUtils.java
b/pinot-core/src/main/java/org/apache/pinot/core/common/datatable/DataTableUtils.java
index 1ff7df2..05b6e3b 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/common/datatable/DataTableUtils.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/common/datatable/DataTableUtils.java
@@ -36,7 +36,7 @@ import
org.apache.pinot.core.query.aggregation.function.DistinctAggregationFunct
import org.apache.pinot.core.query.distinct.DistinctTable;
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.QueryOptionsUtils;
/**
@@ -135,7 +135,7 @@ public class DataTableUtils {
if (groupByExpressions != null) {
// Aggregation group-by query
- if (new QueryOptions(queryContext.getQueryOptions()).isGroupByModeSQL())
{
+ if (QueryOptionsUtils.isGroupByModeSQL(queryContext.getQueryOptions())) {
// SQL format
int numColumns = groupByExpressions.size() + numAggregations;
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/operator/combine/GroupByOrderByCombineOperator.java
b/pinot-core/src/main/java/org/apache/pinot/core/operator/combine/GroupByOrderByCombineOperator.java
index e4203bc..a218da2 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/operator/combine/GroupByOrderByCombineOperator.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/operator/combine/GroupByOrderByCombineOperator.java
@@ -23,7 +23,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
@@ -46,7 +45,7 @@ import
org.apache.pinot.core.query.aggregation.groupby.AggregationGroupByResult;
import org.apache.pinot.core.query.aggregation.groupby.GroupKeyGenerator;
import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.util.GroupByUtils;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,12 +78,9 @@ public class GroupByOrderByCombineOperator extends
BaseCombineOperator {
super(operators, queryContext, executorService, endTimeMs,
maxExecutionThreads > 0 ? maxExecutionThreads : operators.size());
- Map<String, String> queryOptions = queryContext.getQueryOptions();
- if (queryOptions != null) {
- Integer minTrimSizeOption =
QueryOptions.getMinServerGroupTrimSize(queryOptions);
- if (minTrimSizeOption != null) {
- minTrimSize = minTrimSizeOption;
- }
+ Integer minTrimSizeOption =
QueryOptionsUtils.getMinServerGroupTrimSize(queryContext.getQueryOptions());
+ if (minTrimSizeOption != null) {
+ minTrimSize = minTrimSizeOption;
}
if (minTrimSize > 0) {
int limit = queryContext.getLimit();
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 6cc42ca..7fb5f1f 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
@@ -30,7 +30,7 @@ import
org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.startree.CompositePredicateEvaluator;
import org.apache.pinot.core.startree.StarTreeUtils;
import org.apache.pinot.core.startree.plan.StarTreeTransformPlanNode;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.segment.spi.IndexSegment;
import
org.apache.pinot.segment.spi.index.startree.AggregationFunctionColumnPair;
import org.apache.pinot.segment.spi.index.startree.StarTreeV2;
@@ -54,13 +54,8 @@ public class AggregationGroupByOrderByPlanNode implements
PlanNode {
_queryContext = queryContext;
_maxInitialResultHolderCapacity = maxInitialResultHolderCapacity;
_numGroupsLimit = numGroupsLimit;
- Map<String, String> queryOptions = _queryContext.getQueryOptions();
- if (queryOptions != null) {
- Integer minSegmentGroupTrimSize =
QueryOptions.getMinSegmentGroupTrimSize(queryOptions);
- _minGroupTrimSize = minSegmentGroupTrimSize != null ?
minSegmentGroupTrimSize : minGroupTrimSize;
- } else {
- _minGroupTrimSize = minGroupTrimSize;
- }
+ Integer minSegmentGroupTrimSize =
QueryOptionsUtils.getMinSegmentGroupTrimSize(_queryContext.getQueryOptions());
+ _minGroupTrimSize = minSegmentGroupTrimSize != null ?
minSegmentGroupTrimSize : minGroupTrimSize;
}
@Override
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 c9ac5f7..09125ba 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
@@ -22,7 +22,6 @@ import io.grpc.stub.StreamObserver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.Phaser;
@@ -41,7 +40,7 @@ import
org.apache.pinot.core.operator.combine.SelectionOrderByCombineOperator;
import
org.apache.pinot.core.operator.streaming.StreamingSelectionOnlyCombineOperator;
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.QueryOptionsUtils;
import org.apache.pinot.core.util.trace.TraceCallable;
import org.apache.pinot.spi.exception.BadQueryRequestException;
@@ -187,8 +186,7 @@ public class CombinePlanNode implements PlanNode {
_maxExecutionThreads);
} else {
// Aggregation group-by
- Map<String, String> queryOptions = _queryContext.getQueryOptions();
- if (queryOptions != null &&
QueryOptions.isGroupByModeSQL(queryOptions)) {
+ if
(QueryOptionsUtils.isGroupByModeSQL(_queryContext.getQueryOptions())) {
return new GroupByOrderByCombineOperator(operators, _queryContext,
_executorService, _endTimeMs,
_maxExecutionThreads, _minGroupTrimSize, _groupTrimThreshold);
}
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 4418e1d..ce06d79 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
@@ -45,7 +45,7 @@ import
org.apache.pinot.core.operator.filter.predicate.FSTBasedRegexpPredicateEv
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.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import
org.apache.pinot.segment.local.segment.index.datasource.MutableDataSource;
import org.apache.pinot.segment.spi.IndexSegment;
import org.apache.pinot.segment.spi.datasource.DataSource;
@@ -72,10 +72,7 @@ public class FilterPlanNode implements PlanNode {
public BaseFilterOperator run() {
FilterContext filter = _queryContext.getFilter();
ThreadSafeMutableRoaringBitmap validDocIds =
_indexSegment.getValidDocIds();
- boolean upsertSkipped = false;
- if (_queryContext.getQueryOptions() != null) {
- upsertSkipped = new
QueryOptions(_queryContext.getQueryOptions()).isSkipUpsert();
- }
+ boolean upsertSkipped =
QueryOptionsUtils.isSkipUpsert(_queryContext.getQueryOptions());
if (filter != null) {
BaseFilterOperator filterOperator = constructPhysicalOperator(filter,
_queryContext.getDebugOptions());
if (validDocIds != null && !upsertSkipped) {
@@ -188,12 +185,11 @@ public class FilterPlanNode implements PlanNode {
// similar to that of FSTBasedEvaluator, else use regular flow
of getting predicate evaluator.
PredicateEvaluator evaluator;
if (dataSource.getFSTIndex() != null) {
- evaluator = FSTBasedRegexpPredicateEvaluatorFactory
- .newFSTBasedEvaluator(dataSource.getFSTIndex(),
dataSource.getDictionary(),
- ((RegexpLikePredicate) predicate).getValue());
+ evaluator =
FSTBasedRegexpPredicateEvaluatorFactory.newFSTBasedEvaluator(dataSource.getFSTIndex(),
+ dataSource.getDictionary(), ((RegexpLikePredicate)
predicate).getValue());
} else if (dataSource instanceof MutableDataSource &&
((MutableDataSource) dataSource).isFSTEnabled()) {
- evaluator = FSTBasedRegexpPredicateEvaluatorFactory
- .newAutomatonBasedEvaluator(dataSource.getDictionary(),
+ evaluator =
+
FSTBasedRegexpPredicateEvaluatorFactory.newAutomatonBasedEvaluator(dataSource.getDictionary(),
((RegexpLikePredicate) predicate).getValue());
} else {
evaluator =
PredicateEvaluatorProvider.getPredicateEvaluator(predicate,
dataSource.getDictionary(),
@@ -202,8 +198,8 @@ public class FilterPlanNode implements PlanNode {
return FilterOperatorUtils.getLeafFilterOperator(evaluator,
dataSource, _numDocs);
case JSON_MATCH:
JsonIndexReader jsonIndex = dataSource.getJsonIndex();
- Preconditions
- .checkState(jsonIndex != null, "Cannot apply JSON_MATCH on
column: %s without json index", column);
+ Preconditions.checkState(jsonIndex != null, "Cannot apply
JSON_MATCH on column: %s without json index",
+ column);
return new JsonMatchFilterOperator(jsonIndex,
((JsonMatchPredicate) predicate).getValue(), _numDocs);
case IS_NULL:
NullValueVectorReader nullValueVector =
dataSource.getNullValueVector();
@@ -220,8 +216,8 @@ public class FilterPlanNode implements PlanNode {
return new MatchAllFilterOperator(_numDocs);
}
default:
- PredicateEvaluator predicateEvaluator =
PredicateEvaluatorProvider
- .getPredicateEvaluator(predicate, dataSource.getDictionary(),
+ PredicateEvaluator predicateEvaluator =
+ PredicateEvaluatorProvider.getPredicateEvaluator(predicate,
dataSource.getDictionary(),
dataSource.getDataSourceMetadata().getDataType());
return
FilterOperatorUtils.getLeafFilterOperator(predicateEvaluator, dataSource,
_numDocs);
}
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 a54be41..90eee3c 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
@@ -24,7 +24,6 @@ import io.grpc.stub.StreamObserver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
@@ -46,7 +45,7 @@ import org.apache.pinot.core.query.config.QueryExecutorConfig;
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.GroupByUtils;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.segment.spi.FetchContext;
import org.apache.pinot.segment.spi.IndexSegment;
import org.apache.pinot.spi.env.PinotConfiguration;
@@ -185,16 +184,13 @@ public class InstancePlanMakerImplV2 implements PlanMaker
{
}
private int getMaxExecutionThreads(QueryContext queryContext) {
- Map<String, String> queryOptions = queryContext.getQueryOptions();
- if (queryOptions != null) {
- Integer maxExecutionThreadsFromQuery =
QueryOptions.getMaxExecutionThreads(queryOptions);
- if (maxExecutionThreadsFromQuery != null && maxExecutionThreadsFromQuery
> 0) {
- // Do not allow query to override the execution threads over the
instance-level limit
- if (_maxExecutionThreads > 0) {
- return Math.min(_maxExecutionThreads, maxExecutionThreadsFromQuery);
- } else {
- return maxExecutionThreadsFromQuery;
- }
+ Integer maxExecutionThreadsFromQuery =
QueryOptionsUtils.getMaxExecutionThreads(queryContext.getQueryOptions());
+ if (maxExecutionThreadsFromQuery != null && maxExecutionThreadsFromQuery >
0) {
+ // Do not allow query to override the execution threads over the
instance-level limit
+ if (_maxExecutionThreads > 0) {
+ return Math.min(_maxExecutionThreads, maxExecutionThreadsFromQuery);
+ } else {
+ return maxExecutionThreadsFromQuery;
}
}
return _maxExecutionThreads;
@@ -206,8 +202,7 @@ public class InstancePlanMakerImplV2 implements PlanMaker {
List<ExpressionContext> groupByExpressions =
queryContext.getGroupByExpressions();
if (groupByExpressions != null) {
// Aggregation group-by query
- Map<String, String> queryOptions = queryContext.getQueryOptions();
- if (queryOptions != null &&
QueryOptions.isGroupByModeSQL(queryOptions)) {
+ if
(QueryOptionsUtils.isGroupByModeSQL(queryContext.getQueryOptions())) {
return new AggregationGroupByOrderByPlanNode(indexSegment,
queryContext, _maxInitialResultHolderCapacity,
_numGroupsLimit, _minSegmentGroupTrimSize);
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
index 28e3db8..4af6693 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/executor/ServerQueryExecutorV1Impl.java
@@ -53,7 +53,7 @@ import
org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.query.request.context.TimerContext;
import
org.apache.pinot.core.query.request.context.utils.QueryContextConverterUtils;
import org.apache.pinot.core.query.utils.idset.IdSet;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.core.util.trace.TraceContext;
import org.apache.pinot.segment.local.data.manager.SegmentDataManager;
import org.apache.pinot.segment.local.data.manager.TableDataManager;
@@ -125,19 +125,16 @@ public class ServerQueryExecutorV1Impl implements
QueryExecutor {
LOGGER.debug("Incoming request Id: {}, query: {}", requestId,
queryContext);
// Use the timeout passed from the request if exists, or the
instance-level timeout
long queryTimeoutMs = _defaultTimeOutMs;
- Map<String, String> queryOptions = queryContext.getQueryOptions();
- if (queryOptions != null) {
- Long timeoutFromQueryOptions = QueryOptions.getTimeoutMs(queryOptions);
- if (timeoutFromQueryOptions != null) {
- queryTimeoutMs = timeoutFromQueryOptions;
- }
+ Long timeoutFromQueryOptions =
QueryOptionsUtils.getTimeoutMs(queryContext.getQueryOptions());
+ if (timeoutFromQueryOptions != null) {
+ queryTimeoutMs = timeoutFromQueryOptions;
}
// Query scheduler wait time already exceeds query timeout, directly return
if (querySchedulingTimeMs >= queryTimeoutMs) {
_serverMetrics.addMeteredTableValue(tableNameWithType,
ServerMeter.SCHEDULING_TIMEOUT_EXCEPTIONS, 1);
- String errorMessage = String
- .format("Query scheduling took %dms (longer than query timeout of
%dms)", querySchedulingTimeMs,
+ String errorMessage =
+ String.format("Query scheduling took %dms (longer than query timeout
of %dms)", querySchedulingTimeMs,
queryTimeoutMs);
DataTable dataTable = DataTableBuilder.getEmptyDataTable();
dataTable.addException(QueryException.getException(QueryException.QUERY_SCHEDULING_TIMEOUT_ERROR,
errorMessage));
@@ -281,9 +278,10 @@ public class ServerQueryExecutorV1Impl implements
QueryExecutor {
return dataTable;
} else {
TimerContext.Timer planBuildTimer =
timerContext.startNewPhaseTimer(ServerQueryPhase.BUILD_QUERY_PLAN);
- Plan queryPlan = enableStreaming ? _planMaker
- .makeStreamingInstancePlan(selectedSegments, queryContext,
executorService, responseObserver, endTimeMs)
- : _planMaker.makeInstancePlan(selectedSegments, queryContext,
executorService, endTimeMs);
+ Plan queryPlan =
+ enableStreaming ?
_planMaker.makeStreamingInstancePlan(selectedSegments, queryContext,
executorService,
+ responseObserver, endTimeMs)
+ : _planMaker.makeInstancePlan(selectedSegments, queryContext,
executorService, endTimeMs);
planBuildTimer.stopAndRecord();
TimerContext.Timer planExecTimer =
timerContext.startNewPhaseTimer(ServerQueryPhase.QUERY_PLAN_EXECUTION);
@@ -343,8 +341,8 @@ public class ServerQueryExecutorV1Impl implements
QueryExecutor {
}
List<ExpressionContext> arguments = function.getArguments();
if (StringUtils.remove(function.getFunctionName(),
'_').equalsIgnoreCase(IN_PARTITIONED_SUBQUERY)) {
- Preconditions
- .checkState(arguments.size() == 2, "IN_PARTITIONED_SUBQUERY requires
2 arguments: expression, subquery");
+ Preconditions.checkState(arguments.size() == 2,
+ "IN_PARTITIONED_SUBQUERY requires 2 arguments: expression,
subquery");
ExpressionContext subqueryExpression = arguments.get(1);
Preconditions.checkState(subqueryExpression.getType() ==
ExpressionContext.Type.LITERAL,
"Second argument of IN_PARTITIONED_SUBQUERY must be a literal
(subquery)");
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/AggregationDataTableReducer.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/AggregationDataTableReducer.java
index 47ed2d8..8cccacc 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/AggregationDataTableReducer.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/AggregationDataTableReducer.java
@@ -34,7 +34,7 @@ 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.transport.ServerRoutingInstance;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
/**
@@ -50,9 +50,9 @@ public class AggregationDataTableReducer implements
DataTableReducer {
AggregationDataTableReducer(QueryContext queryContext) {
_queryContext = queryContext;
_aggregationFunctions = queryContext.getAggregationFunctions();
- QueryOptions queryOptions = new
QueryOptions(queryContext.getQueryOptions());
- _preserveType = queryOptions.isPreserveType();
- _responseFormatSql = queryOptions.isResponseFormatSQL();
+ Map<String, String> queryOptions = queryContext.getQueryOptions();
+ _preserveType = QueryOptionsUtils.isPreserveType(queryOptions);
+ _responseFormatSql = QueryOptionsUtils.isResponseFormatSQL(queryOptions);
}
/**
@@ -145,8 +145,8 @@ public class AggregationDataTableReducer implements
DataTableReducer {
} else {
// Format the values into strings
for (int i = 0; i < numAggregationFunctions; i++) {
- aggregationResults.add(new AggregationResult(columnNames[i],
AggregationFunctionUtils
-
.formatValue(_aggregationFunctions[i].getFinalResultColumnType().format(finalResults[i]))));
+ aggregationResults.add(new AggregationResult(columnNames[i],
AggregationFunctionUtils.formatValue(
+
_aggregationFunctions[i].getFinalResultColumnType().format(finalResults[i]))));
}
}
return aggregationResults;
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/DistinctDataTableReducer.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/DistinctDataTableReducer.java
index b9afbe1..a28ff00 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/DistinctDataTableReducer.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/DistinctDataTableReducer.java
@@ -37,7 +37,7 @@ import
org.apache.pinot.core.query.aggregation.function.DistinctAggregationFunct
import org.apache.pinot.core.query.distinct.DistinctTable;
import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.transport.ServerRoutingInstance;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
/**
@@ -50,7 +50,7 @@ public class DistinctDataTableReducer implements
DataTableReducer {
// TODO: queryOptions.isPreserveType() is ignored for DISTINCT queries.
DistinctDataTableReducer(QueryContext queryContext,
DistinctAggregationFunction distinctAggregationFunction) {
_distinctAggregationFunction = distinctAggregationFunction;
- _responseFormatSql = new
QueryOptions(queryContext.getQueryOptions()).isResponseFormatSQL();
+ _responseFormatSql =
QueryOptionsUtils.isResponseFormatSQL(queryContext.getQueryOptions());
}
/**
@@ -88,8 +88,8 @@ public class DistinctDataTableReducer implements
DataTableReducer {
int numColumns = columns.length;
ColumnDataType[] columnDataTypes = new ColumnDataType[numColumns];
Arrays.fill(columnDataTypes, ColumnDataType.STRING);
- brokerResponseNative
- .setResultTable(new ResultTable(new DataSchema(columns,
columnDataTypes), Collections.emptyList()));
+ brokerResponseNative.setResultTable(
+ new ResultTable(new DataSchema(columns, columnDataTypes),
Collections.emptyList()));
} else {
brokerResponseNative.setSelectionResults(new
SelectionResults(Arrays.asList(columns), Collections.emptyList()));
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GroupByDataTableReducer.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GroupByDataTableReducer.java
index 5363758..fd668c7 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GroupByDataTableReducer.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GroupByDataTableReducer.java
@@ -55,7 +55,7 @@ import
org.apache.pinot.core.query.aggregation.groupby.AggregationGroupByTrimmin
import org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.transport.ServerRoutingInstance;
import org.apache.pinot.core.util.GroupByUtils;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.core.util.trace.TraceRunnable;
@@ -86,10 +86,10 @@ public class GroupByDataTableReducer implements
DataTableReducer {
assert _groupByExpressions != null;
_numGroupByExpressions = _groupByExpressions.size();
_numColumns = _numAggregationFunctions + _numGroupByExpressions;
- QueryOptions queryOptions = new
QueryOptions(queryContext.getQueryOptions());
- _preserveType = queryOptions.isPreserveType();
- _groupByModeSql = queryOptions.isGroupByModeSQL();
- _responseFormatSql = queryOptions.isResponseFormatSQL();
+ Map<String, String> queryOptions = queryContext.getQueryOptions();
+ _preserveType = QueryOptionsUtils.isPreserveType(queryOptions);
+ _groupByModeSql = QueryOptionsUtils.isGroupByModeSQL(queryOptions);
+ _responseFormatSql = QueryOptionsUtils.isResponseFormatSQL(queryOptions);
_sqlQuery = queryContext.getBrokerRequest().getPinotQuery() != null;
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/SelectionDataTableReducer.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/SelectionDataTableReducer.java
index 51c573d..fe09051 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/SelectionDataTableReducer.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/SelectionDataTableReducer.java
@@ -36,7 +36,7 @@ import
org.apache.pinot.core.query.request.context.QueryContext;
import org.apache.pinot.core.query.selection.SelectionOperatorService;
import org.apache.pinot.core.query.selection.SelectionOperatorUtils;
import org.apache.pinot.core.transport.ServerRoutingInstance;
-import org.apache.pinot.core.util.QueryOptions;
+import org.apache.pinot.core.util.QueryOptionsUtils;
import org.apache.pinot.spi.utils.builder.TableNameBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -54,9 +54,9 @@ public class SelectionDataTableReducer implements
DataTableReducer {
SelectionDataTableReducer(QueryContext queryContext) {
_queryContext = queryContext;
- QueryOptions queryOptions = new
QueryOptions(queryContext.getQueryOptions());
- _preserveType = queryOptions.isPreserveType();
- _responseFormatSql = queryOptions.isResponseFormatSQL();
+ Map<String, String> queryOptions = queryContext.getQueryOptions();
+ _preserveType = QueryOptionsUtils.isPreserveType(queryOptions);
+ _responseFormatSql = QueryOptionsUtils.isResponseFormatSQL(queryOptions);
}
/**
@@ -89,8 +89,8 @@ public class SelectionDataTableReducer implements
DataTableReducer {
brokerMetrics.addMeteredTableValue(TableNameBuilder.extractRawTableName(tableName),
BrokerMeter.RESPONSE_MERGE_EXCEPTIONS, 1L);
}
- brokerResponseNative
- .addToExceptions(new
QueryProcessingException(QueryException.MERGE_RESPONSE_ERROR_CODE,
errorMessage));
+ brokerResponseNative.addToExceptions(
+ new
QueryProcessingException(QueryException.MERGE_RESPONSE_ERROR_CODE,
errorMessage));
}
}
@@ -112,8 +112,9 @@ public class SelectionDataTableReducer implements
DataTableReducer {
brokerResponseNative.setResultTable(
SelectionOperatorUtils.renderResultTableWithoutOrdering(reducedRows,
dataSchema, selectionColumns));
} else {
- brokerResponseNative.setSelectionResults(SelectionOperatorUtils
- .renderSelectionResultsWithoutOrdering(reducedRows, dataSchema,
selectionColumns, _preserveType));
+ brokerResponseNative.setSelectionResults(
+
SelectionOperatorUtils.renderSelectionResultsWithoutOrdering(reducedRows,
dataSchema, selectionColumns,
+ _preserveType));
}
}
}
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/QueryContext.java
b/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/QueryContext.java
index 2b044e1..d81abaa 100644
---
a/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/QueryContext.java
+++
b/pinot-core/src/main/java/org/apache/pinot/core/query/request/context/QueryContext.java
@@ -87,7 +87,7 @@ public class QueryContext {
private QueryContext(String tableName, List<ExpressionContext>
selectExpressions, List<String> aliasList,
@Nullable FilterContext filter, @Nullable List<ExpressionContext>
groupByExpressions,
@Nullable FilterContext havingFilter, @Nullable
List<OrderByExpressionContext> orderByExpressions, int limit,
- int offset, @Nullable Map<String, String> queryOptions, @Nullable
Map<String, String> debugOptions,
+ int offset, Map<String, String> queryOptions, @Nullable Map<String,
String> debugOptions,
BrokerRequest brokerRequest) {
_tableName = tableName;
_selectExpressions = selectExpressions;
@@ -171,9 +171,8 @@ public class QueryContext {
}
/**
- * Returns the query options of the query, or {@code null} if not exist.
+ * Returns the query options of the query.
*/
- @Nullable
public Map<String, String> getQueryOptions() {
return _queryOptions;
}
@@ -306,6 +305,9 @@ public class QueryContext {
public QueryContext build() {
// TODO: Add validation logic here
+ if (_queryOptions == null) {
+ _queryOptions = Collections.emptyMap();
+ }
QueryContext queryContext =
new QueryContext(_tableName, _selectExpressions, _aliasList,
_filter, _groupByExpressions, _havingFilter,
_orderByExpressions, _limit, _offset, _queryOptions,
_debugOptions, _brokerRequest);
diff --git
a/pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptions.java
b/pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptionsUtils.java
similarity index 67%
rename from
pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptions.java
rename to
pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptionsUtils.java
index 5e2c960..dff1326 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptions.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/util/QueryOptionsUtils.java
@@ -25,50 +25,10 @@ import
org.apache.pinot.spi.utils.CommonConstants.Broker.Request;
/**
- * Wrapper class to read query options
+ * Utils to parse query options.
*/
-public class QueryOptions {
- private final Long _timeoutMs;
- private final boolean _groupByModeSQL;
- private final boolean _responseFormatSQL;
- private final boolean _preserveType;
- private final boolean _skipUpsert;
-
- public QueryOptions(@Nullable Map<String, String> queryOptions) {
- if (queryOptions != null) {
- _timeoutMs = getTimeoutMs(queryOptions);
- _groupByModeSQL = isGroupByModeSQL(queryOptions);
- _responseFormatSQL =
Request.SQL.equalsIgnoreCase(queryOptions.get(Request.QueryOptionKey.RESPONSE_FORMAT));
- _preserveType =
Boolean.parseBoolean(queryOptions.get(Request.QueryOptionKey.PRESERVE_TYPE));
- _skipUpsert =
Boolean.parseBoolean(queryOptions.get(Request.QueryOptionKey.SKIP_UPSERT));
- } else {
- _timeoutMs = null;
- _groupByModeSQL = false;
- _responseFormatSQL = false;
- _preserveType = false;
- _skipUpsert = false;
- }
- }
-
- @Nullable
- public Long getTimeoutMs() {
- return _timeoutMs;
- }
-
- public boolean isGroupByModeSQL() {
- return _groupByModeSQL;
- }
-
- public boolean isResponseFormatSQL() {
- return _responseFormatSQL;
- }
-
- public boolean isPreserveType() {
- return _preserveType;
- }
-
- public boolean isSkipUpsert() {
- return _skipUpsert;
+public class QueryOptionsUtils {
+ private QueryOptionsUtils() {
}
@Nullable
@@ -87,6 +47,18 @@ public class QueryOptions {
return
Request.SQL.equalsIgnoreCase(queryOptions.get(Request.QueryOptionKey.GROUP_BY_MODE));
}
+ public static boolean isResponseFormatSQL(Map<String, String> queryOptions) {
+ return
Request.SQL.equalsIgnoreCase(queryOptions.get(Request.QueryOptionKey.RESPONSE_FORMAT));
+ }
+
+ public static boolean isPreserveType(Map<String, String> queryOptions) {
+ return
Boolean.parseBoolean(queryOptions.get(Request.QueryOptionKey.PRESERVE_TYPE));
+ }
+
+ public static boolean isSkipUpsert(Map<String, String> queryOptions) {
+ return
Boolean.parseBoolean(queryOptions.get(Request.QueryOptionKey.SKIP_UPSERT));
+ }
+
@Nullable
public static Integer getMaxExecutionThreads(Map<String, String>
queryOptions) {
String maxExecutionThreadsString =
queryOptions.get(Request.QueryOptionKey.MAX_EXECUTION_THREADS);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]