Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions cpp/src/arrow/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,7 @@ if(ARROW_COMPUTE)
endif()

add_arrow_benchmark(builder_benchmark)
add_arrow_benchmark(compare_benchmark)
add_arrow_benchmark(memory_pool_benchmark)
add_arrow_benchmark(type_benchmark)

Expand Down
102 changes: 70 additions & 32 deletions cpp/src/arrow/array/diff_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "arrow/testing/random.h"
#include "arrow/testing/util.h"
#include "arrow/type.h"
#include "arrow/util/logging.h"

namespace arrow {

Expand Down Expand Up @@ -105,11 +106,12 @@ class DiffTest : public ::testing::Test {
}

void AssertInsertIs(const std::string& insert_json) {
ASSERT_ARRAYS_EQUAL(*ArrayFromJSON(boolean(), insert_json), *insert_);
AssertArraysEqual(*ArrayFromJSON(boolean(), insert_json), *insert_, /*verbose=*/true);
}

void AssertRunLengthIs(const std::string& run_lengths_json) {
ASSERT_ARRAYS_EQUAL(*ArrayFromJSON(int64(), run_lengths_json), *run_lengths_);
AssertArraysEqual(*ArrayFromJSON(int64(), run_lengths_json), *run_lengths_,
/*verbose=*/true);
}

void BaseAndTargetFromRandomFilter(std::shared_ptr<Array> values,
Expand All @@ -127,6 +129,40 @@ class DiffTest : public ::testing::Test {
target_ = out_datum.make_array();
}

void TestBasicsWithUnions(UnionMode::type mode) {
ASSERT_OK_AND_ASSIGN(
auto type,
UnionType::Make({field("foo", utf8()), field("bar", int32())}, {2, 5}, mode));

// insert one
base_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [2, "?"], [5, 3], [5, 13]])");
DoDiff();
AssertInsertIs("[false, true]");
AssertRunLengthIs("[1, 2]");

// delete one
base_ = ArrayFromJSON(type, R"([[2, "!"], [2, "?"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
DoDiff();
AssertInsertIs("[false, false]");
AssertRunLengthIs("[1, 2]");

// change one
base_ = ArrayFromJSON(type, R"([[5, 3], [2, "!"], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "3"], [2, "!"], [5, 13]])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[0, 0, 2]");

// null out one
base_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], null])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[2, 0, 0]");
}

random::RandomArrayGenerator rng_;
std::shared_ptr<StructArray> edits_;
std::shared_ptr<Array> base_, target_;
Expand Down Expand Up @@ -251,6 +287,36 @@ TEST_F(DiffTest, CompareRandomStrings) {
}
}

TEST_F(DiffTest, BasicsWithBooleans) {
// insert one
base_ = ArrayFromJSON(boolean(), R"([true, true, true])");
target_ = ArrayFromJSON(boolean(), R"([true, false, true, true])");
DoDiff();
AssertInsertIs("[false, true]");
AssertRunLengthIs("[1, 2]");

// delete one
base_ = ArrayFromJSON(boolean(), R"([true, false, true, true])");
target_ = ArrayFromJSON(boolean(), R"([true, true, true])");
DoDiff();
AssertInsertIs("[false, false]");
AssertRunLengthIs("[1, 2]");

// change one
base_ = ArrayFromJSON(boolean(), R"([false, false, true])");
target_ = ArrayFromJSON(boolean(), R"([true, false, true])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[0, 0, 2]");

// null out one
base_ = ArrayFromJSON(boolean(), R"([true, false, true])");
target_ = ArrayFromJSON(boolean(), R"([true, false, null])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[2, 0, 0]");
}

TEST_F(DiffTest, BasicsWithStrings) {
// insert one
base_ = ArrayFromJSON(utf8(), R"(["give", "a", "break"])");
Expand Down Expand Up @@ -345,37 +411,9 @@ TEST_F(DiffTest, BasicsWithStructs) {
AssertRunLengthIs("[2, 0, 0]");
}

TEST_F(DiffTest, BasicsWithUnions) {
auto type = sparse_union({field("foo", utf8()), field("bar", int32())}, {2, 5});

// insert one
base_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [2, "?"], [5, 3], [5, 13]])");
DoDiff();
AssertInsertIs("[false, true]");
AssertRunLengthIs("[1, 2]");

// delete one
base_ = ArrayFromJSON(type, R"([[2, "!"], [2, "?"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
DoDiff();
AssertInsertIs("[false, false]");
AssertRunLengthIs("[1, 2]");

// change one
base_ = ArrayFromJSON(type, R"([[5, 3], [2, "!"], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "3"], [2, "!"], [5, 13]])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[0, 0, 2]");
TEST_F(DiffTest, BasicsWithSparseUnions) { TestBasicsWithUnions(UnionMode::SPARSE); }

// null out one
base_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], [5, 13]])");
target_ = ArrayFromJSON(type, R"([[2, "!"], [5, 3], null])");
DoDiff();
AssertInsertIs("[false, false, true]");
AssertRunLengthIs("[2, 0, 0]");
}
TEST_F(DiffTest, BasicsWithDenseUnions) { TestBasicsWithUnions(UnionMode::DENSE); }

TEST_F(DiffTest, UnifiedDiffFormatter) {
// no changes
Expand Down
Loading