/*------------------------------------------------------------------------------* * Architecture & Implementation of DBMS * *------------------------------------------------------------------------------* * Copyright 2022 Databases and Information Systems Group TU Dortmund * * Visit us at * * http://dbis.cs.tu-dortmund.de/cms/en/home/ * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * * OTHER DEALINGS IN THE SOFTWARE. * * * * Authors: * * Maximilian Berens * * Roland Kühn * * Jan Mühlig * *------------------------------------------------------------------------------* */ #pragma once #include "type.h" #include #include #include #include #include namespace beedb::table { /** * Represents one column in a table schema. */ class Column { friend std::ostream &operator<<(std::ostream &stream, const Column &column); public: Column() = default; Column(const std::int32_t id, const Type type, const bool is_nullable = false, std::vector> &&indices = {}) : _id(id), _type(type), _is_nullable(is_nullable), _indices(indices) { } explicit Column(const Type type, const bool is_nullable = false, std::vector> &&indices = {}) : _type(type), _is_nullable(is_nullable), _indices(indices) { } Column(const Column &other) = default; Column(Column &&) = default; Column &operator=(Column &&) = default; ~Column() = default; /** * @return Id of the column or -1 if the column was not persisted to the metadata table. */ [[nodiscard]] std::int32_t id() const { return _id; } /** * @return Type of the column. */ [[nodiscard]] const Type &type() const { return _type; } /** * @return True, if data can be null for the column. */ [[nodiscard]] bool is_nullable() const { return _is_nullable; } /** * @return True, when at least one index exists for this column. */ [[nodiscard]] bool is_indexed() const { return _indices.empty() == false; } /** * Allows to ask for an index with specific requirements. * * @param require_range_index Specifies if we need an index supporting range queries. * @return True, when an index with given requirements exists. */ [[nodiscard]] bool is_indexed(const bool require_range_index) const { if (require_range_index == false) { return is_indexed(); } for (auto &index : _indices) { if (index->supports_range()) { return true; } } return false; } /** * Adds an index to the column. * * @param index Index to add. */ inline void add_index(std::shared_ptr index) { _indices.push_back(std::move(index)); } /** * @return All indices for this column. */ [[nodiscard]] const std::vector> &indices() const { return _indices; } /** * Checks whether an index with a specific name exists. * * @param name Name of the index. * @return True, when the index exists. */ [[nodiscard]] bool has_index(const std::string &name) const { return index(name) != nullptr; } /** * Lookup for a specific index. * * @param name Name of the index. * @return Pointer to the specific index. */ [[nodiscard]] std::shared_ptr index(const std::string &name) const { for (auto &index : _indices) { if (index->name() == name) { return index; } } return {}; } /** * Lookup for a specific index. * * @param need_range Specifies whether the wanted index has to provied range queries. * @return An index that supports the requirements. */ [[nodiscard]] std::shared_ptr index(const bool need_range) const { if (_indices.empty() == false && need_range == false) { return _indices[0]; } for (auto &index : _indices) { if (index->supports_range()) { return index; } } return {}; } bool operator==(const Column &other) const { return _id == other.id(); } bool operator!=(const Column &other) const { return _id != other.id(); } bool operator==(const Type type) const { return _type == type; } bool operator!=(const Type type) const { return _type != type; } private: std::int32_t _id{-1}; Type _type{}; bool _is_nullable{false}; std::vector> _indices; }; } // namespace beedb::table