Skip to content

Commit c8fbf35

Browse files
authored
IGNITE-27399 Keep order in IndexQueryResultMeta message (#12591)
1 parent b62b765 commit c8fbf35

1 file changed

Lines changed: 51 additions & 16 deletions

File tree

modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexQueryResultMeta.java

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.apache.ignite.internal.cache.query.index;
1919

20+
import java.util.Arrays;
2021
import java.util.Iterator;
2122
import java.util.LinkedHashMap;
2223
import java.util.Map;
@@ -25,8 +26,10 @@
2526
import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings;
2627
import org.apache.ignite.internal.cache.query.index.sorted.MetaPageInfo;
2728
import org.apache.ignite.internal.cache.query.index.sorted.SortedIndexDefinition;
29+
import org.apache.ignite.internal.util.typedef.F;
2830
import org.apache.ignite.internal.util.typedef.internal.U;
2931
import org.apache.ignite.plugin.extensions.communication.Message;
32+
import org.jetbrains.annotations.Nullable;
3033

3134
/**
3235
* 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 {
3740
@Order(0)
3841
private IndexKeyTypeSettings keyTypeSettings;
3942

40-
/** Index key definitions. */
41-
@Order(value = 1, method = "keyDefinitions")
42-
private LinkedHashMap<String, IndexKeyDefinition> keyDefs;
43+
/** Index names order holder. Should be serialized together with the definitions. */
44+
@Order(value = 1, method = "orderedIndexNames")
45+
private @Nullable String[] idxNames;
46+
47+
/** Index definitions serialization holder. Should be serialized together with the names. */
48+
@Order(value = 2, method = "orderedIndexDefinitions")
49+
private @Nullable IndexKeyDefinition[] idxDefs;
4350

4451
/** */
4552
public IndexQueryResultMeta() {
@@ -50,14 +57,18 @@ public IndexQueryResultMeta() {
5057
public IndexQueryResultMeta(SortedIndexDefinition def, int critSize) {
5158
keyTypeSettings = def.keyTypeSettings();
5259

53-
keyDefs = U.newLinkedHashMap(critSize);
54-
5560
Iterator<Map.Entry<String, IndexKeyDefinition>> keys = def.indexKeyDefinitions().entrySet().iterator();
5661

57-
for (int i = 0; i < critSize; i++) {
58-
Map.Entry<String, IndexKeyDefinition> key = keys.next();
62+
if (critSize > 0) {
63+
idxNames = new String[critSize];
64+
idxDefs = new IndexKeyDefinition[critSize];
5965

60-
keyDefs.put(key.getKey(), key.getValue());
66+
for (int i = 0; i < critSize; i++) {
67+
Map.Entry<String, IndexKeyDefinition> key = keys.next();
68+
69+
idxNames[i] = key.getKey();
70+
idxDefs[i] = key.getValue();
71+
}
6172
}
6273
}
6374

@@ -76,15 +87,39 @@ public void keyTypeSettings(IndexKeyTypeSettings keyTypeSettings) {
7687
this.keyTypeSettings = keyTypeSettings;
7788
}
7889

79-
/** */
80-
public Map<String, IndexKeyDefinition> keyDefinitions() {
81-
return keyDefs;
90+
/** @return Map of index definitions with proper order. */
91+
public LinkedHashMap<String, IndexKeyDefinition> keyDefinitions() {
92+
if (F.isEmpty(idxNames) && F.isEmpty(idxDefs))
93+
return U.newLinkedHashMap(0);
94+
95+
assert idxNames.length == idxDefs.length : "Number of index names and index definitions must be equal " +
96+
"[idxNames=" + Arrays.toString(idxNames) + ", idxDefs=" + Arrays.toString(idxDefs) + "]";
97+
98+
LinkedHashMap<String, IndexKeyDefinition> idxDefsMap = U.newLinkedHashMap(idxNames.length);
99+
100+
for (int i = 0; i < idxNames.length; i++)
101+
idxDefsMap.put(idxNames[i], idxDefs[i]);
102+
103+
return idxDefsMap;
82104
}
83105

84-
/** */
85-
public void keyDefinitions(Map<String, IndexKeyDefinition> keyDefs) {
86-
this.keyDefs = keyDefs == null
87-
? null
88-
: keyDefs instanceof LinkedHashMap ? (LinkedHashMap)keyDefs : new LinkedHashMap<>(keyDefs);
106+
/** @return Index names with proper order. */
107+
public @Nullable String[] orderedIndexNames() {
108+
return idxNames;
109+
}
110+
111+
/** Stores index names with proper order to build the linked map later. */
112+
public void orderedIndexNames(@Nullable String[] idxNames) {
113+
this.idxNames = idxNames;
114+
}
115+
116+
/** @return Index definitions with proper order. */
117+
public @Nullable IndexKeyDefinition[] orderedIndexDefinitions() {
118+
return idxDefs;
119+
}
120+
121+
/** Process the index definitions with proper order and buils the linked map. */
122+
public void orderedIndexDefinitions(@Nullable IndexKeyDefinition[] idxDefs) {
123+
this.idxDefs = idxDefs;
89124
}
90125
}

0 commit comments

Comments
 (0)