153c3577eSopenharmony_ci/*
253c3577eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
353c3577eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
453c3577eSopenharmony_ci * you may not use this file except in compliance with the License.
553c3577eSopenharmony_ci * You may obtain a copy of the License at
653c3577eSopenharmony_ci *
753c3577eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
853c3577eSopenharmony_ci *
953c3577eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1053c3577eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1153c3577eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1253c3577eSopenharmony_ci * See the License for the specific language governing permissions and
1353c3577eSopenharmony_ci * limitations under the License.
1453c3577eSopenharmony_ci */
1553c3577eSopenharmony_ci
1653c3577eSopenharmony_ci#ifndef OHOS_DISTRIBUTED_DATA_DATAMGR_SERVICE_RDB_QUERY_H
1753c3577eSopenharmony_ci#define OHOS_DISTRIBUTED_DATA_DATAMGR_SERVICE_RDB_QUERY_H
1853c3577eSopenharmony_ci#include "query.h"
1953c3577eSopenharmony_ci#include "rdb_predicates.h"
2053c3577eSopenharmony_ci#include "store/general_value.h"
2153c3577eSopenharmony_ci#include "store_types.h"
2253c3577eSopenharmony_cinamespace OHOS::DistributedRdb {
2353c3577eSopenharmony_ciclass RdbQuery : public DistributedData::GenQuery {
2453c3577eSopenharmony_cipublic:
2553c3577eSopenharmony_ci    using Predicates = NativeRdb::RdbPredicates;
2653c3577eSopenharmony_ci    static constexpr uint64_t TYPE_ID = 0x20000001;
2753c3577eSopenharmony_ci    RdbQuery() = default;
2853c3577eSopenharmony_ci    ~RdbQuery() override = default;
2953c3577eSopenharmony_ci    bool IsEqual(uint64_t tid) override;
3053c3577eSopenharmony_ci    std::vector<std::string> GetTables() override;
3153c3577eSopenharmony_ci    void SetQueryNodes(const std::string& tableName, DistributedData::QueryNodes&& nodes) override;
3253c3577eSopenharmony_ci    DistributedData::QueryNodes GetQueryNodes(const std::string& tableName) override;
3353c3577eSopenharmony_ci    std::vector<std::string> GetDevices() const;
3453c3577eSopenharmony_ci    std::string GetStatement() const;
3553c3577eSopenharmony_ci    DistributedData::Values GetBindArgs() const;
3653c3577eSopenharmony_ci    void SetColumns(std::vector<std::string> &&columns);
3753c3577eSopenharmony_ci    void SetColumns(const std::vector<std::string> &columns);
3853c3577eSopenharmony_ci    std::vector<std::string> GetColumns() const;
3953c3577eSopenharmony_ci    DistributedDB::Query GetQuery() const;
4053c3577eSopenharmony_ci    DistributedDB::RemoteCondition GetRemoteCondition() const;
4153c3577eSopenharmony_ci    bool IsRemoteQuery();
4253c3577eSopenharmony_ci    bool IsPriority();
4353c3577eSopenharmony_ci    void MakeQuery(const PredicatesMemo &predicates);
4453c3577eSopenharmony_ci    void MakeRemoteQuery(const std::string &devices, const std::string &sql, DistributedData::Values &&args);
4553c3577eSopenharmony_ci    void MakeCloudQuery(const PredicatesMemo &predicates);
4653c3577eSopenharmony_ci
4753c3577eSopenharmony_ciprivate:
4853c3577eSopenharmony_ci    void EqualTo(const RdbPredicateOperation& operation);
4953c3577eSopenharmony_ci    void NotEqualTo(const RdbPredicateOperation& operation);
5053c3577eSopenharmony_ci    void And(const RdbPredicateOperation& operation);
5153c3577eSopenharmony_ci    void Or(const RdbPredicateOperation& operation);
5253c3577eSopenharmony_ci    void OrderBy(const RdbPredicateOperation& operation);
5353c3577eSopenharmony_ci    void Limit(const RdbPredicateOperation& operation);
5453c3577eSopenharmony_ci    void In(const RdbPredicateOperation& operation);
5553c3577eSopenharmony_ci    void NotIn(const RdbPredicateOperation& operation);
5653c3577eSopenharmony_ci    void Contain(const RdbPredicateOperation& operation);
5753c3577eSopenharmony_ci    void BeginWith(const RdbPredicateOperation& operation);
5853c3577eSopenharmony_ci    void EndWith(const RdbPredicateOperation& operation);
5953c3577eSopenharmony_ci    void IsNull(const RdbPredicateOperation& operation);
6053c3577eSopenharmony_ci    void IsNotNull(const RdbPredicateOperation& operation);
6153c3577eSopenharmony_ci    void Like(const RdbPredicateOperation& operation);
6253c3577eSopenharmony_ci    void Glob(const RdbPredicateOperation& operation);
6353c3577eSopenharmony_ci    void Between(const RdbPredicateOperation& operation);
6453c3577eSopenharmony_ci    void NotBetween(const RdbPredicateOperation& operation);
6553c3577eSopenharmony_ci    void GreaterThan(const RdbPredicateOperation& operation);
6653c3577eSopenharmony_ci    void GreaterThanOrEqual(const RdbPredicateOperation& operation);
6753c3577eSopenharmony_ci    void LessThan(const RdbPredicateOperation& operation);
6853c3577eSopenharmony_ci    void LessThanOrEqual(const RdbPredicateOperation& operation);
6953c3577eSopenharmony_ci    void Distinct(const RdbPredicateOperation& operation);
7053c3577eSopenharmony_ci    void IndexedBy(const RdbPredicateOperation& operation);
7153c3577eSopenharmony_ci    void BeginGroup(const RdbPredicateOperation& operation);
7253c3577eSopenharmony_ci    void EndGroup(const RdbPredicateOperation& operation);
7353c3577eSopenharmony_ci    using PredicateHandle = void (RdbQuery::*)(const RdbPredicateOperation &operation);
7453c3577eSopenharmony_ci    static constexpr inline PredicateHandle HANDLES[OPERATOR_MAX] = {
7553c3577eSopenharmony_ci        &RdbQuery::EqualTo,
7653c3577eSopenharmony_ci        &RdbQuery::NotEqualTo,
7753c3577eSopenharmony_ci        &RdbQuery::And,
7853c3577eSopenharmony_ci        &RdbQuery::Or,
7953c3577eSopenharmony_ci        &RdbQuery::OrderBy,
8053c3577eSopenharmony_ci        &RdbQuery::Limit,
8153c3577eSopenharmony_ci        &RdbQuery::BeginGroup,
8253c3577eSopenharmony_ci        &RdbQuery::EndGroup,
8353c3577eSopenharmony_ci        &RdbQuery::In,
8453c3577eSopenharmony_ci        &RdbQuery::NotIn,
8553c3577eSopenharmony_ci        &RdbQuery::Contain,
8653c3577eSopenharmony_ci        &RdbQuery::BeginWith,
8753c3577eSopenharmony_ci        &RdbQuery::EndWith,
8853c3577eSopenharmony_ci        &RdbQuery::IsNull,
8953c3577eSopenharmony_ci        &RdbQuery::IsNotNull,
9053c3577eSopenharmony_ci        &RdbQuery::Like,
9153c3577eSopenharmony_ci        &RdbQuery::Glob,
9253c3577eSopenharmony_ci        &RdbQuery::Between,
9353c3577eSopenharmony_ci        &RdbQuery::NotBetween,
9453c3577eSopenharmony_ci        &RdbQuery::GreaterThan,
9553c3577eSopenharmony_ci        &RdbQuery::GreaterThanOrEqual,
9653c3577eSopenharmony_ci        &RdbQuery::LessThan,
9753c3577eSopenharmony_ci        &RdbQuery::LessThanOrEqual,
9853c3577eSopenharmony_ci        &RdbQuery::Distinct,
9953c3577eSopenharmony_ci        &RdbQuery::IndexedBy
10053c3577eSopenharmony_ci    };
10153c3577eSopenharmony_ci    static constexpr inline uint32_t DECIMAL_BASE = 10;
10253c3577eSopenharmony_ci
10353c3577eSopenharmony_ci    DistributedDB::Query query_;
10453c3577eSopenharmony_ci    std::shared_ptr<Predicates> predicates_;
10553c3577eSopenharmony_ci    std::vector<std::string> columns_;
10653c3577eSopenharmony_ci    bool isRemote_ = false;
10753c3577eSopenharmony_ci    bool isPriority_ = false;
10853c3577eSopenharmony_ci    std::string sql_;
10953c3577eSopenharmony_ci    DistributedData::Values args_;
11053c3577eSopenharmony_ci    std::vector<std::string> devices_;
11153c3577eSopenharmony_ci    std::vector<std::string> tables_;
11253c3577eSopenharmony_ci    DistributedData::QueryNodes queryNodes_;
11353c3577eSopenharmony_ci};
11453c3577eSopenharmony_ci} // namespace OHOS::DistributedRdb
11553c3577eSopenharmony_ci#endif // OHOS_DISTRIBUTED_DATA_DATAMGR_SERVICE_RDB_QUERY_H
116