////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2017 EMC Corporation /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is EMC Corporation /// /// @author Andrey Abramov /// @author Vasiliy Nabatchikov //////////////////////////////////////////////////////////////////////////////// #ifndef ARANGODB_IRESEARCH__IRESEARCH_VIEW_META_H #define ARANGODB_IRESEARCH__IRESEARCH_VIEW_META_H 1 #include #include #include "IResearchViewSort.h" #include "VocBase/voc-types.h" #include "index/index_writer.hpp" #include "velocypack/Builder.h" namespace arangodb { namespace velocypack { struct ObjectBuilder; // forward declarations class Slice; // forward declarations } // namespace velocypack } // namespace arangodb namespace arangodb { namespace iresearch { // ----------------------------------------------------------------------------- // --SECTION-- public // types // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief metadata describing the IResearch view //////////////////////////////////////////////////////////////////////////////// struct IResearchViewMeta { class ConsolidationPolicy { public: ConsolidationPolicy() = default; ConsolidationPolicy(irs::index_writer::consolidation_policy_t&& policy, arangodb::velocypack::Builder&& properties) noexcept : _policy(std::move(policy)), _properties(std::move(properties)) {} irs::index_writer::consolidation_policy_t const& policy() const noexcept { return _policy; } arangodb::velocypack::Slice properties() const noexcept { return _properties.slice(); } private: irs::index_writer::consolidation_policy_t _policy; // policy instance (false == disable) arangodb::velocypack::Builder _properties; // normalized policy definition }; struct Mask { bool _cleanupIntervalStep; bool _commitIntervalMsec; bool _consolidationIntervalMsec; bool _consolidationPolicy; bool _locale; bool _version; bool _writebufferActive; bool _writebufferIdle; bool _writebufferSizeMax; bool _primarySort; explicit Mask(bool mask = false) noexcept; }; size_t _cleanupIntervalStep; // issue cleanup after commits (0 == disable) size_t _commitIntervalMsec; // issue commit after milliseconds (0 == disable) size_t _consolidationIntervalMsec; // issue consolidation after milliseconds (0 == disable) ConsolidationPolicy _consolidationPolicy; // the consolidation policy to use std::locale _locale; // locale used for ordering processed attribute names uint32_t _version; // the version of the iresearch interface e.g. which how data is stored in iresearch (default == latest) size_t _writebufferActive; // maximum number of concurrent segments before segment aquisition blocks, e.g. max number of concurrent transacitons) (0 == unlimited) size_t _writebufferIdle; // maximum number of segments cached in the pool size_t _writebufferSizeMax; // maximum memory byte size per segment before a segment flush is triggered (0 == unlimited) IResearchViewSort _primarySort; // NOTE: if adding fields don't forget to modify the default constructor !!! // NOTE: if adding fields don't forget to modify the copy constructor !!! // NOTE: if adding fields don't forget to modify the move constructor !!! // NOTE: if adding fields don't forget to modify the comparison operator !!! // NOTE: if adding fields don't forget to modify IResearchLinkMeta::Mask !!! // NOTE: if adding fields don't forget to modify IResearchLinkMeta::Mask // constructor !!! NOTE: if adding fields don't forget to modify the init(...) // function !!! NOTE: if adding fields don't forget to modify the json(...) // function !!! NOTE: if adding fields don't forget to modify the memory() // function !!! IResearchViewMeta(); IResearchViewMeta(IResearchViewMeta const& other); IResearchViewMeta(IResearchViewMeta&& other) noexcept; IResearchViewMeta& operator=(IResearchViewMeta&& other) noexcept; IResearchViewMeta& operator=(IResearchViewMeta const& other); bool operator==(IResearchViewMeta const& other) const noexcept; bool operator!=(IResearchViewMeta const& other) const noexcept; //////////////////////////////////////////////////////////////////////////////// /// @brief return default IResearchViewMeta values //////////////////////////////////////////////////////////////////////////////// static const IResearchViewMeta& DEFAULT(); //////////////////////////////////////////////////////////////////////////////// /// @brief initialize IResearchViewMeta with values from a JSON description /// return success or set 'errorField' to specific field with error /// on failure state is undefined /// @param mask if set reflects which fields were initialized from JSON //////////////////////////////////////////////////////////////////////////////// bool init(arangodb::velocypack::Slice const& slice, std::string& errorField, IResearchViewMeta const& defaults = DEFAULT(), Mask* mask = nullptr) noexcept; //////////////////////////////////////////////////////////////////////////////// /// @brief fill and return a JSON description of a IResearchViewMeta object /// do not fill values identical to ones available in 'ignoreEqual' /// or (if 'mask' != nullptr) values in 'mask' that are set to false /// elements are appended to an existing object /// return success or set TRI_set_errno(...) and return false //////////////////////////////////////////////////////////////////////////////// bool json(arangodb::velocypack::Builder& builder, IResearchViewMeta const* ignoreEqual = nullptr, Mask const* mask = nullptr) const; //////////////////////////////////////////////////////////////////////////////// /// @brief amount of memory in bytes occupied by this iResearch Link meta //////////////////////////////////////////////////////////////////////////////// size_t memory() const; }; //////////////////////////////////////////////////////////////////////////////// /// @brief internal configuration state of an IResearch view instance /// not directly modifiable by user //////////////////////////////////////////////////////////////////////////////// struct IResearchViewMetaState { struct Mask { bool _collections; explicit Mask(bool mask = false) noexcept; }; std::unordered_set _collections; // collection links added to this view via IResearchLink // creation (may contain no-longer valid cids) // NOTE: if adding fields don't forget to modify the default constructor !!! // NOTE: if adding fields don't forget to modify the copy constructor !!! // NOTE: if adding fields don't forget to modify the move constructor !!! // NOTE: if adding fields don't forget to modify the comparison operator !!! // NOTE: if adding fields don't forget to modify IResearchLinkMetaState::Mask // !!! NOTE: if adding fields don't forget to modify // IResearchLinkMetaState::Mask constructor !!! NOTE: if adding fields don't // forget to modify the init(...) function !!! NOTE: if adding fields don't // forget to modify the json(...) function !!! NOTE: if adding fields don't // forget to modify the memory() function !!! IResearchViewMetaState(); IResearchViewMetaState(IResearchViewMetaState const& other); IResearchViewMetaState(IResearchViewMetaState&& other) noexcept; IResearchViewMetaState& operator=(IResearchViewMetaState&& other) noexcept; IResearchViewMetaState& operator=(IResearchViewMetaState const& other); bool operator==(IResearchViewMetaState const& other) const noexcept; bool operator!=(IResearchViewMetaState const& other) const noexcept; //////////////////////////////////////////////////////////////////////////////// /// @brief return default IResearchViewMeta values //////////////////////////////////////////////////////////////////////////////// static const IResearchViewMetaState& DEFAULT(); //////////////////////////////////////////////////////////////////////////////// /// @brief initialize IResearchViewMeta with values from a JSON description /// return success or set 'errorField' to specific field with error /// on failure state is undefined /// @param mask if set reflects which fields were initialized from JSON //////////////////////////////////////////////////////////////////////////////// bool init(arangodb::velocypack::Slice const& slice, std::string& errorField, IResearchViewMetaState const& defaults = DEFAULT(), Mask* mask = nullptr); //////////////////////////////////////////////////////////////////////////////// /// @brief fill and return a JSON description of a IResearchViewMeta object /// do not fill values identical to ones available in 'ignoreEqual' /// or (if 'mask' != nullptr) values in 'mask' that are set to false /// elements are appended to an existing object /// return success or set TRI_set_errno(...) and return false //////////////////////////////////////////////////////////////////////////////// bool json(arangodb::velocypack::Builder& builder, IResearchViewMetaState const* ignoreEqual = nullptr, Mask const* mask = nullptr) const; //////////////////////////////////////////////////////////////////////////////// /// @brief amount of memory in bytes occupied by this iResearch Link meta //////////////////////////////////////////////////////////////////////////////// size_t memory() const; }; } // namespace iresearch } // namespace arangodb #endif