Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Struct binary search (lower_bound/upper_bound) #7865

Merged
merged 28 commits into from
Apr 19, 2021
Merged
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f60b127
Extract DictionarySearchTest from SearchTest
ttnghia Apr 2, 2021
611252b
Add file for StructSearchTest
ttnghia Apr 2, 2021
aef67cc
Rename files
ttnghia Apr 2, 2021
9e73bbb
Remove test
ttnghia Apr 2, 2021
55bf495
Add one more test for StructSearchTest
ttnghia Apr 2, 2021
a8d0a67
And TrivialInputTests for StructSearchTest
ttnghia Apr 2, 2021
1b063d0
Flatten columns for binary search
ttnghia Apr 2, 2021
a5984d0
Simplify binary search
ttnghia Apr 5, 2021
4fb33f9
Add more tests
ttnghia Apr 5, 2021
aafea01
Rewrite tests
ttnghia Apr 5, 2021
30348cc
Fix SimpleInputWithNullsTests
ttnghia Apr 5, 2021
a842198
Finish ComplexStructTest
ttnghia Apr 5, 2021
02988f1
Rename variables
ttnghia Apr 6, 2021
c7c10aa
Fix typo
ttnghia Apr 6, 2021
dbbe480
Rewrite `search_ordered`, replacing `device_vector` by `device_uvecto…
ttnghia Apr 6, 2021
304cfe8
Reorder variables' declaration
ttnghia Apr 6, 2021
36f478c
Fix copyright year in header
ttnghia Apr 6, 2021
63655d9
Simplify StructSearchTests
ttnghia Apr 7, 2021
d17f09a
Change copied variables into references.
ttnghia Apr 7, 2021
ede552a
Fix test for ComplexStructTest
ttnghia Apr 8, 2021
065ee10
Merge remote-tracking branch 'origin/branch-0.20' into struct_binary_…
ttnghia Apr 8, 2021
07a7ca0
Use structure binding to simplify code
ttnghia Apr 8, 2021
43139b8
Remove redundant comment
ttnghia Apr 8, 2021
eead52f
Ignore variable in structure binding
ttnghia Apr 8, 2021
fc3b252
Add SlicedColumnInputTests
ttnghia Apr 8, 2021
661a5cd
Disable debug printing
ttnghia Apr 9, 2021
281fb61
Merge branch 'branch-0.20' into struct_binary_search
ttnghia Apr 19, 2021
4ba910a
Use `make_device_uvector_async`, reverse structured binding, and re-o…
ttnghia Apr 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Simplify StructSearchTests
ttnghia committed Apr 7, 2021
commit 63655d9ee339ad28184724d4948a5b270dae20dc
74 changes: 22 additions & 52 deletions cpp/tests/search/search_struct_test.cpp
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
#include <cudf_test/base_fixture.hpp>
#include <cudf_test/column_utilities.hpp>
#include <cudf_test/column_wrapper.hpp>
#include <cudf_test/iterator_utilities.hpp>
#include <cudf_test/type_lists.hpp>

#include <cudf/detail/iterator.cuh>
@@ -60,6 +61,9 @@ auto search_bounds(std::unique_ptr<cudf::column> const& t_col,
auto result_upper_bound = cudf::upper_bound(t, values, column_orders, null_precedence);
return std::make_pair(std::move(result_lower_bound), std::move(result_upper_bound));
}

auto null_at(cudf::size_type idx) { return cudf::test::iterator_with_null_at(idx); }

} // namespace

// Test case when all input columns are empty
@@ -107,22 +111,12 @@ TYPED_TEST(TypedStructSearchTest, SimpleInputWithNullsTests)
{
using col_wrapper = cudf::test::fixed_width_column_wrapper<TypeParam, int32_t>;

auto child_col_values =
col_wrapper{{1, null, 70, XXX, 2, 100},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 1; })};
auto const structs_values = structs_col{
{child_col_values}, cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 3;
})}.release();
auto child_col_values = col_wrapper{{1, null, 70, XXX, 2, 100}, null_at(1)};
auto const structs_values = structs_col{{child_col_values}, null_at(3)}.release();

// Sorted asc, nulls first
auto child_col_t =
col_wrapper{{XXX, null, 0, 1, 2, 2, 2, 2, 3, 3, 4},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 1; })};
auto structs_t = structs_col{
{child_col_t}, cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 0;
})}.release();
auto child_col_t = col_wrapper{{XXX, null, 0, 1, 2, 2, 2, 2, 3, 3, 4}, null_at(1)};
auto structs_t = structs_col{{child_col_t}, null_at(0)}.release();

auto results =
search_bounds(structs_t, structs_values, {cudf::order::ASCENDING}, {cudf::null_order::BEFORE});
@@ -132,13 +126,8 @@ TYPED_TEST(TypedStructSearchTest, SimpleInputWithNullsTests)
CUDF_TEST_EXPECT_COLUMNS_EQUAL(expected_upper_bound, results.second->view(), print_all);

// Sorted asc, nulls last
child_col_t =
col_wrapper{{0, 1, 2, 2, 2, 2, 3, 3, 4, null, XXX},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 9; })};
structs_t = structs_col{
{child_col_t}, cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 10;
})}.release();
child_col_t = col_wrapper{{0, 1, 2, 2, 2, 2, 3, 3, 4, null, XXX}, null_at(9)};
structs_t = structs_col{{child_col_t}, null_at(10)}.release();
results =
search_bounds(structs_t, structs_values, {cudf::order::ASCENDING}, {cudf::null_order::AFTER});
expected_lower_bound = int32s_col{1, 0, 10, 10, 2, 10};
@@ -147,13 +136,8 @@ TYPED_TEST(TypedStructSearchTest, SimpleInputWithNullsTests)
CUDF_TEST_EXPECT_COLUMNS_EQUAL(expected_upper_bound, results.second->view(), print_all);

// Sorted dsc, nulls first
child_col_t =
col_wrapper{{XXX, null, 4, 3, 3, 2, 2, 2, 2, 1, 0},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 1; })};
structs_t = structs_col{
{child_col_t}, cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 0;
})}.release();
child_col_t = col_wrapper{{XXX, null, 4, 3, 3, 2, 2, 2, 2, 1, 0}, null_at(1)};
structs_t = structs_col{{child_col_t}, null_at(0)}.release();
results =
search_bounds(structs_t, structs_values, {cudf::order::DESCENDING}, {cudf::null_order::BEFORE});
expected_lower_bound = int32s_col{9, 11, 0, 11, 5, 0};
@@ -162,13 +146,8 @@ TYPED_TEST(TypedStructSearchTest, SimpleInputWithNullsTests)
CUDF_TEST_EXPECT_COLUMNS_EQUAL(expected_upper_bound, results.second->view(), print_all);

// Sorted dsc, nulls last
child_col_t =
col_wrapper{{4, 3, 3, 2, 2, 2, 2, 1, 0, null, XXX},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 9; })};
structs_t = structs_col{
{child_col_t}, cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 10;
})}.release();
child_col_t = col_wrapper{{4, 3, 3, 2, 2, 2, 2, 1, 0, null, XXX}, null_at(9)};
structs_t = structs_col{{child_col_t}, null_at(10)}.release();
results =
search_bounds(structs_t, structs_values, {cudf::order::DESCENDING}, {cudf::null_order::AFTER});
expected_lower_bound = int32s_col{7, 11, 0, 0, 3, 0};
@@ -184,27 +163,18 @@ TYPED_TEST(TypedStructSearchTest, ComplexStructTest)

auto names_column_t =
strings_col{"Cherry", "Kiwi", "Lemon", "Newton", "Tomato", /*NULL*/ "Washington"};
auto ages_column_t =
col_wrapper{{5, 10, 15, 20, null, XXX},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 4; })};
auto ages_column_t = col_wrapper{{5, 10, 15, 20, null, XXX}, null_at(4)};
auto is_human_col_t = bools_col{false, false, false, false, false, /*NULL*/ true};

auto const structs_t = structs_col{
{names_column_t, ages_column_t, is_human_col_t},
cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 5;
})}.release();
auto const structs_t =
structs_col{{names_column_t, ages_column_t, is_human_col_t}, null_at(5)}.release();

auto names_column_values = strings_col{"Bagel", "Tomato", "Lemonade", /*NULL*/ "Donut", "Butter"};
auto ages_column_values =
col_wrapper{{10, 15, null, XXX, 17},
cudf::detail::make_counting_transform_iterator(0, [](auto i) { return i != 1; })};
auto is_human_col_values = bools_col{false, false, true, /*NULL*/ true, true};
auto const structs_values = structs_col{
{names_column_values, ages_column_values, is_human_col_values},
cudf::detail::make_counting_transform_iterator(0, [](auto i) {
return i != 3;
})}.release();
auto ages_column_values = col_wrapper{{10, 15, null, XXX, 17}, null_at(1)};
auto is_human_col_values = bools_col{false, false, true, /*NULL*/ true, true};
auto const structs_values =
structs_col{{names_column_values, ages_column_values, is_human_col_values}, null_at(3)}
.release();

auto const results =
search_bounds(structs_t, structs_values, {cudf::order::ASCENDING}, {cudf::null_order::AFTER});