From d6584151443e16bd5204bb11d0cae6ff5406c4f1 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 12 Nov 2009 02:15:02 +0100 Subject: [PATCH] WIP about providing scope contents discovery, backed by the index --- src/proc/mobject/session/placement-index.hpp | 6 ++--- src/proc/mobject/session/query-resolver.cpp | 2 +- src/proc/mobject/session/query-resolver.hpp | 9 ++++++++ src/proc/mobject/session/session-impl.hpp | 8 ++++++- .../session/session-service-explore-scope.hpp | 5 +++- src/proc/mobject/session/session-services.cpp | 16 ++++++++++++- .../session/placement-index-query-test.cpp | 23 +++++++++++++------ .../proc/mobject/session/scope-query-test.cpp | 9 ++++---- 8 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/proc/mobject/session/placement-index.hpp b/src/proc/mobject/session/placement-index.hpp index e1e163407..6379f69b8 100644 --- a/src/proc/mobject/session/placement-index.hpp +++ b/src/proc/mobject/session/placement-index.hpp @@ -89,7 +89,7 @@ namespace session { PlacementMO& getScope (PlacementMO const&) const; PlacementMO& getScope (ID) const; - vector getReferrers (ID) const; + vector getReferrers (ID) const; ///////////////TODO: interface for low level enumeration /** retrieve the logical root scope */ @@ -105,10 +105,10 @@ namespace session { query (PlacementMO& scope) const; operator string() const { return "PlacementIndex"; } -////////////////////////////////////////////////////////////////TODO: refactor into explicit query resolving wrapper - bool canHandleQuery(QID) const; +////////////////////////////////////////////////////////////////TODO: refactor into explicit query resolving wrapper + /* == mutating operations == */ diff --git a/src/proc/mobject/session/query-resolver.cpp b/src/proc/mobject/session/query-resolver.cpp index af618310d..5b01ef3c5 100644 --- a/src/proc/mobject/session/query-resolver.cpp +++ b/src/proc/mobject/session/query-resolver.cpp @@ -103,7 +103,7 @@ namespace session { { TODO ("ensure proper initialisation"); - if (!canHandleQuery (query.getQID())) + if (!canHandle (query)) throw lumiera::error::Invalid ("unable to resolve this kind of query"); ////TICKET #197 return dispatcher_->handle(query); diff --git a/src/proc/mobject/session/query-resolver.hpp b/src/proc/mobject/session/query-resolver.hpp index 07808a3bf..5b979a315 100644 --- a/src/proc/mobject/session/query-resolver.hpp +++ b/src/proc/mobject/session/query-resolver.hpp @@ -259,6 +259,8 @@ namespace session { */ PReso issue (Goal const& query) const; + bool canHandle (Goal const&) const; + protected: /* ===== API for concrete query resolvers ===== */ @@ -295,5 +297,12 @@ namespace session { } + inline bool + QueryResolver::canHandle(Goal const& query) + { + return canHandleQuery (query.getQID()); + } + + }} // namespace mobject::session #endif diff --git a/src/proc/mobject/session/session-impl.hpp b/src/proc/mobject/session/session-impl.hpp index c757c9c44..c120251cc 100644 --- a/src/proc/mobject/session/session-impl.hpp +++ b/src/proc/mobject/session/session-impl.hpp @@ -138,12 +138,18 @@ namespace session { : IMPL { QueryResolver& - getResolver() + getScopeQueryResolver() { UNIMPLEMENTED ("how actually to manage the PlacementIndexQueryResolver wrapper instance"); // return IMPL::magic_; } + + PlacementMO& + getScopeRoot() + { + return IMPL::getPlacementIndex()->getRoot(); + } }; diff --git a/src/proc/mobject/session/session-service-explore-scope.hpp b/src/proc/mobject/session/session-service-explore-scope.hpp index 356a29a29..f3ef6829b 100644 --- a/src/proc/mobject/session/session-service-explore-scope.hpp +++ b/src/proc/mobject/session/session-service-explore-scope.hpp @@ -46,6 +46,7 @@ #ifndef MOBJECT_SESSION_SESSION_SERVICE_EXPLORE_SCOPE_H #define MOBJECT_SESSION_SESSION_SERVICE_EXPLORE_SCOPE_H +#include "proc/mobject/placement.hpp" #include "proc/mobject/session/query-resolver.hpp" //#include "lib/meta/generator.hpp" @@ -62,7 +63,9 @@ namespace session { struct SessionServiceExploreScope { - static QueryResolver& getResolver(); + static QueryResolver const& getResolver(); + + static PlacementMO& getScopeRoot(); }; diff --git a/src/proc/mobject/session/session-services.cpp b/src/proc/mobject/session/session-services.cpp index c0128ae38..87392fe55 100644 --- a/src/proc/mobject/session/session-services.cpp +++ b/src/proc/mobject/session/session-services.cpp @@ -67,9 +67,23 @@ namespace session { { return SessionImplAPI::current->reset_PlacementIndex (alternativeIndex); } - + /** */ + QueryResolver const& + SessionServiceExploreScope::getResolver() + { + return SessionImplAPI::current->getScopeQueryResolver(); + } + + + /** */ + PlacementMO& + SessionServiceExploreScope::getScopeRoot() + { + return SessionImplAPI::current->getScopeRoot(); + } + }} // namespace mobject::session diff --git a/tests/components/proc/mobject/session/placement-index-query-test.cpp b/tests/components/proc/mobject/session/placement-index-query-test.cpp index f77b270dc..f2d674af1 100644 --- a/tests/components/proc/mobject/session/placement-index-query-test.cpp +++ b/tests/components/proc/mobject/session/placement-index-query-test.cpp @@ -24,6 +24,7 @@ #include "lib/test/run.hpp" #include "proc/mobject/session/query-resolver.hpp" #include "proc/mobject/session/scope-query.hpp" +#include "proc/mobject/session/session-service-explore-scope.hpp" #include "proc/mobject/session/placement-index-query-resolver.hpp" #include "proc/mobject/session/test-scopes.hpp" #include "lib/util.hpp" @@ -59,19 +60,26 @@ namespace test { virtual void run (Arg) { - checkQueryResolverWrapper(); + checkQueryResolver(); checkQueryOperations(); } void - checkQueryResolverWrapper() + checkQueryResolver() { PPIdx index = build_testScopes(); - QueryResolver const& resolver1 (*index); - QueryResolver const& resolver2 (*index); + QueryResolver const& resolver1 (SessionServiceExploreScope::getResolver()); + QueryResolver const& resolver2 (SessionServiceExploreScope::getResolver()); ASSERT (isSameObject (resolver1, resolver2)); - index = build_testScopes(); + + PlacementMO& root1 = index->getRoot(); + PlacementMO& root2 = SessionServiceExploreScope::getScopeRoot(); + ASSERT (isSameObject (root1, root2)); + + PlacementMO& elm1 = *ContentsQuery(resolver1,root1); +// PlacementMO& elm2 = index->getReferrers(root1); //////////////TODO: interface for low level enumeration + ASSERT (isSameObject (elm1, elm2)); } void @@ -80,11 +88,12 @@ namespace test { #if false //////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #384 !!!!!!!!! // Prepare an (test)Index (dummy "session") PPIdx index = build_testScopes(); + PlacementMO& root = index->getRoot(); PlacementIndexQueryResolver resolver(index); - discover (ContentsQuery (resolver)); + discover (ContentsQuery (resolver,root)); - PlacementMO& elm = *ContentsQuery(resolver); + PlacementMO& elm = *ContentsQuery(resolver,root); discover (PathQuery(resolver,elm)); #endif ////////////////////////////////////////////////////////////////////////////////////////TODO lots of things unimplemented.....!!!!! diff --git a/tests/components/proc/mobject/session/scope-query-test.cpp b/tests/components/proc/mobject/session/scope-query-test.cpp index b360e6457..5714eafeb 100644 --- a/tests/components/proc/mobject/session/scope-query-test.cpp +++ b/tests/components/proc/mobject/session/scope-query-test.cpp @@ -22,7 +22,7 @@ #include "lib/test/run.hpp" -#include "proc/mobject/session/query-resolver.hpp" +#include "proc/mobject/session/session-service-explore-scope.hpp" #include "proc/mobject/session/scope-query.hpp" #include "proc/mobject/session/test-scopes.hpp" //#include "lib/util.hpp" @@ -62,9 +62,10 @@ namespace test { run (Arg) { // Prepare an (test)Index (dummy "session") - PPIdx index = build_testScopes(); - PlacementMO& scope (index->getRoot()); - QueryResolver const& resolver (*index); + build_testScopes(); + + QueryResolver const& resolver = SessionServiceExploreScope::getResolver(); + PlacementMO const& scope = SessionServiceExploreScope::getScopeRoot(); discover (ScopeQuery (resolver,scope, "contents")); discover (ScopeQuery (resolver,scope, "contents"));