1717
1818package org .apache .ignite .internal .cache .query .index ;
1919
20+ import java .util .Arrays ;
2021import java .util .Iterator ;
2122import java .util .LinkedHashMap ;
2223import java .util .Map ;
2526import org .apache .ignite .internal .cache .query .index .sorted .IndexKeyTypeSettings ;
2627import org .apache .ignite .internal .cache .query .index .sorted .MetaPageInfo ;
2728import org .apache .ignite .internal .cache .query .index .sorted .SortedIndexDefinition ;
29+ import org .apache .ignite .internal .util .typedef .F ;
2830import org .apache .ignite .internal .util .typedef .internal .U ;
2931import 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