2
* Copyright (c) 2023 OceanBase
3
* OceanBase CE is licensed under Mulan PubL v2.
4
* You can use this software according to the terms and conditions of the Mulan PubL v2.
5
* You may obtain a copy of Mulan PubL v2 at:
6
* http://license.coscl.org.cn/MulanPubL-2.0
7
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
* See the Mulan PubL v2 for more details.
13
#include <gtest/gtest.h>
14
#define private public // 获取private成员
15
#define protected public // 获取protect成员
16
#include "common/row/ob_row.h"
17
#include "observer/table/ob_table_aggregation.h"
19
using namespace oceanbase::common;
20
using namespace oceanbase::table;
21
using namespace oceanbase::sql;
22
using namespace oceanbase::share;
23
using namespace oceanbase::share::schema;
24
using namespace oceanbase::observer;
26
class TestTableAggregation: public ::testing::Test
29
TestTableAggregation() {}
30
virtual void SetUp() {}
31
virtual void TearDown() {}
34
DISALLOW_COPY_AND_ASSIGN(TestTableAggregation);
37
TEST_F(TestTableAggregation, agg_min_int)
39
ObTableAggregation min;
40
min.type_ = ObTableAggregationType::MIN;
41
min.column_ = ObString("c1");
44
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
45
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
47
const uint64_t PROJECT_IDX = 0;
48
ObSEArray<uint64_t, 4> projs;
49
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
51
ObTableAggCalculator agg(query);
52
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
54
ASSERT_EQ(OB_SUCCESS, agg.init());
56
oceanbase::common::ObNewRow row;
57
const int COL_NUM = 3;
61
for (int i = 0; i< COL_NUM; ++i) {
62
row.cells_[i].set_int(1);
65
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
66
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_int());
68
for (int i = 0; i< COL_NUM; ++i) {
69
row.cells_[i].set_int(0);
72
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
73
ASSERT_EQ(0, agg.results_.at(PROJECT_IDX).get_int());
76
TEST_F(TestTableAggregation, agg_min_double)
78
ObTableAggregation min;
79
min.type_ = ObTableAggregationType::MIN;
80
min.column_ = ObString("c1");
83
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
84
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
86
const uint64_t PROJECT_IDX = 0;
87
ObSEArray<uint64_t, 4> projs;
88
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
90
ObTableAggCalculator agg(query);
91
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
93
ASSERT_EQ(OB_SUCCESS, agg.init());
95
oceanbase::common::ObNewRow row;
96
const int COL_NUM = 3;
100
for (int i = 0; i< COL_NUM; ++i) {
101
row.cells_[i].set_double(1.11);
104
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
105
ASSERT_EQ(1.11, agg.results_.at(PROJECT_IDX).get_double());
107
for (int i = 0; i< COL_NUM; ++i) {
108
row.cells_[i].set_double(1.10009);
111
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
112
ASSERT_EQ(1.10009, agg.results_.at(PROJECT_IDX).get_double());
115
TEST_F(TestTableAggregation, agg_min_varchar)
117
ObTableAggregation min;
118
min.type_ = ObTableAggregationType::MIN;
119
min.column_ = ObString("c1");
122
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
123
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
125
const uint64_t PROJECT_IDX = 0;
126
ObSEArray<uint64_t, 4> projs;
127
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
129
ObTableAggCalculator agg(query);
130
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
131
agg.set_projs(projs);
132
ASSERT_EQ(OB_SUCCESS, agg.init());
134
oceanbase::common::ObNewRow row;
135
const int COL_NUM = 3;
138
row.count_ = COL_NUM;
139
char val1[] = "abcde";
140
for (int i = 0; i< COL_NUM; ++i) {
141
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
142
row.cells_[i].set_varchar(val1);
145
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
146
ASSERT_EQ(0, memcmp(val1, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val1)));
148
char val2[] = "abcd";
149
for (int i = 0; i< COL_NUM; ++i) {
150
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
151
row.cells_[i].set_varchar(val2);
154
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
155
ASSERT_EQ(0, memcmp(val2, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val2)));
157
char val3[] = "abcdefg";
158
for (int i = 0; i< COL_NUM; ++i) {
159
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
160
row.cells_[i].set_varchar(val3);
163
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
164
ASSERT_EQ(0, memcmp(val2, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val2)));
167
TEST_F(TestTableAggregation, agg_max_int)
169
ObTableAggregation min;
170
min.type_ = ObTableAggregationType::MAX;
171
min.column_ = ObString("c1");
174
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
175
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
177
const uint64_t PROJECT_IDX = 0;
178
ObSEArray<uint64_t, 4> projs;
179
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
181
ObTableAggCalculator agg(query);
182
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
183
agg.set_projs(projs);
184
ASSERT_EQ(OB_SUCCESS, agg.init());
186
oceanbase::common::ObNewRow row;
187
const int COL_NUM = 3;
190
row.count_ = COL_NUM;
191
for (int i = 0; i< COL_NUM; ++i) {
192
row.cells_[i].set_int(0);
195
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
196
ASSERT_EQ(0, agg.results_.at(PROJECT_IDX).get_int());
198
for (int i = 0; i< COL_NUM; ++i) {
199
row.cells_[i].set_int(1);
202
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
203
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_int());
206
TEST_F(TestTableAggregation, agg_max_double)
208
ObTableAggregation min;
209
min.type_ = ObTableAggregationType::MAX;
210
min.column_ = ObString("c1");
213
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
214
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
216
const uint64_t PROJECT_IDX = 0;
217
ObSEArray<uint64_t, 4> projs;
218
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
220
ObTableAggCalculator agg(query);
221
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
222
agg.set_projs(projs);
223
ASSERT_EQ(OB_SUCCESS, agg.init());
225
oceanbase::common::ObNewRow row;
226
const int COL_NUM = 3;
229
row.count_ = COL_NUM;
230
for (int i = 0; i< COL_NUM; ++i) {
231
row.cells_[i].set_double(0.001);
234
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
235
ASSERT_EQ(0.001, agg.results_.at(PROJECT_IDX).get_double());
237
for (int i = 0; i< COL_NUM; ++i) {
238
row.cells_[i].set_double(0.01);
241
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
242
ASSERT_EQ(0.01, agg.results_.at(PROJECT_IDX).get_double());
245
TEST_F(TestTableAggregation, agg_max_varchar)
247
ObTableAggregation min;
248
min.type_ = ObTableAggregationType::MAX;
249
min.column_ = ObString("c1");
252
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
253
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
255
const uint64_t PROJECT_IDX = 0;
256
ObSEArray<uint64_t, 4> projs;
257
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
259
ObTableAggCalculator agg(query);
260
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
261
agg.set_projs(projs);
262
ASSERT_EQ(OB_SUCCESS, agg.init());
264
oceanbase::common::ObNewRow row;
265
const int COL_NUM = 3;
268
row.count_ = COL_NUM;
269
char val1[] = "abcde";
270
for (int i = 0; i< COL_NUM; ++i) {
271
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
272
row.cells_[i].set_varchar(val1);
275
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
276
ASSERT_EQ(0, memcmp(val1, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val1)));
278
char val2[] = "abcd";
279
for (int i = 0; i< COL_NUM; ++i) {
280
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
281
row.cells_[i].set_varchar(val2);
284
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
285
ASSERT_EQ(0, memcmp(val1, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val1)));
287
char val3[] = "abcdefg";
288
for (int i = 0; i< COL_NUM; ++i) {
289
row.cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
290
row.cells_[i].set_varchar(val3);
293
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
294
ASSERT_EQ(0, memcmp(val3, agg.results_.at(PROJECT_IDX).get_varchar().ptr(), strlen(val3)));
297
TEST_F(TestTableAggregation, agg_count_column)
299
ObTableAggregation min;
300
min.type_ = ObTableAggregationType::COUNT;
301
min.column_ = ObString("c1");
304
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
305
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
307
const uint64_t PROJECT_IDX = 0;
308
ObSEArray<uint64_t, 4> projs;
309
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
311
ObTableAggCalculator agg(query);
312
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
313
agg.set_projs(projs);
314
ASSERT_EQ(OB_SUCCESS, agg.init());
316
oceanbase::common::ObNewRow row;
317
const int COL_NUM = 3;
320
row.count_ = COL_NUM;
321
for (int i = 0; i< COL_NUM; ++i) {
322
row.cells_[i].set_int(0);
325
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
326
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_int());
327
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
328
ASSERT_EQ(2, agg.results_.at(PROJECT_IDX).get_int());
329
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
330
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
331
ASSERT_EQ(4, agg.results_.at(PROJECT_IDX).get_int());
334
TEST_F(TestTableAggregation, agg_count_all)
336
ObTableAggregation min;
337
min.type_ = ObTableAggregationType::COUNT;
338
min.column_ = ObString("*");
341
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
342
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
344
const uint64_t PROJECT_IDX = 0;
345
ObSEArray<uint64_t, 4> projs;
346
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
348
ObTableAggCalculator agg(query);
349
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
350
agg.set_projs(projs);
351
ASSERT_EQ(OB_SUCCESS, agg.init());
353
oceanbase::common::ObNewRow row;
354
const int COL_NUM = 3;
357
row.count_ = COL_NUM;
358
for (int i = 0; i< COL_NUM; ++i) {
359
row.cells_[i].set_int(0);
362
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
363
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_int());
364
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
365
ASSERT_EQ(2, agg.results_.at(PROJECT_IDX).get_int());
366
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
367
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
368
ASSERT_EQ(4, agg.results_.at(PROJECT_IDX).get_int());
371
TEST_F(TestTableAggregation, agg_sum_int)
373
ObTableAggregation min;
374
min.type_ = ObTableAggregationType::SUM;
375
min.column_ = ObString("c1");
378
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
379
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
381
const uint64_t PROJECT_IDX = 0;
382
ObSEArray<uint64_t, 4> projs;
383
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
385
ObTableAggCalculator agg(query);
386
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
387
agg.set_projs(projs);
388
ASSERT_EQ(OB_SUCCESS, agg.init());
390
oceanbase::common::ObNewRow row;
391
const int COL_NUM = 3;
394
row.count_ = COL_NUM;
395
for (int i = 0; i< COL_NUM; ++i) {
396
row.cells_[i].set_int(1);
399
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
400
agg.final_aggregate();
401
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_int());
402
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
403
agg.final_aggregate();
404
ASSERT_EQ(2, agg.results_.at(PROJECT_IDX).get_int());
405
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
406
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
407
agg.final_aggregate();
408
ASSERT_EQ(4, agg.results_.at(PROJECT_IDX).get_int());
411
TEST_F(TestTableAggregation, agg_sum_double)
413
ObTableAggregation min;
414
min.type_ = ObTableAggregationType::SUM;
415
min.column_ = ObString("c1");
418
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
419
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
421
const uint64_t PROJECT_IDX = 0;
422
ObSEArray<uint64_t, 4> projs;
423
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
425
ObTableAggCalculator agg(query);
426
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
427
agg.set_projs(projs);
428
ASSERT_EQ(OB_SUCCESS, agg.init());
430
oceanbase::common::ObNewRow row;
431
const int COL_NUM = 3;
434
row.count_ = COL_NUM;
435
for (int i = 0; i< COL_NUM; ++i) {
436
row.cells_[i].set_double(0.1);
439
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
440
agg.final_aggregate();
441
ASSERT_EQ(0.1, agg.results_.at(PROJECT_IDX).get_double());
442
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
443
agg.final_aggregate();
444
ASSERT_EQ(0.2, agg.results_.at(PROJECT_IDX).get_double());
445
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
446
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
447
agg.final_aggregate();
448
ASSERT_EQ(0.4, agg.results_.at(PROJECT_IDX).get_double());
451
TEST_F(TestTableAggregation, agg_avg_int)
453
ObTableAggregation min;
454
min.type_ = ObTableAggregationType::AVG;
455
min.column_ = ObString("c1");
458
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
459
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
461
const uint64_t PROJECT_IDX = 0;
462
ObSEArray<uint64_t, 4> projs;
463
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
465
ObTableAggCalculator agg(query);
466
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
467
agg.set_projs(projs);
468
ASSERT_EQ(OB_SUCCESS, agg.init());
470
oceanbase::common::ObNewRow row;
471
const int COL_NUM = 3;
474
row.count_ = COL_NUM;
475
for (int i = 0; i< COL_NUM; ++i) {
476
row.cells_[i].set_int(1);
479
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
480
agg.final_aggregate();
481
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_double());
482
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
483
agg.final_aggregate();
484
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_double());
485
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
486
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
487
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
488
agg.final_aggregate();
489
ASSERT_EQ(1, agg.results_.at(PROJECT_IDX).get_double());
492
TEST_F(TestTableAggregation, agg_avg_double)
494
ObTableAggregation min;
495
min.type_ = ObTableAggregationType::AVG;
496
min.column_ = ObString("c1");
499
ASSERT_EQ(OB_SUCCESS, query.aggregations_.push_back(min));
500
ASSERT_EQ(OB_SUCCESS, query.select_columns_.push_back("c1"));
502
const uint64_t PROJECT_IDX = 0;
503
ObSEArray<uint64_t, 4> projs;
504
ASSERT_EQ(OB_SUCCESS, projs.push_back(PROJECT_IDX));
506
ObTableAggCalculator agg(query);
507
agg.allocator_.set_tenant_id(OB_SERVER_TENANT_ID);
508
agg.set_projs(projs);
509
ASSERT_EQ(OB_SUCCESS, agg.init());
511
oceanbase::common::ObNewRow row;
512
const int COL_NUM = 3;
515
row.count_ = COL_NUM;
516
for (int i = 0; i< COL_NUM; ++i) {
517
row.cells_[i].set_double(0.1);
520
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
521
agg.final_aggregate();
522
ASSERT_EQ(0.1, agg.results_.at(PROJECT_IDX).get_double());
523
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
524
agg.final_aggregate();
525
ASSERT_EQ(0.1, agg.results_.at(PROJECT_IDX).get_double());
526
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
527
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
528
for (int i = 0; i< COL_NUM; ++i) {
529
row.cells_[i].set_double(0.4);
531
ASSERT_EQ(OB_SUCCESS, agg.aggregate(row));
532
agg.final_aggregate();
533
ASSERT_EQ(0.16, agg.results_.at(PROJECT_IDX).get_double());
536
int main(int argc, char **argv)
538
OB_LOGGER.set_log_level("INFO");
539
OB_LOGGER.set_file_name("test_table_aggregation.log", true);
540
::testing::InitGoogleTest(&argc,argv);
541
return RUN_ALL_TESTS();