• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "values_buckets.h"
16 
17 #include "rdb_errno.h"
18 
19 namespace OHOS {
20 namespace NativeRdb {
ValuesBuckets()21 ValuesBuckets::ValuesBuckets()
22 {
23     fields_ = std::make_shared<std::set<std::string>>();
24     values_ = std::make_shared<std::set<ValueObject>>();
25 }
26 
ValuesBuckets(const std::vector<ValuesBucket> & rows)27 ValuesBuckets::ValuesBuckets(const std::vector<ValuesBucket> &rows) : ValuesBuckets()
28 {
29     buckets_.reserve(rows.size());
30     for (const auto &bucket : rows) {
31         Put(bucket);
32     }
33 }
34 
ValuesBuckets(std::vector<ValuesBucket> && rows)35 ValuesBuckets::ValuesBuckets(std::vector<ValuesBucket> &&rows) noexcept : ValuesBuckets()
36 {
37     buckets_.reserve(rows.size());
38     for (auto &bucket : rows) {
39         Put(std::move(bucket));
40     }
41 }
42 
RowSize() const43 size_t ValuesBuckets::RowSize() const
44 {
45     return buckets_.size();
46 }
47 
GetFieldsAndValues() const48 std::pair<ValuesBuckets::FieldsType, ValuesBuckets::ValuesType> ValuesBuckets::GetFieldsAndValues() const
49 {
50     return { fields_, values_ };
51 }
52 
Reserve(int32_t size)53 void ValuesBuckets::Reserve(int32_t size)
54 {
55     buckets_.reserve(size);
56 }
57 
Clear()58 void ValuesBuckets::Clear()
59 {
60     buckets_.clear();
61     fields_->clear();
62     values_->clear();
63 }
64 
Put(const ValuesBucket & bucket)65 void ValuesBuckets::Put(const ValuesBucket &bucket)
66 {
67     BucketType row;
68     for (const auto &[field, value] : bucket.values_) {
69         auto fieldResult = fields_->insert(field);
70         auto valueResult = values_->insert(value);
71         row.insert(std::make_pair(std::ref(const_cast<std::string &>(*fieldResult.first)),
72             std::ref(const_cast<ValueObject &>(*valueResult.first))));
73     }
74     buckets_.push_back(std::move(row));
75 }
76 
Put(ValuesBucket && bucket)77 void ValuesBuckets::Put(ValuesBucket &&bucket)
78 {
79     BucketType row;
80     for (auto &[field, value] : bucket.values_) {
81         auto fieldResult = fields_->insert(std::move(field));
82         auto valueResult = values_->insert(std::move(value));
83         row.insert(std::make_pair(std::ref(const_cast<std::string &>(*fieldResult.first)),
84             std::ref(const_cast<ValueObject &>(*valueResult.first))));
85     }
86     buckets_.push_back(std::move(row));
87 }
88 
Get(size_t row,const FieldType & field) const89 std::pair<int, ValuesBuckets::ValueType> ValuesBuckets::Get(size_t row, const FieldType &field) const
90 {
91     ValueObject empty;
92     std::reference_wrapper<ValueObject> emptyRef(empty);
93     if (row >= buckets_.size()) {
94         return { E_INVALID_ARGS, emptyRef };
95     }
96 
97     auto &bucket = buckets_[row];
98     auto it = bucket.find(field);
99     if (it == bucket.end()) {
100         return { E_INVALID_ARGS, emptyRef };
101     }
102 
103     return { E_OK, it->second };
104 }
105 } // namespace NativeRdb
106 } // namespace OHOS
107