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 5fbd079168 Fix literal type handling in LiteralValueExtractor (#13715)
5fbd079168 is described below

commit 5fbd07916897b5d45bb644c890ff7a1aeda409f9
Author: Yash Mayya <[email protected]>
AuthorDate: Wed Aug 14 10:11:22 2024 +0530

    Fix literal type handling in LiteralValueExtractor (#13715)
---
 .../pinot/core/query/reduce/GapfillFilterHandler.java  |  2 +-
 .../core/query/reduce/PostAggregationHandler.java      |  2 +-
 .../query/reduce/filter/LiteralValueExtractor.java     | 13 ++++++++-----
 .../core/query/reduce/PostAggregationHandlerTest.java  | 18 ++++++++++++++++++
 4 files changed, 28 insertions(+), 7 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GapfillFilterHandler.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GapfillFilterHandler.java
index 6f694cc04e..8ec110a0cf 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GapfillFilterHandler.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/GapfillFilterHandler.java
@@ -67,7 +67,7 @@ public class GapfillFilterHandler implements 
ValueExtractorFactory {
     expression = GapfillUtils.stripGapfill(expression);
     if (expression.getType() == ExpressionContext.Type.LITERAL) {
       // Literal
-      return new 
LiteralValueExtractor(expression.getLiteral().getStringValue());
+      return new LiteralValueExtractor(expression.getLiteral());
     }
 
     if (expression.getType() == ExpressionContext.Type.IDENTIFIER) {
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/PostAggregationHandler.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/PostAggregationHandler.java
index efa4445872..4c4bcaf03c 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/PostAggregationHandler.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/PostAggregationHandler.java
@@ -108,7 +108,7 @@ public class PostAggregationHandler implements 
ValueExtractorFactory {
   public ValueExtractor getValueExtractor(ExpressionContext expression) {
     if (expression.getType() == ExpressionContext.Type.LITERAL) {
       // Literal
-      return new 
LiteralValueExtractor(expression.getLiteral().getStringValue());
+      return new LiteralValueExtractor(expression.getLiteral());
     }
     if (_numGroupByExpressions > 0) {
       Integer groupByExpressionIndex = 
_groupByExpressionIndexMap.get(expression);
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/filter/LiteralValueExtractor.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/filter/LiteralValueExtractor.java
index 82f06bdf18..3622cba5ee 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/filter/LiteralValueExtractor.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/reduce/filter/LiteralValueExtractor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pinot.core.query.reduce.filter;
 
+import org.apache.pinot.common.request.context.LiteralContext;
 import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
 
 
@@ -25,24 +26,26 @@ import 
org.apache.pinot.common.utils.DataSchema.ColumnDataType;
  * Value extractor for a literal.
  */
 public class LiteralValueExtractor implements ValueExtractor {
-  private final String _literal;
+  private final LiteralContext _literal;
 
-  public LiteralValueExtractor(String literal) {
+  public LiteralValueExtractor(LiteralContext literal) {
     _literal = literal;
   }
 
   @Override
   public String getColumnName() {
-    return '\'' + _literal + '\'';
+    return _literal.toString();
   }
 
   @Override
   public ColumnDataType getColumnDataType() {
-    return ColumnDataType.STRING;
+    ColumnDataType columnDataType = 
ColumnDataType.fromDataType(_literal.getType(), _literal.isSingleValue());
+    // Handle unrecognized result class with STRING
+    return columnDataType == ColumnDataType.UNKNOWN ? ColumnDataType.STRING : 
columnDataType;
   }
 
   @Override
   public Object extract(Object[] row) {
-    return _literal;
+    return _literal.getValue();
   }
 }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/query/reduce/PostAggregationHandlerTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/query/reduce/PostAggregationHandlerTest.java
index f07f19eca7..f824d9a417 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/query/reduce/PostAggregationHandlerTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/query/reduce/PostAggregationHandlerTest.java
@@ -120,4 +120,22 @@ public class PostAggregationHandlerTest {
       assertEquals(handler.getResult(new Object[]{6, 7L, 8.0, 9.0, 10.0}), new 
Object[]{5.5, 7L});
     }
   }
+
+  @Test
+  public void testLiteralTypeHandling() {
+    QueryContext queryContext = QueryContextConverterUtils
+        .getQueryContext("SELECT COUNT(*), 1 FROM testTable GROUP BY d1");
+    DataSchema dataSchema =
+        new DataSchema(new String[]{"d1", "count(*)"}, new 
ColumnDataType[]{ColumnDataType.INT, ColumnDataType.LONG});
+    PostAggregationHandler postAggregationHandler = new 
PostAggregationHandler(queryContext, dataSchema);
+
+    
assertEquals(postAggregationHandler.getResultDataSchema().getColumnDataTypes(),
+        new ColumnDataType[]{ColumnDataType.LONG, ColumnDataType.INT});
+
+    queryContext = QueryContextConverterUtils
+        .getQueryContext("SELECT COUNT(*), '1' FROM testTable GROUP BY d1");
+    postAggregationHandler = new PostAggregationHandler(queryContext, 
dataSchema);
+    
assertEquals(postAggregationHandler.getResultDataSchema().getColumnDataTypes(),
+        new ColumnDataType[]{ColumnDataType.LONG, ColumnDataType.STRING});
+  }
 }


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

Reply via email to