@@ -302,6 +302,12 @@ void checkWindowCollation(const BuilderExpr& expr,
302
302
ASSERT_EQ (wnd_fn->collation ()[idx].nulls_first , null_pos == NullSortedPosition::First);
303
303
}
304
304
305
+ void checkCardinality (const BuilderExpr& expr, const BuilderExpr& op) {
306
+ auto cardinality_expr = expr.expr ()->as <CardinalityExpr>();
307
+ ASSERT_TRUE (cardinality_expr);
308
+ ASSERT_TRUE (cardinality_expr->arg ()->equal (op.expr ().get ()));
309
+ }
310
+
305
311
} // anonymous namespace
306
312
307
313
class QueryBuilderTest : public TestSuite {
@@ -463,6 +469,18 @@ class QueryBuilderTest : public TestSuite {
463
469
" 2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,,,,,,,,\n "
464
470
" 3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,,,,,,,,\n "
465
471
" ,1,4,1,,1,4,1,,1,4,1,,1,4,1,,,,,,,,\n " );
472
+
473
+ createTable (" test_cardinality" ,
474
+ {{" col_arr_i32" , ctx ().arrayVarLen (ctx ().int32 ())},
475
+ {" col_arr_i32x2" , ctx ().arrayFixed (2 , ctx ().int32 ())},
476
+ {" col_arr_i32nn" , ctx ().arrayVarLen (ctx ().int32 (), 4 , false )},
477
+ {" col_arr_i32x2nn" , ctx ().arrayFixed (2 , ctx ().int32 (), false )}});
478
+ insertJsonValues (
479
+ " test_cardinality" ,
480
+ R"___( {"col_arr_i32": [1], "col_arr_i32x2": [0, 1], "col_arr_i32nn": [1, 2], "col_arr_i32x2nn": [3, 4]}
481
+ {"col_arr_i32": null, "col_arr_i32x2": null, "col_arr_i32nn": [1], "col_arr_i32x2nn": [3, 4]}
482
+ {"col_arr_i32": [], "col_arr_i32x2": [0, 1], "col_arr_i32nn": [], "col_arr_i32x2nn": [3, 4]}
483
+ {"col_arr_i32": [1, 2], "col_arr_i32x2": null, "col_arr_i32nn": [null], "col_arr_i32x2nn": [3, 4]})___" );
466
484
}
467
485
468
486
static void TearDownTestSuite () {
@@ -479,6 +497,8 @@ class QueryBuilderTest : public TestSuite {
479
497
dropTable (" withNull" );
480
498
dropTable (" test_tmstmp" );
481
499
dropTable (" test_tmstmp_nullable" );
500
+ dropTable (" test_bitwise" );
501
+ dropTable (" test_cardinality" );
482
502
}
483
503
484
504
void compare_res_fields (const ExecutionResult& res,
@@ -5196,6 +5216,42 @@ TEST_F(QueryBuilderTest, BwNot_Exec) {
5196
5216
inline_null_value<int64_t >()}));
5197
5217
}
5198
5218
5219
+ TEST_F (QueryBuilderTest, Cardinality) {
5220
+ QueryBuilder builder (ctx (), schema_mgr_, configPtr ());
5221
+ auto scan = builder.scan (" test_cardinality" );
5222
+ checkCardinality (scan.ref (" col_arr_i32" ).cardinality (), scan.ref (" col_arr_i32" ));
5223
+ checkCardinality (scan.ref (" col_arr_i32x2" ).cardinality (), scan.ref (" col_arr_i32x2" ));
5224
+ checkCardinality (scan.ref (" col_arr_i32nn" ).cardinality (), scan.ref (" col_arr_i32nn" ));
5225
+ checkCst (scan.ref (" col_arr_i32x2nn" ).cardinality (), 2 , ctx ().int32 (false ));
5226
+ checkCst (builder.cst ({1 , 2 , 3 , 4 }, " array(int8)" ).cardinality (), 4 , ctx ().int32 (false ));
5227
+ checkNullCst (builder.nullCst (" array(int8)" ).cardinality (), ctx ().int32 ());
5228
+ auto scan2 = builder.scan (" test3" );
5229
+ EXPECT_THROW (scan2.ref (" col_i" ).cardinality (), InvalidQueryError);
5230
+ EXPECT_THROW (scan2.ref (" col_d" ).cardinality (), InvalidQueryError);
5231
+ EXPECT_THROW (scan2.ref (" col_dec" ).cardinality (), InvalidQueryError);
5232
+ EXPECT_THROW (scan2.ref (" col_time" ).cardinality (), InvalidQueryError);
5233
+ EXPECT_THROW (scan2.ref (" col_str" ).cardinality (), InvalidQueryError);
5234
+ EXPECT_THROW (builder.cst (1 ).cardinality (), InvalidQueryError);
5235
+ }
5236
+
5237
+ TEST_F (QueryBuilderTest, Cardinality_Exec) {
5238
+ QueryBuilder builder (ctx (), schema_mgr_, configPtr ());
5239
+ auto scan = builder.scan (" test_cardinality" );
5240
+ auto dag = scan.proj ({scan.ref (" col_arr_i32" ).cardinality (),
5241
+ scan.ref (" col_arr_i32x2" ).cardinality (),
5242
+ scan.ref (" col_arr_i32nn" ).cardinality (),
5243
+ scan.ref (" col_arr_i32x2nn" ).cardinality ()})
5244
+ .finalize ();
5245
+ auto res = runQuery (std::move (dag));
5246
+ compare_res_data (
5247
+ res,
5248
+ std::vector<int32_t >({1 , inline_null_value<int32_t >(), 0 , 2 }),
5249
+ std::vector<int32_t >(
5250
+ {2 , inline_null_value<int32_t >(), 2 , inline_null_value<int32_t >()}),
5251
+ std::vector<int32_t >({2 , 1 , 0 , 1 }),
5252
+ std::vector<int32_t >({2 , 2 , 2 , 2 }));
5253
+ }
5254
+
5199
5255
TEST_F (QueryBuilderTest, SimpleProjection) {
5200
5256
QueryBuilder builder (ctx (), schema_mgr_, configPtr ());
5201
5257
compare_test1_data (builder.scan (" test1" ).proj ({0 , 1 , 2 , 3 }));
0 commit comments