collection has-many-to-many resolve progress

This commit is contained in:
Sascha Kühl
2026-02-03 15:36:58 +01:00
parent 73abd61eba
commit 4d886f0343
7 changed files with 135 additions and 45 deletions
+30 -6
View File
@@ -96,18 +96,42 @@ public:
}
template<class CollectionType>
void on_has_many_to_many(const char *, CollectionType &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes &/*attr*/) {
const auto it = schema_.find(typeid(typename CollectionType::value_type::value_type));
void on_has_many_to_many(const char *id, CollectionType &, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes &/*attr*/) {
const auto it = schema_.find(id);
if (it == schema_.end()) {
throw query_builder_exception{query_build_error::UnknownType};
}
if (!it->second.node().info().has_primary_key()) {
throw query_builder_exception{query_build_error::MissingPrimaryKey};
auto producer = std::make_unique<query_collection_resolver_producer<typename CollectionType::value_type>>(
schema_,
it->second.table(),
inverse_join_column,
root_type_,
join_column);
const object::collection_composite_key key{root_type_, typeid(typename CollectionType::value_type), inverse_join_column};
schema_.collection_resolver_producers_[key] = std::move(producer);
}
template<class CollectionType>
void on_has_many_to_many(const char *id, CollectionType &, const utils::foreign_attributes &/*attr*/) {
const auto it = schema_.find(id);
if (it == schema_.end()) {
throw query_builder_exception{query_build_error::UnknownType};
}
object::join_columns_collector collector;
const auto jc = collector.collect<typename CollectionType::value_type::value_type>();
auto producer = std::make_unique<query_collection_resolver_producer<typename CollectionType::value_type>>(
schema_,
it->second.table(),
jc.join_column,
root_type_,
jc.inverse_join_column);
const object::collection_composite_key key{root_type_, typeid(typename CollectionType::value_type), jc.join_column};
schema_.collection_resolver_producers_[key] = std::move(producer);
}
template<class ContainerType>
static void on_has_many_to_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {}
private:
basic_schema& schema_;