ashishjayamohan commented on code in PR #14385:
URL: https://github.com/apache/pinot/pull/14385#discussion_r1970466933
##########
pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/TimePredicateFilterOptimizer.java:
##########
@@ -411,6 +427,94 @@ && isStringLiteral(dateTimeConvertOperands.get(3)),
}
}
+ private void optimizeDateTrunc(Function filterFunction, FilterKind
filterKind) {
+ List<Expression> filterOperands = filterFunction.getOperands();
+ List<Expression> dateTruncOperands =
filterOperands.get(0).getFunctionCall().getOperands();
+
+ if (dateTruncOperands.get(1).isSetLiteral()) {
+ return;
+ }
+
+ Long lowerMillis = null;
+ Long upperMillis = null;
+ boolean lowerInclusive = true;
+ boolean upperInclusive = true;
+ List<Expression> operands = new ArrayList<>(dateTruncOperands);
+ String unit = operands.get(0).getLiteral().getStringValue();
+ String inputTimeUnit = (operands.size() >= 3) ?
operands.get(2).getLiteral().getStringValue()
+ : TimeUnit.MILLISECONDS.name();
+ if (operands.size() >= 4) {
+ if (!operands.get(3).getLiteral().getStringValue().equals("UTC")) {
+ // Leave query unoptimized if working with non-UTC time zones
+ return;
+ }
+ }
+ ISOChronology chronology = ISOChronology.getInstanceUTC();
+ String outputTimeUnit = (operands.size() == 5) ?
operands.get(4).getLiteral().getStringValue()
+ : TimeUnit.MILLISECONDS.name();
+ switch (filterKind) {
+ case EQUALS:
+ operands.set(1, getExpression(getLongValue(filterOperands.get(1)), new
DateTimeFormatSpec("TIMESTAMP")));
+ upperMillis = dateTruncCeil(operands);
+ lowerMillis = dateTruncFloor(operands);
+ if (lowerMillis != DateTimeUtils.getTimestampField(chronology,
unit).roundFloor(lowerMillis)) {
Review Comment:
Sounds good, just added a few comments that should help explain my thought
process. Let me know if anything needs some more explanation!
--
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]