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

soumyava 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 699893bcff Fix StringLastAggregatorFactory equals/toString (#14907)
699893bcff is described below

commit 699893bcff20216b5d3a17a64e3c8c1d0e72ca9e
Author: Zoltan Haindrich <[email protected]>
AuthorDate: Fri Sep 8 18:20:54 2023 +0200

    Fix StringLastAggregatorFactory equals/toString (#14907)
    
    * update test
    
    * update test
    
    * format
    
    * test
    
    * fix0
    
    * Revert "fix0"
    
    This reverts commit 44992cb3932158c1253134bc689884abd4650fd3.
    
    * ok resultset
    
    * add plan
    
    * update test
    
    * before rewind
    
    * test
    
    * fix toString/compare/test
    
    * move test
    
    * add timeColumn to hashCode
---
 .../last/StringLastAggregatorFactory.java          |  8 ++--
 .../druid/sql/calcite/CalciteSimpleQueryTest.java  | 53 ++++++++++++++++++++++
 2 files changed, 58 insertions(+), 3 deletions(-)

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 7e414638d2..f6ca2a09d3 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
@@ -285,14 +285,15 @@ public class StringLastAggregatorFactory extends 
AggregatorFactory
     }
     StringLastAggregatorFactory that = (StringLastAggregatorFactory) o;
     return maxStringBytes == that.maxStringBytes &&
-           Objects.equals(fieldName, that.fieldName) &&
-           Objects.equals(name, that.name);
+        Objects.equals(fieldName, that.fieldName) &&
+        Objects.equals(timeColumn, that.timeColumn) &&
+        Objects.equals(name, that.name);
   }
 
   @Override
   public int hashCode()
   {
-    return Objects.hash(fieldName, name, maxStringBytes);
+    return Objects.hash(fieldName, name, maxStringBytes, timeColumn);
   }
 
   @Override
@@ -302,6 +303,7 @@ public class StringLastAggregatorFactory extends 
AggregatorFactory
            "fieldName='" + fieldName + '\'' +
            ", name='" + name + '\'' +
            ", maxStringBytes=" + maxStringBytes +
+           ", timeColumn=" + timeColumn +
            '}';
   }
 }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteSimpleQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteSimpleQueryTest.java
index 6d19619192..b339e5f4b7 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteSimpleQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteSimpleQueryTest.java
@@ -24,6 +24,8 @@ import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.Intervals;
 import org.apache.druid.java.util.common.granularity.Granularities;
 import org.apache.druid.query.aggregation.LongSumAggregatorFactory;
+import org.apache.druid.query.aggregation.first.StringFirstAggregatorFactory;
+import org.apache.druid.query.aggregation.last.StringLastAggregatorFactory;
 import org.apache.druid.query.dimension.DefaultDimensionSpec;
 import org.apache.druid.query.filter.LikeDimFilter;
 import org.apache.druid.query.groupby.GroupByQuery;
@@ -626,4 +628,55 @@ public class CalciteSimpleQueryTest extends 
BaseCalciteQueryTest
         )
     );
   }
+
+  @Test
+  public void testEarliestByLatestByWithExpression()
+  {
+    cannotVectorize();
+    testBuilder()
+        .sql("SELECT\n"
+            + "  channel\n"
+            + " ,cityName\n"
+            + " ,EARLIEST_BY(\"cityName\", MILLIS_TO_TIMESTAMP(17), 125) as 
latest_by_time_page\n"
+            + " ,LATEST_BY(\"cityName\", MILLIS_TO_TIMESTAMP(17), 126) as 
latest_by_time_page\n"
+            + " ,EARLIEST_BY(\"cityName\", TIMESTAMPADD(HOUR, 1, \"__time\"), 
127) as latest_by_time_page\n"
+            + " ,LATEST_BY(\"cityName\", TIMESTAMPADD(HOUR, 1, \"__time\"), 
128) as latest_by_time_page\n"
+            + "FROM druid.wikipedia\n"
+            + "where channel < '#b' and cityName < 'B'\n"
+            + "GROUP BY 1,2"
+            )
+        .expectedQueries(
+            ImmutableList.of(
+                GroupByQuery.builder()
+                    .setDataSource("wikipedia")
+                    .setInterval(querySegmentSpec(Filtration.eternity()))
+                    .setGranularity(Granularities.ALL)
+                    .setVirtualColumns(
+                        expressionVirtualColumn("v0", "17", ColumnType.LONG),
+                        expressionVirtualColumn("v1", "(\"__time\" + 
3600000)", ColumnType.LONG)
+                        )
+                    .setDimensions(dimensions(new 
DefaultDimensionSpec("channel", "d0"),
+                        new DefaultDimensionSpec("cityName", "d1")))
+                    .setDimFilter(
+                        and(range("channel", ColumnType.STRING, null, "#b", 
false, true),
+                            range("cityName", ColumnType.STRING, null, "B", 
false, true)))
+                    .setAggregatorSpecs(
+                        ImmutableList.of(
+                            new StringFirstAggregatorFactory("a0", "cityName", 
"v0", 125),
+                            new StringLastAggregatorFactory("a1", "cityName", 
"v0", 126),
+                            new StringFirstAggregatorFactory("a2", "cityName", 
"v1", 127),
+                            new StringLastAggregatorFactory("a3", "cityName", 
"v1", 128)
+                        )
+                        )
+                    .setContext(QUERY_CONTEXT_DEFAULT)
+                    .build()))
+        .expectedResults(
+            useDefault ? ImmutableList.of(
+                new Object[]{"#ar.wikipedia", "", "", "", "", ""},
+                new Object[] {"#ar.wikipedia", "Amman", "Amman", "Amman", 
"Amman", "Amman"})
+            : ImmutableList.of(
+                new Object[] {"#ar.wikipedia", "Amman", "Amman", "Amman", 
"Amman", "Amman"})
+        )
+        .run();
+  }
 }


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

Reply via email to