4
4
5
5
#include < ydb/library/accessor/accessor.h>
6
6
7
+ #include < util/digest/numeric.h>
7
8
#include < util/system/types.h>
8
9
9
10
#include < set>
10
11
11
12
namespace NKikimr ::NSchemeShard {
12
13
13
- template <class TSetElement >
14
+ template <class TSetElement , class THashCalcer >
14
15
class TLayoutIdSet {
15
16
private:
17
+ ui64 Hash = 0 ;
16
18
std::set<TSetElement> Elements;
17
19
public:
20
+ TLayoutIdSet () = default ;
21
+ TLayoutIdSet (const TSetElement elem) {
22
+ AddId (elem);
23
+ }
24
+
18
25
typename std::set<TSetElement>::const_iterator begin () const {
19
26
return Elements.begin ();
20
27
}
@@ -27,18 +34,6 @@ class TLayoutIdSet {
27
34
return Elements.size ();
28
35
}
29
36
30
- explicit operator ui64 () const {
31
- return Hash ();
32
- }
33
-
34
- ui64 Hash () const {
35
- ui64 result = 0 ;
36
- for (auto && i : Elements) {
37
- result = CombineHashes (result, std::hash<TSetElement>()(i));
38
- }
39
- return result;
40
- }
41
-
42
37
std::vector<TSetElement> GetIdsVector () const {
43
38
return std::vector<TSetElement>(Elements.begin (), Elements.end ());
44
39
}
@@ -65,11 +60,19 @@ class TLayoutIdSet {
65
60
}
66
61
67
62
bool AddId (const TSetElement& id) {
68
- return Elements.emplace (id).second ;
63
+ bool result = Elements.emplace (id).second ;
64
+ if (result) {
65
+ Hash ^= THashCalcer::GetHash (id);
66
+ }
67
+ return result;
69
68
}
70
69
71
70
bool RemoveId (const TSetElement& id) {
72
- return Elements.erase (id);
71
+ auto result = Elements.erase (id);
72
+ if (result) {
73
+ Hash ^= THashCalcer::GetHash (id);
74
+ }
75
+ return result;
73
76
}
74
77
75
78
bool operator <(const TLayoutIdSet& item) const {
@@ -79,72 +82,52 @@ class TLayoutIdSet {
79
82
if (Elements.size () > item.Elements .size ()) {
80
83
return false ;
81
84
}
82
- auto itSelf = Elements.begin ();
83
- auto itItem = item.Elements .begin ();
84
- while (itSelf != Elements.end () && itItem != item.Elements .end ()) {
85
- if (*itSelf < *itItem) {
86
- return true ;
87
- } else if (*itSelf > *itItem) {
88
- return false ;
89
- }
90
- ++itSelf;
91
- ++itItem;
92
- }
93
- if (itSelf != Elements.end () && itItem == item.Elements .end ()) {
94
- return false ;
95
- }
96
- if (itSelf == Elements.end () && itItem != item.Elements .end ()) {
97
- return true ;
98
- }
99
- return false ;
85
+ return Hash < item.Hash ;
100
86
}
101
87
bool operator ==(const TLayoutIdSet& item) const {
102
88
if (Elements.size () != item.Elements .size ()) {
103
89
return false ;
104
90
}
105
- auto itSelf = Elements.begin ();
106
- auto itItem = item.Elements .begin ();
107
- while (itSelf != Elements.end () && itItem != item.Elements .end ()) {
108
- if (*itSelf != *itItem) {
109
- return false ;
110
- }
111
- ++itSelf;
112
- ++itItem;
113
- }
114
- return true ;
91
+ return Hash == item.Hash ;
115
92
}
116
93
};
117
94
118
95
class TSchemeShard ;
119
96
120
97
class TColumnTablesLayout {
98
+ private:
99
+ class TPathIdHashCalcer {
100
+ public:
101
+ template <class T >
102
+ static ui64 GetHash (const T& data) {
103
+ return data.Hash ();
104
+ }
105
+ };
106
+
121
107
public:
122
- using TShardIdsGroup = TLayoutIdSet<ui64>;
123
- using TTableIdsGroup = TLayoutIdSet<TPathId>;
108
+ using TTableIdsGroup = TLayoutIdSet<TPathId, TPathIdHashCalcer>;
124
109
125
110
class TTablesGroup {
126
111
private:
127
- YDB_READONLY_DEF ( TTableIdsGroup, TableIds) ;
128
- YDB_READONLY_DEF (TShardIdsGroup , ShardIds);
112
+ const TTableIdsGroup* TableIds = nullptr ;
113
+ YDB_READONLY_DEF (std::set<ui64> , ShardIds);
129
114
public:
130
- TTablesGroup (const TTableIdsGroup& tableIds, TShardIdsGroup&& shardIds)
131
- : TableIds(tableIds)
132
- , ShardIds(std::move(shardIds)) {
115
+ TTablesGroup () = default ;
116
+ TTablesGroup (const TTableIdsGroup* tableIds, std::set<ui64>&& shardIds);
133
117
134
- }
118
+ const TTableIdsGroup& GetTableIds () const ;
119
+
120
+ bool TryMerge (const TTablesGroup& item);
135
121
136
122
bool operator <(const TTablesGroup& item) const {
137
- return TableIds < item.TableIds ;
123
+ return GetTableIds () < item.GetTableIds () ;
138
124
}
139
125
};
140
126
141
127
private:
142
128
YDB_READONLY_DEF (std::vector<TTablesGroup>, Groups);
143
129
public:
144
- TColumnTablesLayout (std::vector<TTablesGroup>&& groups)
145
- : Groups(std::move(groups)) {
146
- std::sort (Groups.begin (), Groups.end ());
147
- }
130
+ TColumnTablesLayout (std::vector<TTablesGroup>&& groups);
148
131
149
132
static std::vector<ui64> ShardIdxToTabletId (const std::vector<TShardIdx>& shards, const TSchemeShard& ss);
150
133
0 commit comments