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");

Reply via email to