This is an automated email from the ASF dual-hosted git repository. apolovtsev pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 543544b5dc6 IGNITE-26224 Improve tuple map handling (#6438) 543544b5dc6 is described below commit 543544b5dc656c12804f3af2222f08d905664b94 Author: Alexander Polovtcev <alex.polovt...@gmail.com> AuthorDate: Mon Aug 18 16:42:53 2025 +0300 IGNITE-26224 Improve tuple map handling (#6438) --- .../src/main/java/org/apache/ignite/table/TupleImpl.java | 16 +++++++++++++++- .../internal/schema/marshaller/TupleMarshallerImpl.java | 16 +++++++++++----- .../schema/marshaller/TupleMarshallerStatisticsTest.java | 2 +- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/modules/api/src/main/java/org/apache/ignite/table/TupleImpl.java b/modules/api/src/main/java/org/apache/ignite/table/TupleImpl.java index f0e62c89a8b..b25f6f50e7e 100644 --- a/modules/api/src/main/java/org/apache/ignite/table/TupleImpl.java +++ b/modules/api/src/main/java/org/apache/ignite/table/TupleImpl.java @@ -68,7 +68,21 @@ class TupleImpl implements Tuple, Serializable { * @param capacity Initial capacity. */ TupleImpl(int capacity) { - this(new HashMap<>(capacity), new ArrayList<>(capacity), new ArrayList<>(capacity)); + this(new HashMap<>(capacity(capacity)), new ArrayList<>(capacity), new ArrayList<>(capacity)); + } + + // Copied from IgniteUtils, because it's not accessible from this module. + // FIXME: https://issues.apache.org/jira/browse/IGNITE-26228 + private static int capacity(int expSize) { + if (expSize < 3) { + return expSize + 1; + } + + if (expSize < (1 << 30)) { + return expSize + expSize / 3; + } + + return Integer.MAX_VALUE; // any large value } /** diff --git a/modules/table/src/main/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerImpl.java index 48f049b8f97..2c99f96e87c 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerImpl.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerImpl.java @@ -18,9 +18,9 @@ package org.apache.ignite.internal.schema.marshaller; import static org.apache.ignite.internal.schema.marshaller.MarshallerUtil.getValueSize; +import static org.apache.ignite.internal.util.IgniteUtils.newHashMap; import java.math.BigDecimal; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -108,7 +108,8 @@ public class TupleMarshallerImpl implements TupleMarshaller { } TuplePart part = TuplePart.KEY_VALUE; - ValuesWithStatistics valuesWithStatistics = new ValuesWithStatistics(); + + var valuesWithStatistics = new ValuesWithStatistics(schema.length()); gatherStatistics(part, tuple, valuesWithStatistics); @@ -128,7 +129,7 @@ public class TupleMarshallerImpl implements TupleMarshaller { @Override public Row marshal(Tuple keyTuple, @Nullable Tuple valTuple) throws MarshallerException { try { - ValuesWithStatistics valuesWithStatistics = new ValuesWithStatistics(); + var valuesWithStatistics = new ValuesWithStatistics(valTuple == null ? schema.keyColumns().size() : schema.length()); gatherStatistics(TuplePart.KEY, keyTuple, valuesWithStatistics); @@ -159,7 +160,8 @@ public class TupleMarshallerImpl implements TupleMarshaller { @Override public Row marshalKey(Tuple keyTuple) throws MarshallerException { try { - ValuesWithStatistics valuesWithStatistics = new ValuesWithStatistics(); + var valuesWithStatistics = new ValuesWithStatistics(schema.keyColumns().size()); + TuplePart part = TuplePart.KEY; gatherStatistics(part, keyTuple, valuesWithStatistics); @@ -334,11 +336,15 @@ public class TupleMarshallerImpl implements TupleMarshaller { * to build row with {@link RowAssembler}. */ static class ValuesWithStatistics { - private final Map<String, Object> values = new HashMap<>(); + private final Map<String, Object> values; private int estimatedValueSize; private int knownColumns; + ValuesWithStatistics(int numValues) { + values = newHashMap(numValues); + } + @Nullable Object value(String columnName) { return values.get(columnName); } diff --git a/modules/table/src/test/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerStatisticsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerStatisticsTest.java index aa194718219..2a818a5c371 100644 --- a/modules/table/src/test/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerStatisticsTest.java +++ b/modules/table/src/test/java/org/apache/ignite/internal/schema/marshaller/TupleMarshallerStatisticsTest.java @@ -63,7 +63,7 @@ public class TupleMarshallerStatisticsTest { assertThat(sizeInBytes(hugeScaledDecimal), is(greaterThan(16384))); - ValuesWithStatistics statistics = new ValuesWithStatistics(); + ValuesWithStatistics statistics = new ValuesWithStatistics(1); marshaller.gatherStatistics(TuplePart.KEY, tuple, statistics); assertThat(statistics.estimatedValueSize(), is(3)); BigDecimal compactedValue = (BigDecimal) statistics.value("KEY");