diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexQueryResultMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexQueryResultMeta.java index 1516611d842f1..453f73bdd0a32 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexQueryResultMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexQueryResultMeta.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.cache.query.index; +import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; @@ -25,8 +26,10 @@ import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings; import org.apache.ignite.internal.cache.query.index.sorted.MetaPageInfo; import org.apache.ignite.internal.cache.query.index.sorted.SortedIndexDefinition; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.plugin.extensions.communication.Message; +import org.jetbrains.annotations.Nullable; /** * Metadata for IndexQuery response. This information is required to be sent to a node that initiated a query. @@ -37,9 +40,13 @@ public class IndexQueryResultMeta implements Message { @Order(0) private IndexKeyTypeSettings keyTypeSettings; - /** Index key definitions. */ - @Order(value = 1, method = "keyDefinitions") - private LinkedHashMap keyDefs; + /** Index names order holder. Should be serialized together with the definitions. */ + @Order(value = 1, method = "orderedIndexNames") + private @Nullable String[] idxNames; + + /** Index definitions serialization holder. Should be serialized together with the names. */ + @Order(value = 2, method = "orderedIndexDefinitions") + private @Nullable IndexKeyDefinition[] idxDefs; /** */ public IndexQueryResultMeta() { @@ -50,14 +57,18 @@ public IndexQueryResultMeta() { public IndexQueryResultMeta(SortedIndexDefinition def, int critSize) { keyTypeSettings = def.keyTypeSettings(); - keyDefs = U.newLinkedHashMap(critSize); - Iterator> keys = def.indexKeyDefinitions().entrySet().iterator(); - for (int i = 0; i < critSize; i++) { - Map.Entry key = keys.next(); + if (critSize > 0) { + idxNames = new String[critSize]; + idxDefs = new IndexKeyDefinition[critSize]; - keyDefs.put(key.getKey(), key.getValue()); + for (int i = 0; i < critSize; i++) { + Map.Entry key = keys.next(); + + idxNames[i] = key.getKey(); + idxDefs[i] = key.getValue(); + } } } @@ -76,15 +87,39 @@ public void keyTypeSettings(IndexKeyTypeSettings keyTypeSettings) { this.keyTypeSettings = keyTypeSettings; } - /** */ - public Map keyDefinitions() { - return keyDefs; + /** @return Map of index definitions with proper order. */ + public LinkedHashMap keyDefinitions() { + if (F.isEmpty(idxNames) && F.isEmpty(idxDefs)) + return U.newLinkedHashMap(0); + + assert idxNames.length == idxDefs.length : "Number of index names and index definitions must be equal " + + "[idxNames=" + Arrays.toString(idxNames) + ", idxDefs=" + Arrays.toString(idxDefs) + "]"; + + LinkedHashMap idxDefsMap = U.newLinkedHashMap(idxNames.length); + + for (int i = 0; i < idxNames.length; i++) + idxDefsMap.put(idxNames[i], idxDefs[i]); + + return idxDefsMap; } - /** */ - public void keyDefinitions(Map keyDefs) { - this.keyDefs = keyDefs == null - ? null - : keyDefs instanceof LinkedHashMap ? (LinkedHashMap)keyDefs : new LinkedHashMap<>(keyDefs); + /** @return Index names with proper order. */ + public @Nullable String[] orderedIndexNames() { + return idxNames; + } + + /** Stores index names with proper order to build the linked map later. */ + public void orderedIndexNames(@Nullable String[] idxNames) { + this.idxNames = idxNames; + } + + /** @return Index definitions with proper order. */ + public @Nullable IndexKeyDefinition[] orderedIndexDefinitions() { + return idxDefs; + } + + /** Process the index definitions with proper order and buils the linked map. */ + public void orderedIndexDefinitions(@Nullable IndexKeyDefinition[] idxDefs) { + this.idxDefs = idxDefs; } }