@@ -65,9 +65,21 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
65
65
66
66
class TSelectCommand : public ICommand {
67
67
private:
68
- const TString Command;
69
- const TString Compare;
68
+ TString Command;
69
+ TString Compare;
70
+ std::optional<ui64> ExpectIndexSkip;
71
+ std::optional<ui64> ExpectIndexNoData;
72
+ std::optional<ui64> ExpectIndexApprove;
73
+ ui64 IndexSkipStart = 0 ;
74
+ ui64 IndexNoDataStart = 0 ;
75
+ ui64 IndexApproveStart = 0 ;
76
+
70
77
virtual TConclusionStatus DoExecute (TKikimrRunner& kikimr) override {
78
+ auto controller = NYDBTest::TControllers::GetControllerAs<NYDBTest::NColumnShard::TController>();
79
+ AFL_VERIFY (controller);
80
+ IndexSkipStart = controller->GetIndexesSkippingOnSelect ().Val ();
81
+ IndexApproveStart = controller->GetIndexesApprovedOnSelect ().Val ();
82
+ IndexNoDataStart = controller->GetIndexesSkippedNoData ().Val ();
71
83
Cerr << " EXECUTE: " << Command << Endl;
72
84
auto session = kikimr.GetTableClient ().CreateSession ().GetValueSync ().GetSession ();
73
85
auto it = kikimr.GetQueryClient ().StreamExecuteQuery (Command, NYdb::NQuery::TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ();
@@ -78,14 +90,76 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
78
90
Cerr << " OUTPUT: " << output << Endl;
79
91
CompareYson (output, Compare);
80
92
}
93
+ const ui32 skip = controller->GetIndexesSkippingOnSelect ().Val () - IndexSkipStart;
94
+ const ui32 noData = controller->GetIndexesSkippedNoData ().Val () - IndexNoDataStart;
95
+ const ui32 approves = controller->GetIndexesApprovedOnSelect ().Val () - IndexApproveStart;
96
+ Cerr << noData << " /" << skip << " /" << approves << Endl;
97
+ if (ExpectIndexSkip) {
98
+ AFL_VERIFY (skip == *ExpectIndexSkip)(" expect" , ExpectIndexSkip)(" real" , skip)(
99
+ " current" , controller->GetIndexesSkippingOnSelect ().Val ())(
100
+ " pred" , IndexSkipStart);
101
+ }
102
+ if (ExpectIndexNoData) {
103
+ AFL_VERIFY (noData == *ExpectIndexNoData)(" expect" , ExpectIndexNoData)(" real" , noData)(
104
+ " current" , controller->GetIndexesSkippedNoData ().Val ())(
105
+ " pred" , IndexNoDataStart);
106
+ }
107
+ if (ExpectIndexApprove) {
108
+ AFL_VERIFY (approves == *ExpectIndexApprove)(" expect" , ExpectIndexApprove)(" real" , approves)(
109
+ " current" , controller->GetIndexesApprovedOnSelect ().Val ())(" pred" , IndexApproveStart);
110
+ }
81
111
return TConclusionStatus::Success ();
82
112
}
83
113
84
114
public:
85
- TSelectCommand (const TString& command, const TString& compare)
86
- : Command(command)
87
- , Compare(compare) {
115
+ bool DeserializeFromString (const TString& info) {
116
+ auto lines = StringSplitter (info).SplitBySet (" \n " ).ToList <TString>();
117
+ std::optional<ui32> state;
118
+ for (auto && l : lines) {
119
+ l = Strip (l);
120
+ if (l.StartsWith (" READ:" )) {
121
+ l = l.substr (5 );
122
+ state = 0 ;
123
+ } else if (l.StartsWith (" EXPECTED:" )) {
124
+ l = l.substr (9 );
125
+ state = 1 ;
126
+ } else if (l.StartsWith (" IDX_ND_SKIP_APPROVE:" )) {
127
+ state = 2 ;
128
+ l = l.substr (20 );
129
+ } else {
130
+ AFL_VERIFY (state)(" line" , l);
131
+ }
132
+
133
+ if (*state == 0 ) {
134
+ Command += l;
135
+ } else if (*state == 1 ) {
136
+ Compare += l;
137
+ } else if (*state == 2 ) {
138
+ auto idxExpectations = StringSplitter (l).SplitBySet (" ,.;" ).SkipEmpty ().ToList <TString>();
139
+ AFL_VERIFY (idxExpectations.size () == 3 )(" size" , idxExpectations.size ())(" string" , l);
140
+ if (idxExpectations[0 ] != " {}" ) {
141
+ ui32 res;
142
+ AFL_VERIFY (TryFromString<ui32>(idxExpectations[0 ], res))(" string" , l);
143
+ ExpectIndexNoData = res;
144
+ }
145
+ if (idxExpectations[1 ] != " {}" ) {
146
+ ui32 res;
147
+ AFL_VERIFY (TryFromString<ui32>(idxExpectations[1 ], res))(" string" , l);
148
+ ExpectIndexSkip = res;
149
+ }
150
+ if (idxExpectations[2 ] != " {}" ) {
151
+ ui32 res;
152
+ AFL_VERIFY (TryFromString<ui32>(idxExpectations[2 ], res))(" string" , l);
153
+ ExpectIndexApprove = res;
154
+ }
155
+ } else {
156
+ AFL_VERIFY (false )(" line" , l);
157
+ }
158
+ }
159
+ return true ;
88
160
}
161
+
162
+ TSelectCommand () = default ;
89
163
};
90
164
91
165
class TStopCompactionCommand : public ICommand {
@@ -167,9 +241,7 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
167
241
168
242
public:
169
243
TScriptExecutor (const std::vector<std::shared_ptr<ICommand>>& commands)
170
- : Commands(commands)
171
- {
172
-
244
+ : Commands(commands) {
173
245
}
174
246
void Execute () {
175
247
NKikimrConfig::TAppConfig appConfig;
@@ -198,23 +270,9 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
198
270
command = command.substr (5 );
199
271
return std::make_shared<TDataCommand>(command);
200
272
} else if (command.StartsWith (" READ:" )) {
201
- auto lines = StringSplitter (command.substr (5 )).SplitBySet (" \n " ).ToList <TString>();
202
- int step = 0 ;
203
- TString request;
204
- TString expectation;
205
- for (auto && i : lines) {
206
- i = Strip (i);
207
- if (i.StartsWith (" EXPECTED:" )) {
208
- step = 1 ;
209
- i = i.substr (9 );
210
- }
211
- if (step == 0 ) {
212
- request += i;
213
- } else if (step == 1 ) {
214
- expectation += i;
215
- }
216
- }
217
- return std::make_shared<TSelectCommand>(request, expectation);
273
+ auto result = std::make_shared<TSelectCommand>();
274
+ AFL_VERIFY (result->DeserializeFromString (command));
275
+ return result;
218
276
} else if (command.StartsWith (" WAIT_COMPACTION" )) {
219
277
return std::make_shared<TWaitCompactionCommand>();
220
278
} else if (command.StartsWith (" STOP_COMPACTION" )) {
@@ -290,7 +348,6 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
290
348
for (auto && i : Scripts) {
291
349
i.Execute ();
292
350
}
293
-
294
351
}
295
352
};
296
353
@@ -636,7 +693,7 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
636
693
)" ;
637
694
TScriptVariator (script).Execute ();
638
695
}
639
- /*
696
+
640
697
Y_UNIT_TEST (BloomIndexesVariants) {
641
698
TString script = R"(
642
699
STOP_COMPACTION
@@ -648,7 +705,7 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
648
705
PRIMARY KEY (Col1)
649
706
)
650
707
PARTITION BY HASH(Col1)
651
- WITH (STORE = COLUMN, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = $$1| 2$$);
708
+ WITH (STORE = COLUMN, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = $$2$$);
652
709
------
653
710
SCHEMA:
654
711
ALTER OBJECT `/Root/ColumnTable` (TYPE TABLE) SET (ACTION=UPSERT_OPTIONS, `SCAN_READER_POLICY_NAME`=`SIMPLE`)
@@ -657,34 +714,56 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
657
714
ALTER OBJECT `/Root/ColumnTable` (TYPE TABLE) SET (ACTION=ALTER_COLUMN, NAME=Col2, `DATA_ACCESSOR_CONSTRUCTOR.CLASS_NAME`=`SUB_COLUMNS`,
658
715
`COLUMNS_LIMIT`=`$$0|1|1024$$`, `SPARSED_DETECTOR_KFF`=`$$0|10|1000$$`, `MEM_LIMIT_CHUNK`=`$$0|100|1000000$$`, `OTHERS_ALLOWED_FRACTION`=`$$0|0.5$$`)
659
716
------
660
- SCHEMA:
661
- ALTER OBJECT `/Root/ColumnTable` (TYPE TABLE) SET (ACTION=ALTER_COLUMN, NAME=Col2, `DATA_ACCESSOR_CONSTRUCTOR.CLASS_NAME`=`SUB_COLUMNS`,
662
- `COLUMNS_LIMIT`=`$$0|1|1024$$`, `SPARSED_DETECTOR_KFF`=`$$0|10|1000$$`, `MEM_LIMIT_CHUNK`=`$$0|100|1000000$$`, `OTHERS_ALLOWED_FRACTION`=`$$0|0.5$$`)
663
- ------
664
717
DATA:
665
- REPLACE INTO `/Root/ColumnTable` (Col1, Col2) VALUES(1u, JsonDocument('{"a" : "a1"}')), (2u, JsonDocument('{"a" : "a2"}')),
666
- (3u, JsonDocument('{"b" : "b3"}')), (4u, JsonDocument('{"b" : "b4", "a" : "a4"}'))
718
+ REPLACE INTO `/Root/ColumnTable` (Col1, Col2) VALUES(1u, JsonDocument('{"a.b.c " : "a1"}')), (2u, JsonDocument('{"a.b.c " : "a2"}')),
719
+ (3u, JsonDocument('{"b.c.d " : "b3"}')), (4u, JsonDocument('{"b.c.d " : "b4", "a" : "a4"}'))
667
720
------
668
721
DATA:
669
- REPLACE INTO `/Root/ColumnTable` (Col1, Col2) VALUES(11u, JsonDocument('{"a" : "1a1"}')), (12u, JsonDocument('{"a" : "1a2"}')),
670
- (13u, JsonDocument('{"b" : "1b3"}')), (14u, JsonDocument('{"b" : "1b4", "a" : "a4"}'))
722
+ REPLACE INTO `/Root/ColumnTable` (Col1, Col2) VALUES(11u, JsonDocument('{"a.b.c " : "1a1"}')), (12u, JsonDocument('{"a.b.c " : "1a2"}')),
723
+ (13u, JsonDocument('{"b.c.d " : "1b3"}')), (14u, JsonDocument('{"b.c.d " : "1b4", "a" : "a4"}'))
671
724
------
672
725
SCHEMA:
673
726
ALTER OBJECT `/Root/ColumnTable` (TYPE TABLE) SET (ACTION=UPSERT_INDEX, NAME=a_index, TYPE=BLOOM_FILTER,
674
- FEATURES=`{"column_names" : ["Col2"], "data_extractor" : {"class_name" : "SUB_COLUMN", "sub_column_name" : "a"}, "false_positive_probability" : 0.05}`)
727
+ FEATURES=`{"column_names" : ["Col2"], "false_positive_probability" : 0.01}`)
728
+ ------
729
+ SCHEMA:
730
+ ALTER OBJECT `/Root/ColumnTable` (TYPE TABLE) SET (ACTION=UPSERT_INDEX, NAME=index_ngramm_b, TYPE=BLOOM_NGRAMM_FILTER,
731
+ FEATURES=`{"column_name" : "Col2", "ngramm_size" : 3, "hashes_count" : 2, "filter_size_bytes" : 4096,
732
+ "records_count" : 1024, "data_extractor" : {"class_name" : "SUB_COLUMN", "sub_column_name" : "b.c.d"}}`);
675
733
------
676
734
DATA:
677
735
REPLACE INTO `/Root/ColumnTable` (Col1) VALUES(10u)
678
736
------
679
737
ONE_ACTUALIZATION
680
738
------
681
- READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.a") = "1a1" ORDER BY Col1;
682
- EXPECTED: [[11u;["{\"a\":\"1a1\"}"]]]
739
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"a.b.c\"") = "a1" ORDER BY Col1;
740
+ EXPECTED: [[1u;["{\"a.b.c\":\"a1\"}"]]]
741
+ IDX_ND_SKIP_APPROVE: 0, 3, 1
742
+ ------
743
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"a.b.c\"") = "1a1" ORDER BY Col1;
744
+ EXPECTED: [[11u;["{\"a.b.c\":\"1a1\"}"]]]
745
+ IDX_ND_SKIP_APPROVE: 0, 3, 1
746
+ ------
747
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"b.c.d\"") = "1b4" ORDER BY Col1;
748
+ EXPECTED: [[14u;["{\"a\":\"a4\",\"b.c.d\":\"1b4\"}"]]]
749
+ IDX_ND_SKIP_APPROVE: 0, 3, 1
750
+ ------
751
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"b.c.d\"") = "1b5" ORDER BY Col1;
752
+ EXPECTED: []
753
+ IDX_ND_SKIP_APPROVE: 0, 4, 0
754
+ ------
755
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"b.c.d\"") like "1b3" ORDER BY Col1;
756
+ EXPECTED: [[13u;["{\"b.c.d\":\"1b3\"}"]]]
757
+ IDX_ND_SKIP_APPROVE: 0, 3, 1
758
+ ------
759
+ READ: SELECT * FROM `/Root/ColumnTable` WHERE JSON_VALUE(Col2, "$.\"b.c.d\"") like "1b5" ORDER BY Col1;
760
+ EXPECTED: []
761
+ IDX_ND_SKIP_APPROVE: 0, 4, 0
683
762
684
763
)" ;
685
764
TScriptVariator (script).Execute ();
686
765
}
687
- */
766
+
688
767
Y_UNIT_TEST (SwitchAccessorCompactionVariants) {
689
768
TString script = R"(
690
769
STOP_COMPACTION
@@ -765,7 +844,6 @@ Y_UNIT_TEST_SUITE(KqpOlapJson) {
765
844
)" ;
766
845
TScriptVariator (script).Execute ();
767
846
}
768
-
769
847
}
770
848
771
849
} // namespace NKikimr::NKqp
0 commit comments