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

abhishek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d73480c8f Latest aggregator factories should accept time as 
VectorValueSelecto… (#14753)
0d73480c8f is described below

commit 0d73480c8ff705ac4f6ea36720ed2eaa5484f263
Author: Soumyava <[email protected]>
AuthorDate: Fri Aug 4 00:34:25 2023 -0700

    Latest aggregator factories should accept time as VectorValueSelecto… 
(#14753)
    
    Fix the queries that have latest aggregator with an expression as time 
column
---
 .../aggregation/first/StringFirstLastUtils.java    |  4 +--
 .../last/DoubleLastAggregatorFactory.java          |  5 ++--
 .../last/FloatLastAggregatorFactory.java           |  5 ++--
 .../last/LongLastAggregatorFactory.java            |  3 +-
 .../last/StringLastAggregatorFactory.java          |  4 +--
 .../last/StringLastVectorAggregator.java           |  6 ++--
 .../apache/druid/sql/calcite/CalciteQueryTest.java | 32 ++++++++++++++++++++++
 7 files changed, 44 insertions(+), 15 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/first/StringFirstLastUtils.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/first/StringFirstLastUtils.java
index 6b93be7d70..3a9b8818cd 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/first/StringFirstLastUtils.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/first/StringFirstLastUtils.java
@@ -27,8 +27,8 @@ import org.apache.druid.segment.DimensionHandlerUtils;
 import org.apache.druid.segment.NilColumnValueSelector;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ValueType;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -79,7 +79,7 @@ public class StringFirstLastUtils
    * index of bounds issues is the responsibility of the caller
    */
   public static SerializablePairLongString readPairFromVectorSelectorsAtIndex(
-      BaseLongVectorValueSelector timeSelector,
+      VectorValueSelector timeSelector,
       VectorObjectSelector valueSelector,
       int index
   )
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/DoubleLastAggregatorFactory.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/DoubleLastAggregatorFactory.java
index 5e3fa66679..ee6c330249 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/DoubleLastAggregatorFactory.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/DoubleLastAggregatorFactory.java
@@ -43,7 +43,6 @@ import org.apache.druid.segment.NilColumnValueSelector;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnType;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorColumnSelectorFactory;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -129,8 +128,8 @@ public class DoubleLastAggregatorFactory extends 
AggregatorFactory
   {
     ColumnCapabilities capabilities = 
columnSelectorFactory.getColumnCapabilities(fieldName);
     VectorValueSelector valueSelector = 
columnSelectorFactory.makeValueSelector(fieldName);
-    //time is always long
-    BaseLongVectorValueSelector timeSelector = (BaseLongVectorValueSelector) 
columnSelectorFactory.makeValueSelector(
+
+    VectorValueSelector timeSelector = columnSelectorFactory.makeValueSelector(
         timeColumn);
     if (capabilities == null || capabilities.isNumeric()) {
       return new DoubleLastVectorAggregator(timeSelector, valueSelector);
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/FloatLastAggregatorFactory.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/FloatLastAggregatorFactory.java
index ff23c3d96d..f9fb0b3a4c 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/FloatLastAggregatorFactory.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/FloatLastAggregatorFactory.java
@@ -43,7 +43,6 @@ import org.apache.druid.segment.NilColumnValueSelector;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnType;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorColumnSelectorFactory;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -141,8 +140,8 @@ public class FloatLastAggregatorFactory extends 
AggregatorFactory
   {
     ColumnCapabilities capabilities = 
columnSelectorFactory.getColumnCapabilities(fieldName);
     VectorValueSelector valueSelector = 
columnSelectorFactory.makeValueSelector(fieldName);
-    //time is always long
-    BaseLongVectorValueSelector timeSelector = (BaseLongVectorValueSelector) 
columnSelectorFactory.makeValueSelector(
+
+    VectorValueSelector timeSelector = columnSelectorFactory.makeValueSelector(
         timeColumn);
     if (capabilities == null || capabilities.isNumeric()) {
       return new FloatLastVectorAggregator(timeSelector, valueSelector);
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/LongLastAggregatorFactory.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/LongLastAggregatorFactory.java
index a5304fe109..c089674618 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/LongLastAggregatorFactory.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/LongLastAggregatorFactory.java
@@ -42,7 +42,6 @@ import org.apache.druid.segment.NilColumnValueSelector;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnType;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorColumnSelectorFactory;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -140,7 +139,7 @@ public class LongLastAggregatorFactory extends 
AggregatorFactory
   {
     ColumnCapabilities capabilities = 
columnSelectorFactory.getColumnCapabilities(fieldName);
     VectorValueSelector valueSelector = 
columnSelectorFactory.makeValueSelector(fieldName);
-    BaseLongVectorValueSelector timeSelector = (BaseLongVectorValueSelector) 
columnSelectorFactory.makeValueSelector(
+    VectorValueSelector timeSelector = columnSelectorFactory.makeValueSelector(
         timeColumn);
     if (capabilities == null || capabilities.isNumeric()) {
       return new LongLastVectorAggregator(timeSelector, valueSelector);
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastAggregatorFactory.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastAggregatorFactory.java
index e1b39edc4a..2f135f96cc 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastAggregatorFactory.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastAggregatorFactory.java
@@ -42,9 +42,9 @@ import org.apache.druid.segment.NilColumnValueSelector;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnType;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorColumnSelectorFactory;
 import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -159,7 +159,7 @@ public class StringLastAggregatorFactory extends 
AggregatorFactory
 
     ColumnCapabilities capabilities = 
selectorFactory.getColumnCapabilities(fieldName);
     VectorObjectSelector vSelector = 
selectorFactory.makeObjectSelector(fieldName);
-    BaseLongVectorValueSelector timeSelector = (BaseLongVectorValueSelector) 
selectorFactory.makeValueSelector(
+    VectorValueSelector timeSelector = selectorFactory.makeValueSelector(
         timeColumn);
     if (capabilities != null) {
       return new StringLastVectorAggregator(timeSelector, vSelector, 
maxStringBytes);
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java
index f10584a2c7..a9c0b1e9ad 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java
@@ -24,8 +24,8 @@ import 
org.apache.druid.query.aggregation.SerializablePairLongString;
 import org.apache.druid.query.aggregation.VectorAggregator;
 import org.apache.druid.query.aggregation.first.StringFirstLastUtils;
 import org.apache.druid.segment.DimensionHandlerUtils;
-import org.apache.druid.segment.vector.BaseLongVectorValueSelector;
 import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -36,13 +36,13 @@ public class StringLastVectorAggregator implements 
VectorAggregator
       DateTimes.MIN.getMillis(),
       null
   );
-  private final BaseLongVectorValueSelector timeSelector;
+  private final VectorValueSelector timeSelector;
   private final VectorObjectSelector valueSelector;
   private final int maxStringBytes;
   protected long lastTime;
 
   public StringLastVectorAggregator(
-      @Nullable final BaseLongVectorValueSelector timeSelector,
+      @Nullable final VectorValueSelector timeSelector,
       final VectorObjectSelector valueSelector,
       final int maxStringBytes
   )
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
index 87db26ea5a..e14be37e98 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
@@ -853,6 +853,38 @@ public class CalciteQueryTest extends BaseCalciteQueryTest
     );
   }
 
+  // This test is to check if time expressions are accepted properly by the 
vectorized last aggregator
+  @Test
+  public void testLatestVectorAggregatorsOnTimeExpression()
+  {
+    notMsqCompatible();
+    testQuery(
+        "SELECT \n"
+        + "  LATEST_BY(m1, 
MILLIS_TO_TIMESTAMP(BITWISE_SHIFT_RIGHT(TIMESTAMP_TO_MILLIS(__time), 3)))\n"
+        + " FROM druid.foo GROUP BY TIME_FLOOR(__time, 'P1Y', null, 
'America/Los_Angeles')",
+        ImmutableList.of(
+            Druids.newTimeseriesQueryBuilder()
+                  .dataSource(CalciteTests.DATASOURCE1)
+                  .intervals(querySegmentSpec(Filtration.eternity()))
+                  .granularity(new PeriodGranularity(Period.years(1), null, 
DateTimes.inferTzFromString(LOS_ANGELES)))
+                  .virtualColumns(
+                      expressionVirtualColumn("v1", 
"bitwiseShiftRight(\"__time\",3)", ColumnType.LONG)
+                  )
+                  .aggregators(
+                      aggregators(
+                          new FloatLastAggregatorFactory("a0", "m1", "v1")
+                      )
+                  )
+                  .context(QUERY_CONTEXT_DEFAULT)
+                  .build()
+        ),
+        ImmutableList.of(
+            new Object[]{1.0f},
+            new Object[]{4.0f},
+            new Object[]{6.0f}
+        )
+    );
+  }
   // This test the off-heap (buffer) version of the AnyAggregator 
(Double/Float/Long) against numeric columns
   // that have null values (when run in SQL compatible null mode)
   @Test


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

Reply via email to