// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include #include #include #include namespace db::query { /** * @brief An universal query class to read database records with offset and limit. */ class RecordQuery : public db::Query { private: std::size_t limit = 0; std::size_t offset = 0; public: /** * @brief Default constructor. Limit and offset are zeroed indicating that * all data should be read. */ RecordQuery() noexcept; /** * @brief Construct a new RecordQuery object with limit and offset values. * * @param limit maximum number of records to read * @param offset start offset to read records from */ RecordQuery(std::size_t limit, std::size_t offset) noexcept; /** * @brief Gets both limit and offset values * * @return bound pair of limit and offset for more convenient reading. */ [[nodiscard]] std::pair getLimitOffset() const noexcept; /** * @brief Gets limit of a query * * @return limit */ [[nodiscard]] std::size_t getLimit() const noexcept; /** * @brief Gets offset of a query * * @return offset */ [[nodiscard]] std::size_t getOffset() const noexcept; /** * @brief debug info * * @return class name */ [[nodiscard]] auto debugInfo() const -> std::string override; }; /** * @brief A response to the RecordQuery request. * * @tparam T type of records which were requested. */ template class RecordQueryResult : public db::QueryResult { private: std::vector records; public: /** * @brief Default constructor. Constructs an empty response (with no records) */ RecordQueryResult() noexcept = default; /** * @brief Constructs response with a vector of records to be sent * * @param result vector of records (std::vector) */ RecordQueryResult(std::vector result) noexcept : records(std::move(result)) {} /** * @brief Gets records from query * * @return received records */ [[nodiscard]] const std::vector &getRecords() const noexcept { return records; } /** * @brief debug info * * @return class name */ [[nodiscard]] auto debugInfo() const -> std::string override { return "RecordQueryResult"; } }; class LetterMapResult : public db::QueryResult { private: ContactsMapData letterMap; public: LetterMapResult() noexcept = default; LetterMapResult(ContactsMapData result) noexcept : letterMap(std::move(result)) {} [[nodiscard]] const ContactsMapData &getLetterMap() const noexcept { return letterMap; } [[nodiscard]] auto debugInfo() const -> std::string override { return "RecordQueryResult"; } }; /** * @brief An universal query to ask for a count of records in a table * */ class RecordsSizeQuery : public db::Query { public: /** * @brief Default constructor * */ RecordsSizeQuery() noexcept; /** * @brief debug info * * @return class name */ [[nodiscard]] auto debugInfo() const -> std::string override; }; /** * @brief A response to the db::query::RecordsSizeQuery records count query * */ class RecordsSizeQueryResult : public db::QueryResult { private: std::size_t size = 0; public: /** * @brief Default constructor. Constructs an empty response (record count 0) */ RecordsSizeQueryResult() noexcept = default; /** * @brief Constructs a reponse to the db::query::RecordsSizeQuery with a value * * @param count of records */ RecordsSizeQueryResult(std::size_t size) noexcept; /** * @brief Gets number of records * * @return number of records */ [[nodiscard]] std::size_t getSize() const noexcept; /** * @brief debug info * * @return class name */ [[nodiscard]] auto debugInfo() const -> std::string override; }; }; // namespace db::query