npawar commented on code in PR #9668:
URL: https://github.com/apache/pinot/pull/9668#discussion_r1008347305
##########
pinot-core/src/main/java/org/apache/pinot/core/query/prefetch/DefaultFetchPlanner.java:
##########
@@ -40,38 +40,50 @@ public class DefaultFetchPlanner implements FetchPlanner {
/**
* Get BloomFilter for columns present in EQ and IN predicates.
*/
- @Nullable
@Override
- public FetchContext planFetchForPruning(IndexSegment indexSegment,
QueryContext queryContext,
- @Nullable Map<Predicate.Type, Set<String>> requestedColumns) {
- if (requestedColumns == null) {
- return null;
- }
- Set<String> columns = new HashSet<>();
- Set<String> requested = requestedColumns.get(Predicate.Type.EQ);
- if (CollectionUtils.isNotEmpty(requested)) {
- columns.addAll(requested);
- }
- requested = requestedColumns.get(Predicate.Type.IN);
- if (CollectionUtils.isNotEmpty(requested)) {
- columns.addAll(requested);
- }
- if (columns.isEmpty()) {
- return null;
- }
+ public FetchContext planFetchForPruning(IndexSegment indexSegment,
QueryContext queryContext) {
+ // Extract columns in EQ/IN predicates.
+ Set<String> eqInColumns = new HashSet<>();
+ extractEqInColumns(Objects.requireNonNull(queryContext.getFilter()),
eqInColumns);
Map<String, List<ColumnIndexType>> columnToIndexList = new HashMap<>();
- for (String column : columns) {
+ for (String column : eqInColumns) {
DataSource dataSource = indexSegment.getDataSource(column);
if (dataSource.getBloomFilter() != null) {
columnToIndexList.put(column,
Collections.singletonList(ColumnIndexType.BLOOM_FILTER));
}
}
- if (columnToIndexList.isEmpty()) {
- return null;
- }
return new FetchContext(UUID.randomUUID(), indexSegment.getSegmentName(),
columnToIndexList);
}
+ protected static void extractEqInColumns(FilterContext filter, Set<String>
eqInColumns) {
+ switch (filter.getType()) {
+ case AND:
+ case OR:
+ for (FilterContext child : filter.getChildren()) {
+ extractEqInColumns(child, eqInColumns);
+ }
+ break;
+ case NOT:
+ // Do not track the predicates under NOT filter
+ break;
+ case PREDICATE:
+ Predicate predicate = filter.getPredicate();
+ ExpressionContext lhs = predicate.getLhs();
+ if (lhs.getType() != ExpressionContext.Type.IDENTIFIER) {
+ // Only prune columns
+ break;
+ }
+ String column = lhs.getIdentifier();
+ Predicate.Type predicateType = predicate.getType();
+ if (predicateType == Predicate.Type.EQ || predicateType ==
Predicate.Type.IN) {
Review Comment:
dont we need this condition too in IN `if (inPredicate.getValues().size() <=
_inPredicateThreshold) {` ?
##########
pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/FetchContext.java:
##########
@@ -83,4 +83,8 @@ public String getSegmentName() {
public Map<String, List<ColumnIndexType>> getColumnToIndexList() {
return _columnToIndexList;
}
+
+ public boolean isEmpty() {
Review Comment:
didn't follow why we need this as a method
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]