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