From f7ea1881752007113738931e6578a8afd1e7e8a0 Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Fri, 25 Oct 2024 10:22:31 +0800 Subject: [PATCH] fix MapBigArray Signed-off-by: Weihao Li <18110526956@163.com> --- .../aggregation/AccumulatorFactory.java | 18 ++++++++++++++++++ .../aggregation/grouped/array/MapBigArray.java | 10 +++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java index 5003883eb45a..f47c8121e76a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java @@ -33,7 +33,9 @@ import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedMaxByAccumulator; import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedMinAccumulator; import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedMinByAccumulator; +import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedModeAccumulator; import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedSumAccumulator; +import org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.GroupedVarianceAccumulator; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SymbolReference; @@ -135,6 +137,22 @@ private static GroupedAccumulator createBuiltinGroupedAccumulator( return new GroupedMaxByAccumulator(inputDataTypes.get(0), inputDataTypes.get(1)); case MIN_BY: return new GroupedMinByAccumulator(inputDataTypes.get(0), inputDataTypes.get(1)); + case MODE: + return new GroupedModeAccumulator(inputDataTypes.get(0)); + case STDDEV: + case STDDEV_SAMP: + return new GroupedVarianceAccumulator( + inputDataTypes.get(0), VarianceAccumulator.VarianceType.STDDEV_SAMP); + case STDDEV_POP: + return new GroupedVarianceAccumulator( + inputDataTypes.get(0), VarianceAccumulator.VarianceType.STDDEV_POP); + case VARIANCE: + case VAR_SAMP: + return new GroupedVarianceAccumulator( + inputDataTypes.get(0), VarianceAccumulator.VarianceType.VAR_SAMP); + case VAR_POP: + return new GroupedVarianceAccumulator( + inputDataTypes.get(0), VarianceAccumulator.VarianceType.VAR_POP); default: throw new IllegalArgumentException("Invalid Aggregation function: " + aggregationType); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/array/MapBigArray.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/array/MapBigArray.java index bcf755a79743..3b24fd0485a0 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/array/MapBigArray.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/array/MapBigArray.java @@ -45,7 +45,12 @@ public long sizeOf() { * @return the element of this big array at the specified position. */ public HashMap get(long index) { - return array.get(index); + HashMap result = array.get(index); + if (result == null) { + result = new HashMap<>(); + array.set(index, result); + } + return result; } /** @@ -54,6 +59,9 @@ public HashMap get(long index) { * @param index a position in this big array. */ public void set(long index, HashMap value) { + if (value == null) { + this.set(index, new HashMap<>()); + } updateRetainedSize(index, value); array.set(index, value); }