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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4edc05bc7b [core] Fix retract behavior for FieldProductAgg when 
accumulator is null (#4842)
4edc05bc7b is described below

commit 4edc05bc7b459095e7ad2226d9543305d46b6042
Author: xiangyu0xf <[email protected]>
AuthorDate: Thu Jan 9 13:58:59 2025 +0800

    [core] Fix retract behavior for FieldProductAgg when accumulator is null 
(#4842)
---
 docs/content/primary-key-table/merge-engine/aggregation.md |  2 ++
 .../mergetree/compact/aggregate/FieldProductAgg.java       |  2 +-
 .../mergetree/compact/aggregate/FieldAggregatorTest.java   | 14 +++++++-------
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/docs/content/primary-key-table/merge-engine/aggregation.md 
b/docs/content/primary-key-table/merge-engine/aggregation.md
index 0cc6507f2b..4b3b8c4b5b 100644
--- a/docs/content/primary-key-table/merge-engine/aggregation.md
+++ b/docs/content/primary-key-table/merge-engine/aggregation.md
@@ -360,6 +360,8 @@ If you allow some functions to ignore retraction messages, 
you can configure:
 
 The `last_value` and `last_non_null_value` just set field to null when accept 
retract messages.
 
+The `product` will return null for retraction message when accumulator is null.
+
 The `collect` and `merge_map` make a best-effort attempt to handle retraction 
messages, but the results are not
 guaranteed to be accurate. The following behaviors may occur when processing 
retraction messages:
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/aggregate/FieldProductAgg.java
 
b/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/aggregate/FieldProductAgg.java
index 26a0c0c52e..53ccfb94b3 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/aggregate/FieldProductAgg.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/aggregate/FieldProductAgg.java
@@ -89,7 +89,7 @@ public class FieldProductAgg extends FieldAggregator {
         Object product;
 
         if (accumulator == null || inputField == null) {
-            product = (accumulator == null ? inputField : accumulator);
+            product = accumulator;
         } else {
             switch (fieldType.getTypeRoot()) {
                 case DECIMAL:
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/mergetree/compact/aggregate/FieldAggregatorTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/mergetree/compact/aggregate/FieldAggregatorTest.java
index d32098b80f..cf99a11572 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/mergetree/compact/aggregate/FieldAggregatorTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/mergetree/compact/aggregate/FieldAggregatorTest.java
@@ -208,7 +208,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, 10)).isEqualTo(10);
         assertThat(fieldProductAgg.agg(1, 10)).isEqualTo(10);
         assertThat(fieldProductAgg.retract(10, 5)).isEqualTo(2);
-        assertThat(fieldProductAgg.retract(null, 5)).isEqualTo(5);
+        assertThat(fieldProductAgg.retract(null, 5)).isNull();
     }
 
     @Test
@@ -227,7 +227,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, (byte) 10)).isEqualTo((byte) 10);
         assertThat(fieldProductAgg.agg((byte) 1, (byte) 10)).isEqualTo((byte) 
10);
         assertThat(fieldProductAgg.retract((byte) 10, (byte) 
5)).isEqualTo((byte) 2);
-        assertThat(fieldProductAgg.retract(null, (byte) 5)).isEqualTo((byte) 
5);
+        assertThat(fieldProductAgg.retract(null, (byte) 5)).isNull();
     }
 
     @Test
@@ -237,7 +237,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, (short) 10)).isEqualTo((short) 
10);
         assertThat(fieldProductAgg.agg((short) 1, (short) 
10)).isEqualTo((short) 10);
         assertThat(fieldProductAgg.retract((short) 10, (short) 
5)).isEqualTo((short) 2);
-        assertThat(fieldProductAgg.retract(null, (short) 5)).isEqualTo((short) 
5);
+        assertThat(fieldProductAgg.retract(null, (short) 5)).isNull();
     }
 
     @Test
@@ -265,7 +265,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, 10L)).isEqualTo(10L);
         assertThat(fieldProductAgg.agg(1L, 10L)).isEqualTo(10L);
         assertThat(fieldProductAgg.retract(10L, 5L)).isEqualTo(2L);
-        assertThat(fieldProductAgg.retract(null, 5L)).isEqualTo(5L);
+        assertThat(fieldProductAgg.retract(null, 5L)).isNull();
     }
 
     @Test
@@ -275,7 +275,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, (float) 10)).isEqualTo((float) 
10);
         assertThat(fieldProductAgg.agg((float) 1, (float) 
10)).isEqualTo((float) 10);
         assertThat(fieldProductAgg.retract((float) 10, (float) 
5)).isEqualTo((float) 2);
-        assertThat(fieldProductAgg.retract(null, (float) 5)).isEqualTo((float) 
5);
+        assertThat(fieldProductAgg.retract(null, (float) 5)).isNull();
     }
 
     @Test
@@ -294,7 +294,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, (double) 10)).isEqualTo((double) 
10);
         assertThat(fieldProductAgg.agg((double) 1, (double) 
10)).isEqualTo((double) 10);
         assertThat(fieldProductAgg.retract((double) 10, (double) 
5)).isEqualTo((double) 2);
-        assertThat(fieldProductAgg.retract(null, (double) 
5)).isEqualTo((double) 5);
+        assertThat(fieldProductAgg.retract(null, (double) 5)).isNull();
     }
 
     @Test
@@ -313,7 +313,7 @@ public class FieldAggregatorTest {
         assertThat(fieldProductAgg.agg(null, 
toDecimal(10))).isEqualTo(toDecimal(10));
         assertThat(fieldProductAgg.agg(toDecimal(1), 
toDecimal(10))).isEqualTo(toDecimal(10));
         assertThat(fieldProductAgg.retract(toDecimal(10), 
toDecimal(5))).isEqualTo(toDecimal(2));
-        assertThat(fieldProductAgg.retract(null, 
toDecimal(5))).isEqualTo(toDecimal(5));
+        assertThat(fieldProductAgg.retract(null, toDecimal(5))).isNull();
     }
 
     @Test

Reply via email to