somu-imply commented on code in PR #14510:
URL: https://github.com/apache/druid/pull/14510#discussion_r1287384563
##########
sql/src/main/java/org/apache/druid/sql/calcite/planner/convertlet/TimeInIntervalConvertletFactory.java:
##########
@@ -55,7 +55,7 @@ public class TimeInIntervalConvertletFactory implements
DruidConvertletFactory
.operatorBuilder(NAME)
.operandTypeChecker(
OperandTypes.sequence(
- "'" + NAME + "(<TIMESTAMP>, <LITERAL ISO8601 INTERVAL>)'",
+ NAME + "(<TIMESTAMP>, <LITERAL ISO8601 INTERVAL>)",
Review Comment:
Updated
##########
sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java:
##########
@@ -184,6 +195,99 @@ public DruidQuery toDruidQuery(boolean
finalizeAggregations)
unnestFilterOnDataSource = null;
}
+ final DruidRel<?> newLeftDruidRel;
+ final DruidQuery updatedLeftQuery;
+
+ if (unnestDatasourceRel.getInputRexNode().getKind() ==
SqlKind.FIELD_ACCESS) {
+ final PartialDruidQuery leftPartialQueryToBeUpdated;
+ if (leftDruidRel instanceof DruidOuterQueryRel) {
+ leftPartialQueryToBeUpdated = ((DruidRel)
leftDruidRel.getInputs().get(0)).getPartialDruidQuery();
+ } else {
+ leftPartialQueryToBeUpdated = leftPartialQuery;
+ }
+ final Project leftProject =
leftPartialQueryToBeUpdated.getSelectProject();
+ final String dimensionToUpdate = expressionToUnnest.getDirectColumn();
+ final LogicalProject newProject;
+ if (leftProject == null) {
+ newProject = null;
+ } else {
+ final ProjectUpdateShuttle pus = new ProjectUpdateShuttle(
+ unwrapMvToArray(rexNodeToUnnest),
+ leftProject,
+ dimensionToUpdate
+ );
+ final List<RexNode> out = pus.visitList(leftProject.getProjects());
+ final RelDataType structType =
RexUtil.createStructType(getCluster().getTypeFactory(), out,
pus.getTypeNames());
+ newProject = LogicalProject.create(
+ leftProject.getInput(),
+ leftProject.getHints(),
+ out,
+ structType
+ );
+ }
+
+ final DruidRel leftFinalRel;
+ if (leftDruidRel instanceof DruidOuterQueryRel) {
+ leftFinalRel = (DruidRel) leftDruidRel.getInputs().get(0);
+ } else {
+ leftFinalRel = leftDruidRel;
+ }
+ final PartialDruidQuery pq =
PartialDruidQuery.create(leftPartialQueryToBeUpdated.getScan())
+
.withWhereFilter(leftPartialQueryToBeUpdated.getWhereFilter())
+
.withSelectProject(newProject)
+
.withSort(leftPartialQueryToBeUpdated.getSort());
+
+
+ if (leftPartialQuery.stage() == PartialDruidQuery.Stage.SORT_PROJECT) {
+ final Project sortProject =
leftPartialQueryToBeUpdated.getSortProject();
+ final ProjectUpdateShuttle pus = new ProjectUpdateShuttle(
+ unwrapMvToArray(rexNodeToUnnest),
+ sortProject,
+ dimensionToUpdate
+ );
+ final List<RexNode> out = pus.visitList(sortProject.getProjects());
+ final RelDataType structType =
RexUtil.createStructType(getCluster().getTypeFactory(), out,
pus.getTypeNames());
+ final Project newSortProject = LogicalProject.create(
+ sortProject.getInput(),
+ sortProject.getHints(),
+ out,
+ structType
+ );
+ newLeftDruidRel =
leftFinalRel.withPartialQuery(pq.withSortProject(newSortProject));
+ } else {
+ newLeftDruidRel = leftFinalRel.withPartialQuery(pq);
+ }
+ } else {
+ newLeftDruidRel = leftDruidRel;
+ }
+ updatedLeftQuery =
Preconditions.checkNotNull(newLeftDruidRel.toDruidQuery(false), "leftQuery");
+ VirtualColumns virtualColumns = updatedLeftQuery.getVirtualColumns(false);
+
+ if
(newLeftDruidRel.getPartialDruidQuery().stage().compareTo(PartialDruidQuery.Stage.SELECT_PROJECT)
<= 0) {
+ final Filter whereFilter =
newLeftDruidRel.getPartialDruidQuery().getWhereFilter();
+ final RowSignature leftSignature =
DruidRels.dataSourceSignature(newLeftDruidRel);
+ if (whereFilter == null) {
+ if (computeLeftRequiresSubquery(newLeftDruidRel)) {
+ // Left side is doing more than simple scan: generate a subquery.
+ leftDataSource1 = new QueryDataSource(updatedLeftQuery.getQuery());
+ } else {
+ leftDataSource1 = updatedLeftQuery.getDataSource();
+ }
+ } else {
+ final DimFilter dimFilter = Filtration.create(DruidQuery.getDimFilter(
+ getPlannerContext(),
+ leftSignature,
+ null,
+ whereFilter
+ ))
+
.optimizeFilterOnly(leftSignature).getDimFilter();
+ leftDataSource1 =
FilterDataSource.create(updatedLeftQuery.getDataSource(), dimFilter);
+ }
+ } else {
+ leftDataSource1 = new QueryDataSource(updatedLeftQuery.getQuery());
+ }
+ //if(updatedLeftQuery.getV)
Review Comment:
Removed the commented code
--
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]