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
24using namespace proxima::be;
25using namespace proxima::be::index;
26
27class 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
37void 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
48TEST_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