#pragma once #include "option.h" #include "json.hpp" #include "tsl/htrie_map.h" #include "field.h" #include "tsl/htrie_set.h" #include "filter_result_iterator.h" struct reference_info_t { std::string collection; std::string field; bool is_async; std::string referenced_field_name; reference_info_t(std::string collection, std::string field, bool is_async, std::string referenced_field_name = "") : collection(std::move(collection)), field(std::move(field)), is_async(is_async), referenced_field_name(std::move(referenced_field_name)) {} bool operator < (const reference_info_t& other) const noexcept { if (collection == other.collection) { return field < other.field; } return collection < other.collection; } }; struct ref_include_collection_names_t { std::set collection_names; ref_include_collection_names_t* nested_include = nullptr; ~ref_include_collection_names_t() { delete nested_include; } }; class Join { public: static Option add_reference_helper_fields(nlohmann::json& document, const tsl::htrie_map& schema, const spp::sparse_hash_map& reference_fields, tsl::htrie_set& object_reference_helper_fields, const bool& is_update); static Option prune_ref_doc(nlohmann::json& doc, const reference_filter_result_t& references, const tsl::htrie_set& ref_include_fields_full, const tsl::htrie_set& ref_exclude_fields_full, const bool& is_reference_array, const ref_include_exclude_fields& ref_include_exclude); static Option include_references(nlohmann::json& doc, const uint32_t& seq_id, Collection *const collection, const std::map& reference_filter_results, const std::vector& ref_include_exclude_fields_vec, const nlohmann::json& original_doc); static Option parse_reference_filter(const std::string& filter_query, std::queue& tokens, size_t& index, std::set& ref_collection_names); static Option split_reference_include_exclude_fields(const std::string& include_exclude_fields, size_t& index, std::string& token); static void get_reference_collection_names(const std::string& filter_query, ref_include_collection_names_t*& ref_include); // Separate out the reference includes and excludes into `ref_include_exclude_fields_vec`. static Option initialize_ref_include_exclude_fields_vec(const std::string& filter_query, std::vector& include_fields_vec, std::vector& exclude_fields_vec, std::vector& ref_include_exclude_fields_vec); [[nodiscard]] static bool merge_join_conditions(string& embedded_filter, string& query_filter); };