44#include < algorithm>
55#include < random>
66
7- #include " quantile_estimator.hpp"
87#include " duckdb/common/vector.hpp"
8+ #include " numeric_utils.hpp"
9+ #include " quantile_estimator.hpp"
910
1011using namespace duckdb ; // NOLINT
1112
@@ -27,6 +28,50 @@ vector<int> GetRandomNumbers(int max_val) {
2728}
2829} // namespace
2930
31+ TEST_CASE (" Insufficient number of data points" , " [quantile test]" ) {
32+ QuantileEstimator qe {METRICS_NAME, METRICS_UNIT};
33+
34+ // --- One data point ---
35+ qe.Add (1 );
36+ REQUIRE (IsDoubleEqual (qe.p50 (), 1.0 , /* print_if_unequal=*/ true ));
37+ REQUIRE (IsDoubleEqual (qe.p75 (), 1.0 , /* print_if_unequal=*/ true ));
38+ REQUIRE (IsDoubleEqual (qe.p90 (), 1.0 , /* print_if_unequal=*/ true ));
39+ REQUIRE (IsDoubleEqual (qe.p95 (), 1.0 , /* print_if_unequal=*/ true ));
40+ REQUIRE (IsDoubleEqual (qe.p99 (), 1.0 , /* print_if_unequal=*/ true ));
41+
42+ // --- Two data points ---
43+ qe.Add (2 );
44+ REQUIRE (IsDoubleEqual (qe.p50 (), 1.5 , /* print_if_unequal=*/ true ));
45+ REQUIRE (IsDoubleEqual (qe.p75 (), 1.75 , /* print_if_unequal=*/ true ));
46+ REQUIRE (IsDoubleEqual (qe.p90 (), 1.9 , /* print_if_unequal=*/ true ));
47+ REQUIRE (IsDoubleEqual (qe.p95 (), 1.95 , /* print_if_unequal=*/ true ));
48+ REQUIRE (IsDoubleEqual (qe.p99 (), 1.99 , /* print_if_unequal=*/ true ));
49+
50+ // --- Three data points ---
51+ qe.Add (3 );
52+ REQUIRE (IsDoubleEqual (qe.p50 (), 2.0 , /* print_if_unequal=*/ true ));
53+ REQUIRE (IsDoubleEqual (qe.p75 (), 2.5 , /* print_if_unequal=*/ true ));
54+ REQUIRE (IsDoubleEqual (qe.p90 (), 2.8 , /* print_if_unequal=*/ true ));
55+ REQUIRE (IsDoubleEqual (qe.p95 (), 2.9 , /* print_if_unequal=*/ true ));
56+ REQUIRE (IsDoubleEqual (qe.p99 (), 2.98 , /* print_if_unequal=*/ true ));
57+
58+ // --- Four data points ---
59+ qe.Add (4 );
60+ REQUIRE (IsDoubleEqual (qe.p50 (), 2.5 , /* print_if_unequal=*/ true ));
61+ REQUIRE (IsDoubleEqual (qe.p75 (), 3.25 , /* print_if_unequal=*/ true ));
62+ REQUIRE (IsDoubleEqual (qe.p90 (), 3.7 , /* print_if_unequal=*/ true ));
63+ REQUIRE (IsDoubleEqual (qe.p95 (), 3.85 , /* print_if_unequal=*/ true ));
64+ REQUIRE (IsDoubleEqual (qe.p99 (), 3.97 , /* print_if_unequal=*/ true ));
65+
66+ // --- Five data points ---
67+ qe.Add (5 );
68+ REQUIRE (IsDoubleEqual (qe.p50 (), 3.0 , /* print_if_unequal=*/ true ));
69+ REQUIRE (IsDoubleEqual (qe.p75 (), 4.0 , /* print_if_unequal=*/ true ));
70+ REQUIRE (IsDoubleEqual (qe.p90 (), 4.6 , /* print_if_unequal=*/ true ));
71+ REQUIRE (IsDoubleEqual (qe.p95 (), 4.8 , /* print_if_unequal=*/ true ));
72+ REQUIRE (IsDoubleEqual (qe.p99 (), 4.96 , /* print_if_unequal=*/ true ));
73+ }
74+
3075TEST_CASE (" Small scale quantile test" , " [quantile test]" ) {
3176 constexpr size_t NUM_VALUE = 50 ;
3277 constexpr double MAX_TOLERABLE_DIFF = 1.0 ;
0 commit comments