1 // Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
5
6 #include <memory>
7 #include "test_util/testharness.h"
8 #include "utilities/cassandra/format.h"
9 #include "utilities/cassandra/test_utils.h"
10
11 namespace ROCKSDB_NAMESPACE {
12 namespace cassandra {
13
TEST(RowValueMergeTest,Merge)14 TEST(RowValueMergeTest, Merge) {
15 std::vector<RowValue> row_values;
16 row_values.push_back(
17 CreateTestRowValue({
18 CreateTestColumnSpec(kTombstone, 0, 5),
19 CreateTestColumnSpec(kColumn, 1, 8),
20 CreateTestColumnSpec(kExpiringColumn, 2, 5),
21 })
22 );
23
24 row_values.push_back(
25 CreateTestRowValue({
26 CreateTestColumnSpec(kColumn, 0, 2),
27 CreateTestColumnSpec(kExpiringColumn, 1, 5),
28 CreateTestColumnSpec(kTombstone, 2, 7),
29 CreateTestColumnSpec(kExpiringColumn, 7, 17),
30 })
31 );
32
33 row_values.push_back(
34 CreateTestRowValue({
35 CreateTestColumnSpec(kExpiringColumn, 0, 6),
36 CreateTestColumnSpec(kTombstone, 1, 5),
37 CreateTestColumnSpec(kColumn, 2, 4),
38 CreateTestColumnSpec(kTombstone, 11, 11),
39 })
40 );
41
42 RowValue merged = RowValue::Merge(std::move(row_values));
43 EXPECT_FALSE(merged.IsTombstone());
44 EXPECT_EQ(merged.columns_.size(), 5);
45 VerifyRowValueColumns(merged.columns_, 0, kExpiringColumn, 0, 6);
46 VerifyRowValueColumns(merged.columns_, 1, kColumn, 1, 8);
47 VerifyRowValueColumns(merged.columns_, 2, kTombstone, 2, 7);
48 VerifyRowValueColumns(merged.columns_, 3, kExpiringColumn, 7, 17);
49 VerifyRowValueColumns(merged.columns_, 4, kTombstone, 11, 11);
50 }
51
TEST(RowValueMergeTest,MergeWithRowTombstone)52 TEST(RowValueMergeTest, MergeWithRowTombstone) {
53 std::vector<RowValue> row_values;
54
55 // A row tombstone.
56 row_values.push_back(
57 CreateRowTombstone(11)
58 );
59
60 // This row's timestamp is smaller than tombstone.
61 row_values.push_back(
62 CreateTestRowValue({
63 CreateTestColumnSpec(kColumn, 0, 5),
64 CreateTestColumnSpec(kColumn, 1, 6),
65 })
66 );
67
68 // Some of the column's row is smaller, some is larger.
69 row_values.push_back(
70 CreateTestRowValue({
71 CreateTestColumnSpec(kColumn, 2, 10),
72 CreateTestColumnSpec(kColumn, 3, 12),
73 })
74 );
75
76 // All of the column's rows are larger than tombstone.
77 row_values.push_back(
78 CreateTestRowValue({
79 CreateTestColumnSpec(kColumn, 4, 13),
80 CreateTestColumnSpec(kColumn, 5, 14),
81 })
82 );
83
84 RowValue merged = RowValue::Merge(std::move(row_values));
85 EXPECT_FALSE(merged.IsTombstone());
86 EXPECT_EQ(merged.columns_.size(), 3);
87 VerifyRowValueColumns(merged.columns_, 0, kColumn, 3, 12);
88 VerifyRowValueColumns(merged.columns_, 1, kColumn, 4, 13);
89 VerifyRowValueColumns(merged.columns_, 2, kColumn, 5, 14);
90
91 // If the tombstone's timestamp is the latest, then it returns a
92 // row tombstone.
93 row_values.push_back(
94 CreateRowTombstone(15)
95 );
96
97 row_values.push_back(
98 CreateRowTombstone(17)
99 );
100
101 merged = RowValue::Merge(std::move(row_values));
102 EXPECT_TRUE(merged.IsTombstone());
103 EXPECT_EQ(merged.LastModifiedTime(), 17);
104 }
105
106 } // namespace cassandra
107 } // namespace ROCKSDB_NAMESPACE
108
main(int argc,char ** argv)109 int main(int argc, char** argv) {
110 ::testing::InitGoogleTest(&argc, argv);
111 return RUN_ALL_TESTS();
112 }
113