diff --git a/include/matador/object/collection_proxy.hpp b/include/matador/object/collection_proxy.hpp index 791aae3..35eb8e0 100644 --- a/include/matador/object/collection_proxy.hpp +++ b/include/matador/object/collection_proxy.hpp @@ -20,7 +20,11 @@ namespace matador::object { // relation template < class RelationType > -struct relation_iterator_traits; +struct relation_iterator_traits { + static RelationType& value(RelationType& item) { + return item; + } +}; template < typename Type, typename OwnerType > struct relation_iterator_traits> { @@ -39,11 +43,17 @@ public: using iterator_category = std::forward_iterator_tag; collection_proxy_iterator() = default; - explicit collection_proxy_iterator(typename std::vector::iterator it) + collection_proxy_iterator(typename std::vector::iterator it) : it_(it) {} - reference operator*() { return *it_; } - pointer operator->() { return &*it_; } + reference operator*() { + return relation_iterator_traits::value(*it_); + } + + pointer operator->() { + return &relation_iterator_traits::value(*it_); + } + collection_proxy_iterator& operator++() { ++it_; return *this; @@ -55,9 +65,10 @@ public: return !operator==(other); } - relation_type& relation() { - return *it_; - } + // relation_type& relation() { + + // return *it_; + // } private: typename std::vector::iterator it_; }; @@ -67,8 +78,10 @@ class abstract_collection_proxy { public: using value_type = Type; using relation_type = RelationType; - using iterator = typename std::vector::iterator; - using const_iterator = typename std::vector::const_iterator; + // using iterator = typename std::vector::iterator; + // using const_iterator = typename std::vector::const_iterator; + using iterator = collection_proxy_iterator; + using const_iterator = collection_proxy_iterator; virtual ~abstract_collection_proxy() = default; diff --git a/test/core/object/CollectionTest.cpp b/test/core/object/CollectionTest.cpp index 015e0ae..843e0ed 100644 --- a/test/core/object/CollectionTest.cpp +++ b/test/core/object/CollectionTest.cpp @@ -3,5 +3,14 @@ #include "matador/object/collection.hpp" #include "matador/object/object.hpp" +#include + +using namespace matador::object; + TEST_CASE("Test collection", "[collection]") { + collection ints{{1,2,3,4}}; + + for (auto const& i : ints) { + std::cout << i << std::endl ; + } } \ No newline at end of file diff --git a/test/orm/query/DeleteQueryBuilderTest.cpp b/test/orm/query/DeleteQueryBuilderTest.cpp index 6d71155..bd85157 100644 --- a/test/orm/query/DeleteQueryBuilderTest.cpp +++ b/test/orm/query/DeleteQueryBuilderTest.cpp @@ -72,7 +72,7 @@ TEST_CASE_METHOD(QueryFixture, "Test delete builder has many to many", "[query][ .and_then( [&scm] { return scm.attach("ingredients"); } ); REQUIRE(result.is_ok()); - const std::vector ingredients { + std::vector ingredients { make_object(1, "Apple"), make_object(2, "Strawberry"), make_object(3, "Pineapple"), @@ -82,12 +82,20 @@ TEST_CASE_METHOD(QueryFixture, "Test delete builder has many to many", "[query][ make_object(7, "Beans") }; + for (auto &i : ingredients) { + i.change_state(object_state::Persistent); + } + std::vector recipes { make_object(1, "Apple Pie", std::vector{ingredients[0], ingredients[3], ingredients[4]}), make_object(2, "Strawberry Cake", std::vector{ingredients[5], ingredients[6]}), make_object(3, "Pineapple Pie", std::vector{ingredients[0], ingredients[1], ingredients[2]}) }; + for (auto &r : recipes) { + r.change_state(object_state::Persistent); + } + const auto contexts_by_type = to_contexts_by_name(scm, db->dialect()); delete_query_builder dqb(scm, contexts_by_type);