1 | /** |
2 | * Copyright 2021 Alibaba, Inc. and its affiliates. All Rights Reserved. |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | */ |
16 | |
17 | #include "index/column/forward_reader.h" |
18 | #include <memory> |
19 | #include <unordered_map> |
20 | #include <gtest/gtest.h> |
21 | #include "index/column/forward_indexer.h" |
22 | #include "index/file_helper.h" |
23 | |
24 | using namespace proxima::be; |
25 | using namespace proxima::be::index; |
26 | |
27 | class ForwardReaderTest : public testing::Test { |
28 | protected: |
29 | void SetUp() { |
30 | FileHelper::RemoveFile("./data.fwd.0" ); |
31 | FileHelper::RemoveFile("data.seg.0" ); |
32 | } |
33 | |
34 | void TearDown() {} |
35 | }; |
36 | |
37 | void do_search(ForwardReader *reader, size_t number) { |
38 | ForwardData forward; |
39 | int ret = reader->seek(number, &forward); |
40 | |
41 | ASSERT_EQ(ret, 0); |
42 | ASSERT_EQ(forward.header.primary_key, number); |
43 | ASSERT_EQ(forward.header.lsn, number); |
44 | ASSERT_EQ(forward.header.revision, number); |
45 | ASSERT_EQ(forward.data, "hello" ); |
46 | } |
47 | |
48 | TEST_F(ForwardReaderTest, TestGeneral) { |
49 | auto forward_indexer = ForwardIndexer::Create("test_collection" , "./" , 0); |
50 | ASSERT_TRUE(forward_indexer != nullptr); |
51 | |
52 | ReadOptions read_options; |
53 | read_options.use_mmap = true; |
54 | read_options.create_new = true; |
55 | |
56 | forward_indexer->set_start_doc_id(0); |
57 | int ret = forward_indexer->open(read_options); |
58 | ASSERT_EQ(ret, 0); |
59 | |
60 | // insert 1000 records |
61 | for (size_t i = 0; i < 1000; i++) { |
62 | ForwardData forward; |
63 | forward.header.primary_key = i; |
64 | forward.header.lsn = i; |
65 | forward.header.revision = i; |
66 | forward.data = "hello" ; |
67 | |
68 | idx_t doc_id = 0U; |
69 | ret = forward_indexer->insert(forward, &doc_id); |
70 | ASSERT_EQ(ret, 0); |
71 | ASSERT_EQ(doc_id, i); |
72 | } |
73 | |
74 | auto dumper = aitheta2::IndexFactory::CreateDumper("FileDumper" ); |
75 | ASSERT_NE(dumper, nullptr); |
76 | |
77 | ret = dumper->create("data.seg.0" ); |
78 | ASSERT_EQ(ret, 0); |
79 | |
80 | IndexDumperPtr fwd_dumper = |
81 | std::make_shared<IndexSegmentDumper>(dumper, FORWARD_DUMP_BLOCK); |
82 | |
83 | ret = forward_indexer->dump(fwd_dumper); |
84 | ASSERT_EQ(ret, 0); |
85 | |
86 | fwd_dumper->close(); |
87 | dumper->close(); |
88 | ret = forward_indexer->close(); |
89 | ASSERT_EQ(ret, 0); |
90 | |
91 | auto forward_reader = ForwardReader::Create("test_collection" , "./" , 0); |
92 | read_options.create_new = false; |
93 | ret = forward_reader->open(read_options); |
94 | ASSERT_EQ(ret, 0); |
95 | |
96 | for (size_t i = 0; i < 1000; i++) { |
97 | ForwardData forward; |
98 | ret = forward_reader->seek(i, &forward); |
99 | |
100 | ASSERT_EQ(ret, 0); |
101 | ASSERT_EQ(forward.header.primary_key, i); |
102 | ASSERT_EQ(forward.header.lsn, i); |
103 | ASSERT_EQ(forward.header.revision, i); |
104 | ASSERT_EQ(forward.data, "hello" ); |
105 | } |
106 | |
107 | ailego::ThreadPool pool(3); |
108 | for (size_t i = 0; i < 1000; i++) { |
109 | pool.execute(&do_search, forward_reader.get(), i); |
110 | } |
111 | pool.wait_finish(); |
112 | |
113 | forward_reader->close(); |
114 | } |
115 | |