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 <[email protected]>
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");