This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-25942 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit a67f26c7b7b430fcf344afdbc47b909898a02bfc Author: amashenkov <[email protected]> AuthorDate: Thu Jul 17 14:27:57 2025 +0300 minor --- .../internal/sql/engine/exec/exp/agg/Accumulators.java | 16 +++++++--------- .../sql/engine/exec/exp/agg/AccumulatorsFactory.java | 6 +++--- .../ignite/internal/sql/engine/util/PlanUtils.java | 4 +--- .../engine/exec/exp/agg/LiteralValAccumulatorTest.java | 3 ++- .../ignite/internal/sql/engine/util/PlanUtilsTest.java | 5 +++-- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java index 6ff88ffb264..f890338380e 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java @@ -19,7 +19,6 @@ package org.apache.ignite.internal.sql.engine.exec.exp.agg; import static org.apache.calcite.sql.type.SqlTypeName.ANY; import static org.apache.calcite.sql.type.SqlTypeName.BIGINT; -import static org.apache.calcite.sql.type.SqlTypeName.BOOLEAN; import static org.apache.calcite.sql.type.SqlTypeName.DECIMAL; import static org.apache.calcite.sql.type.SqlTypeName.DOUBLE; import static org.apache.calcite.sql.type.SqlTypeName.VARBINARY; @@ -31,7 +30,7 @@ import java.util.Comparator; import java.util.List; import java.util.function.IntFunction; import java.util.function.Supplier; -import org.apache.calcite.DataContexts; +import org.apache.calcite.DataContext; import org.apache.calcite.avatica.util.ByteString; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.type.RelDataType; @@ -69,11 +68,11 @@ public class Accumulators { /** * Returns a supplier that creates a accumulator functions for the given aggregate call. */ - public Supplier<Accumulator> accumulatorFactory(AggregateCall call, RelDataType inputType) { - return accumulatorFunctionFactory(call, inputType); + public Supplier<Accumulator> accumulatorFactory(DataContext context, AggregateCall call, RelDataType inputType) { + return accumulatorFunctionFactory(context, call, inputType); } - private Supplier<Accumulator> accumulatorFunctionFactory(AggregateCall call, RelDataType inputType) { + private Supplier<Accumulator> accumulatorFunctionFactory(DataContext context, AggregateCall call, RelDataType inputType) { // Update documentation in IgniteCustomType when you add an aggregate // that can work for any type out of the box. switch (call.getAggregation().getName()) { @@ -99,9 +98,8 @@ public class Accumulators { assert call.rexList.size() == 1 : "Incorrect number of pre-operands for LiteralAgg: " + call + ", input: " + inputType; RexNode lit = call.rexList.get(0); assert lit instanceof RexLiteral : "Non-literal argument for LiteralAgg: " + call + ", argument: " + lit; - assert lit.getType().getSqlTypeName() == BOOLEAN : "Unsupported argument for LiteralAgg: " + call + ", argument: " + lit; - return LiteralVal.newAccumulator((RexLiteral) lit); + return LiteralVal.newAccumulator(context, (RexLiteral) lit); default: throw new AssertionError(call.getAggregation().getName()); } @@ -288,12 +286,12 @@ public class Accumulators { * @param literal Literal. * @return Accumulator factory function. */ - public static Supplier<Accumulator> newAccumulator(RexLiteral literal) { + public static Supplier<Accumulator> newAccumulator(DataContext context, RexLiteral literal) { Class<?> javaClass = (Class<?>) Commons.typeFactory().getJavaClass(literal.getType()); if (javaClass.isPrimitive()) { javaClass = Primitives.wrap(javaClass); } - Object value = RexUtils.literalValue(DataContexts.EMPTY, literal, javaClass); + Object value = RexUtils.literalValue(context, literal, javaClass); return () -> new LiteralVal(literal.getType(), value); } diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java index d1eba8ad448..7f28df0fbb9 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java @@ -189,18 +189,18 @@ public class AccumulatorsFactory<RowT> { /** {@inheritDoc} */ @Override public AccumulatorWrapper<RowT> apply(ExecutionContext<RowT> context) { - Accumulator accumulator = accumulator(); + Accumulator accumulator = accumulator(context); return new AccumulatorWrapperImpl<>(context, accumulator, call, inAdapter, outAdapter); } - private Accumulator accumulator() { + private Accumulator accumulator(DataContext context) { if (accFactory != null) { return accFactory.get(); } // init factory and adapters - accFactory = accumulators.accumulatorFactory(call, inputRowType); + accFactory = accumulators.accumulatorFactory(context, call, inputRowType); Accumulator accumulator = accFactory.get(); inAdapter = createInAdapter(accumulator); diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/PlanUtils.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/PlanUtils.java index 4d7af9d0c14..209ea7acc06 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/PlanUtils.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/PlanUtils.java @@ -30,7 +30,6 @@ import org.apache.calcite.sql.fun.SqlSumAggFunction; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.mapping.Mapping; -import org.apache.ignite.internal.sql.engine.exec.exp.agg.Accumulator; import org.apache.ignite.internal.sql.engine.exec.exp.agg.Accumulators; import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory; @@ -132,7 +131,6 @@ public class PlanUtils { for (int i = 0; i < aggregateCalls.size(); i++) { AggregateCall call = aggregateCalls.get(i); - Accumulator acc = accumulators.accumulatorFactory(call, inputType).get(); RelDataType fieldType; // For a decimal type Accumulator::returnType returns a type with default precision and scale, // that can cause precision loss when a tuple is sent over the wire by an exchanger/outbox. @@ -141,7 +139,7 @@ public class PlanUtils { if (call.getType().getSqlTypeName().allowsScale()) { fieldType = call.type; } else { - fieldType = acc.returnType(typeFactory); + fieldType = call.getAggregation().inferReturnType(typeFactory, List.of(call.getType())); } String fieldName = "_ACC" + i; diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/LiteralValAccumulatorTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/LiteralValAccumulatorTest.java index 81787ea03e4..767503946df 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/LiteralValAccumulatorTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/LiteralValAccumulatorTest.java @@ -20,6 +20,7 @@ package org.apache.ignite.internal.sql.engine.exec.exp.agg; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.function.Supplier; +import org.apache.calcite.DataContexts; import org.apache.ignite.internal.sql.engine.exec.exp.agg.Accumulators.LiteralVal; import org.apache.ignite.internal.sql.engine.util.Commons; import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest; @@ -48,7 +49,7 @@ public class LiteralValAccumulatorTest extends BaseIgniteAbstractTest { } private StatefulAccumulator newCall(boolean literal) { - Supplier<Accumulator> supplier = LiteralVal.newAccumulator(Commons.rexBuilder().makeLiteral(literal)); + Supplier<Accumulator> supplier = LiteralVal.newAccumulator(DataContexts.EMPTY, Commons.rexBuilder().makeLiteral(literal)); return new StatefulAccumulator(supplier); } } diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/PlanUtilsTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/PlanUtilsTest.java index ac13578f9d8..057df67802e 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/PlanUtilsTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/PlanUtilsTest.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import com.google.common.collect.ImmutableList; import java.util.Arrays; import java.util.List; +import org.apache.calcite.DataContexts; import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.type.RelDataType; @@ -53,7 +54,7 @@ public class PlanUtilsTest { .build(); AggregateCall call1 = newCall(typeFactory.createSqlType(SqlTypeName.BIGINT)); - Accumulator acc1 = accumulators.accumulatorFactory(call1, inputType).get(); + Accumulator acc1 = accumulators.accumulatorFactory(DataContexts.EMPTY, call1, inputType).get(); RelDataType expectedType = new RelDataTypeFactory.Builder(typeFactory) .add("f1", typeFactory.createSqlType(SqlTypeName.INTEGER)) @@ -83,7 +84,7 @@ public class PlanUtilsTest { .build(); AggregateCall call1 = newCall(typeFactory.createSqlType(SqlTypeName.BIGINT)); - Accumulator acc1 = accumulators.accumulatorFactory(call1, inputType).get(); + Accumulator acc1 = accumulators.accumulatorFactory(DataContexts.EMPTY, call1, inputType).get(); RelDataType expectedType = new RelDataTypeFactory.Builder(typeFactory) .add("f1", typeFactory.createSqlType(SqlTypeName.INTEGER))
