This is an automated email from the ASF dual-hosted git repository.

xiangfu0 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 1019930cd7e [UUID 6/8] UUID multi-stage engine (planner + runtime) 
(#18874)
1019930cd7e is described below

commit 1019930cd7e7e166b00a86400029b678d2b7a67f
Author: Xiang Fu <[email protected]>
AuthorDate: Mon Aug 17 18:06:25 2026 -0700

    [UUID 6/8] UUID multi-stage engine (planner + runtime) (#18874)
    
    Part 6/8 of splitting apache/pinot#18140. Rebased onto master after #18873, 
#19091, and #19155 merged.
    
    Round-trip Calcite UUID literals through the multi-stage engine internal 
ByteArray representation and lower UUID leaf literals directly through the 
existing binary request-literal wire format.
    
    Add focused unit coverage and one end-to-end multi-stage UUID predicate 
regression.
---
 .../tests/custom/UuidAggregationTest.java          | 10 +++++
 .../query/parser/CalciteRexExpressionParser.java   |  2 +-
 .../query/planner/logical/RexExpressionUtils.java  |  8 ++++
 .../parser/CalciteRexExpressionParserTest.java     | 46 ++++++++++++++++++++++
 .../planner/logical/RexExpressionUtilsTest.java    | 20 ++++++++++
 5 files changed, 85 insertions(+), 1 deletion(-)

diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/UuidAggregationTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/UuidAggregationTest.java
index 1b828a49998..338f94859de 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/UuidAggregationTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/UuidAggregationTest.java
@@ -138,6 +138,16 @@ public class UuidAggregationTest extends 
CustomDataQueryClusterIntegrationTest {
     }
   }
 
+  @Test(dataProvider = "useV2QueryEngine")
+  public void testMultiStageUuidLiteralPredicate(boolean 
useMultiStageQueryEngine)
+      throws Exception {
+    setUseMultiStageQueryEngine(useMultiStageQueryEngine);
+    JsonNode rows = query(String.format(
+        "SELECT COUNT(*) FROM %1$s WHERE %2$s = CAST('%3$s' AS UUID)",
+        getTableName(), UUID_RAW_SV_COLUMN, UUID_0));
+    assertCounts(rows.get(0), 2L);
+  }
+
   @Test
   public void testDistinctCountOnUuidColumns()
       throws Exception {
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
index 432ea445a51..d6f270d6f56 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/parser/CalciteRexExpressionParser.java
@@ -144,7 +144,7 @@ public class CalciteRexExpressionParser {
     ColumnDataType dataType = literal.getDataType();
     if (dataType == ColumnDataType.BOOLEAN) {
       value = BooleanUtils.isTrueInternalValue(value);
-    } else if (dataType == ColumnDataType.BYTES) {
+    } else if (dataType == ColumnDataType.BYTES || dataType == 
ColumnDataType.UUID) {
       value = ((ByteArray) value).getBytes();
     }
     return RequestUtils.getLiteral(value);
diff --git 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
index 01ba0c1d8dc..4458d4ed23a 100644
--- 
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
+++ 
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RexExpressionUtils.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Set;
+import java.util.UUID;
 import javax.annotation.Nullable;
 import org.apache.calcite.avatica.util.ByteString;
 import org.apache.calcite.plan.RelOptCluster;
@@ -53,6 +54,7 @@ import 
org.apache.pinot.common.function.scalar.arithmetic.NegateScalarFunction;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.spi.utils.BooleanUtils;
 import org.apache.pinot.spi.utils.ByteArray;
+import org.apache.pinot.spi.utils.UuidUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -149,6 +151,9 @@ public class RexExpressionUtils {
         ByteString byteString = new ByteString(bytes);
         return rexBuilder.makeBinaryLiteral(byteString);
       }
+      case UUID:
+        assert value != null;
+        return rexBuilder.makeUuidLiteral(UuidUtils.toUUID((ByteArray) value));
       default:
         throw new IllegalStateException("Unsupported ColumnDataType: " + 
literal.getDataType());
     }
@@ -264,6 +269,9 @@ public class RexExpressionUtils {
       case BYTES:
         value = new ByteArray(((ByteString) value).getBytes());
         break;
+      case UUID:
+        value = new ByteArray(UuidUtils.toBytes((UUID) value));
+        break;
       default:
         throw new IllegalStateException("Unsupported ColumnDataType: " + 
dataType);
     }
diff --git 
a/pinot-query-planner/src/test/java/org/apache/pinot/query/parser/CalciteRexExpressionParserTest.java
 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/parser/CalciteRexExpressionParserTest.java
new file mode 100644
index 00000000000..c604a8dce59
--- /dev/null
+++ 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/parser/CalciteRexExpressionParserTest.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pinot.query.parser;
+
+import org.apache.pinot.common.request.Literal;
+import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
+import org.apache.pinot.query.planner.logical.RexExpression;
+import org.apache.pinot.spi.utils.ByteArray;
+import org.apache.pinot.spi.utils.UuidUtils;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+
+/// Tests UUID literal conversion from multi-stage Rex expressions to 
single-stage request expressions.
+public class CalciteRexExpressionParserTest {
+  private static final String UUID_VALUE = 
"550e8400-e29b-41d4-a716-446655440000";
+
+  @Test
+  public void testUuidLiteralUsesBinaryValue() {
+    RexExpression.Literal uuidLiteral =
+        new RexExpression.Literal(ColumnDataType.UUID, new 
ByteArray(UuidUtils.toBytes(UUID_VALUE)));
+
+    Literal literal = CalciteRexExpressionParser.toLiteral(uuidLiteral);
+
+    assertTrue(literal.isSetBinaryValue());
+    assertEquals(literal.getBinaryValue(), UuidUtils.toBytes(UUID_VALUE));
+  }
+}
diff --git 
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/RexExpressionUtilsTest.java
 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/RexExpressionUtilsTest.java
index 44c6227508c..a0883b349a2 100644
--- 
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/RexExpressionUtilsTest.java
+++ 
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/RexExpressionUtilsTest.java
@@ -21,6 +21,7 @@ package org.apache.pinot.query.planner.logical;
 import com.google.common.collect.ImmutableRangeSet;
 import com.google.common.collect.Range;
 import java.math.BigDecimal;
+import java.util.UUID;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
@@ -31,9 +32,14 @@ import org.apache.calcite.sql.SqlCollation;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.tools.Frameworks;
+import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Sarg;
+import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 import org.apache.pinot.query.type.TypeFactory;
+import org.apache.pinot.spi.utils.ByteArray;
+import org.apache.pinot.spi.utils.UuidUtils;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -50,6 +56,20 @@ public class RexExpressionUtilsTest {
     _rexBuilder = new RexBuilder(_typeFactory);
   }
 
+  @Test
+  public void testUuidLiteralRoundTrip() {
+    UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+    RelBuilder relBuilder = 
RelBuilder.create(Frameworks.newConfigBuilder().build());
+
+    RexExpression.Literal literal = 
RexExpressionUtils.fromRexLiteral(_rexBuilder.makeUuidLiteral(uuid));
+    Assert.assertEquals(literal.getDataType(), ColumnDataType.UUID);
+    Assert.assertEquals(literal.getValue(), new 
ByteArray(UuidUtils.toBytes(uuid)));
+
+    RexLiteral roundTrip = RexExpressionUtils.toRexLiteral(relBuilder, 
literal);
+    Assert.assertEquals(roundTrip.getTypeName(), SqlTypeName.UUID);
+    Assert.assertEquals(roundTrip.getValue(), uuid);
+  }
+
   @Test
   public void testHandleSearchNullLiteralInWithNullAsUnknown() {
     // Test: NULL IN (1, 2, 3) (when nullAs = UNKNOWN)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to