[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [sink/develop] /: Filter resources by the types they support.
From:       Christian Mollekopf <null () kde ! org>
Date:       2017-03-01 0:05:14
Message-ID: E1cirla-0006pa-Cl () code ! kde ! org
[Download RAW message or body]

Git commit c08c329580a6f5e5da1ebba931461e7e7e47ba72 by Christian Mollekopf.
Committed on 01/03/2017 at 00:05.
Pushed by cmollekopf into branch 'develop'.

Filter resources by the types they support.

This avoid uselessly querying resources only to discover that they don't
have a facade for the type.

M  +2    -0    common/domain/applicationdomaintype.h
M  +10   -3    common/store.cpp
M  +7    -1    examples/dummyresource/resourcefactory.cpp
M  +3    -1    examples/imapresource/imapresource.cpp
M  +3    -1    examples/maildirresource/maildirresource.cpp
M  +5    -1    examples/mailtransportresource/mailtransportresource.cpp
M  +26   -26   tests/clientapitest.cpp

https://commits.kde.org/sink/c08c329580a6f5e5da1ebba931461e7e7e47ba72

diff --git a/common/domain/applicationdomaintype.h \
b/common/domain/applicationdomaintype.h index fee6344..be04db9 100644
--- a/common/domain/applicationdomaintype.h
+++ b/common/domain/applicationdomaintype.h
@@ -418,6 +418,8 @@ struct SINK_EXPORT ImapResource {
 
 namespace ResourceCapabilities {
 namespace Mail {
+    static constexpr const char *mail = "mail";
+    static constexpr const char *folder = "folder";
     static constexpr const char *storage = "mail.storage";
     static constexpr const char *drafts = "mail.drafts";
     static constexpr const char *sent = "mail.sent";
diff --git a/common/store.cpp b/common/store.cpp
index 9550d3e..1c8620b 100644
--- a/common/store.cpp
+++ b/common/store.cpp
@@ -96,14 +96,21 @@ QPair<typename AggregatingResultEmitter<typename \
DomainType::Ptr>::Ptr,  typenam  SinkTraceCtx(ctx) << "Listening for new resources.";
             resourceQuery.setFlags(Query::LiveQuery);
         }
-        resourceQuery.setFilter(query.getResourceFilter());
+
+        //Filter resources by available content types (unless the query already \
specifies a capability filter) +        auto resourceFilter = \
query.getResourceFilter(); +        if \
(!resourceFilter.propertyFilter.contains(ApplicationDomain::SinkResource::Capabilities::name)) \
{ +            resourceFilter.propertyFilter.insert(ApplicationDomain::SinkResource::Capabilities::name, \
Query::Comparator{ApplicationDomain::getTypeName<DomainType>(), \
Query::Comparator::Contains}); +        }
+        resourceQuery.setFilter(resourceFilter);
+
         auto result = facade->load(resourceQuery, resourceCtx);
         auto emitter = result.second;
-        emitter->onAdded([query, aggregatingEmitter, resourceCtx](const \
ApplicationDomain::SinkResource::Ptr &resource) { +        emitter->onAdded([=](const \
                ApplicationDomain::SinkResource::Ptr &resource) {
             SinkTraceCtx(resourceCtx) << "Found new resources: " << \
                resource->identifier();
             const auto resourceType = \
ResourceConfig::getResourceType(resource->identifier());  \
                Q_ASSERT(!resourceType.isEmpty());
-            queryResource<DomainType>(resourceType, resource->identifier(), query, \
aggregatingEmitter, resourceCtx).exec(); +            \
queryResource<DomainType>(resourceType, resource->identifier(), query, \
aggregatingEmitter, ctx).exec();  });
         emitter->onModified([](const ApplicationDomain::SinkResource::Ptr &) {
         });
diff --git a/examples/dummyresource/resourcefactory.cpp \
b/examples/dummyresource/resourcefactory.cpp index 0663bdb..a7d30c5 100644
--- a/examples/dummyresource/resourcefactory.cpp
+++ b/examples/dummyresource/resourcefactory.cpp
@@ -176,7 +176,13 @@ DummyResource::~DummyResource()
 }
 
 DummyResourceFactory::DummyResourceFactory(QObject *parent)
-    : Sink::ResourceFactory(parent, QByteArrayList() << \
Sink::ApplicationDomain::ResourceCapabilities::Mail::storage << "-folder.rename" << \
Sink::ApplicationDomain::ResourceCapabilities::Mail::sent) +    : \
Sink::ResourceFactory(parent, \
{Sink::ApplicationDomain::ResourceCapabilities::Mail::mail, +            "event",
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::folder,
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::storage,
+            "-folder.rename",
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::sent}
+            )
 {
 
 }
diff --git a/examples/imapresource/imapresource.cpp \
b/examples/imapresource/imapresource.cpp index 5bf0c30..09f57d5 100644
--- a/examples/imapresource/imapresource.cpp
+++ b/examples/imapresource/imapresource.cpp
@@ -879,7 +879,9 @@ ImapResource::ImapResource(const ResourceContext \
&resourceContext)  
 ImapResourceFactory::ImapResourceFactory(QObject *parent)
     : Sink::ResourceFactory(parent,
-            {Sink::ApplicationDomain::ResourceCapabilities::Mail::storage,
+            {Sink::ApplicationDomain::ResourceCapabilities::Mail::mail,
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::folder,
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::storage,
             Sink::ApplicationDomain::ResourceCapabilities::Mail::drafts,
             Sink::ApplicationDomain::ResourceCapabilities::Mail::folderhierarchy,
             Sink::ApplicationDomain::ResourceCapabilities::Mail::trash,
diff --git a/examples/maildirresource/maildirresource.cpp \
b/examples/maildirresource/maildirresource.cpp index 3d299b4..813d84f 100644
--- a/examples/maildirresource/maildirresource.cpp
+++ b/examples/maildirresource/maildirresource.cpp
@@ -572,7 +572,9 @@ MaildirResource::MaildirResource(const Sink::ResourceContext \
&resourceContext)  
 MaildirResourceFactory::MaildirResourceFactory(QObject *parent)
     : Sink::ResourceFactory(parent,
-            {Sink::ApplicationDomain::ResourceCapabilities::Mail::storage,
+            {Sink::ApplicationDomain::ResourceCapabilities::Mail::mail,
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::folder,
+            Sink::ApplicationDomain::ResourceCapabilities::Mail::storage,
             Sink::ApplicationDomain::ResourceCapabilities::Mail::drafts,
             "-folder.rename",
             Sink::ApplicationDomain::ResourceCapabilities::Mail::trash,
diff --git a/examples/mailtransportresource/mailtransportresource.cpp \
b/examples/mailtransportresource/mailtransportresource.cpp index 0118140..88a90c6 \
                100644
--- a/examples/mailtransportresource/mailtransportresource.cpp
+++ b/examples/mailtransportresource/mailtransportresource.cpp
@@ -91,6 +91,9 @@ public:
             modifiedMail.setSent(true);
 
             auto resource = \
Store::readOne<ApplicationDomain::SinkResource>(Query{}.filter(mResourceInstanceIdentifier).request<ApplicationDomain::SinkResource::Account>());
 +            if (resource.identifier().isEmpty()) {
+                SinkWarning() << "Failed to retrieve target resource: " << \
mResourceInstanceIdentifier; +            }
             //Then copy the mail to the target resource
             Query query;
             query.containsFilter<ApplicationDomain::SinkResource::Capabilities>(ApplicationDomain::ResourceCapabilities::Mail::sent);
 @@ -193,7 +196,8 @@ MailtransportResource::MailtransportResource(const \
Sink::ResourceContext &resour  }
 
 MailtransportResourceFactory::MailtransportResourceFactory(QObject *parent)
-    : Sink::ResourceFactory(parent, \
{Sink::ApplicationDomain::ResourceCapabilities::Mail::transport}) +    : \
Sink::ResourceFactory(parent, \
{Sink::ApplicationDomain::ResourceCapabilities::Mail::mail, +            \
Sink::ApplicationDomain::ResourceCapabilities::Mail::transport})  {
 
 }
diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp
index ea72ae0..008b408 100644
--- a/tests/clientapitest.cpp
+++ b/tests/clientapitest.cpp
@@ -122,6 +122,18 @@ public:
 class ClientAPITest : public QObject
 {
     Q_OBJECT
+
+    template<typename T>
+    std::shared_ptr<TestDummyResourceFacade<T> >  setupFacade(const QByteArray \
&identifier) +    {
+        auto facade = TestDummyResourceFacade<T>::registerFacade(identifier);
+        ResourceConfig::addResource(identifier, "dummyresource");
+        QMap<QByteArray, QVariant> config = \
ResourceConfig::getConfiguration(identifier); +        \
config.insert(Sink::ApplicationDomain::SinkResource::Capabilities::name, \
QVariant::fromValue(QByteArrayList() << Sink::ApplicationDomain::getTypeName<T>())); \
+        ResourceConfig::configureResource(identifier, config); +        return \
facade; +    }
+
 private slots:
 
     void initTestCase()
@@ -133,9 +145,8 @@ private slots:
 
     void testLoad()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1"); \
facade->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("resource", \
                "id", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         Sink::Query query;
         query.resourceFilter("dummyresource.instance1");
@@ -156,9 +167,8 @@ private slots:
 
     void testModelSingle()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Folder>("dummyresource.instance1");
  facade->results << \
QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         Sink::Query query;
         query.resourceFilter("dummyresource.instance1");
@@ -169,12 +179,11 @@ private slots:
 
     void testModelNested()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Folder>("dummyresource.instance1");
  auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", \
"id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", \
"subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
subfolder->setParent("id");  facade->results << folder << subfolder;
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         // Test
         Sink::Query query;
@@ -191,12 +200,11 @@ private slots:
 
     void testModelSignals()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Folder>("dummyresource.instance1");
  auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", \
"id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", \
"subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
subfolder->setParent("id");  facade->results << folder << subfolder;
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         // Test
         Sink::Query query;
@@ -212,13 +220,12 @@ private slots:
 
     void testModelNestedLive()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Folder>("dummyresource.instance1");
  auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", \
"id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
auto subfolder =  QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", \
"subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
subfolder->setParent("id");  facade->results << folder << subfolder;
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         // Test
         Sink::Query query;
@@ -266,12 +273,10 @@ private slots:
 
     void testLoadMultiResource()
     {
-        auto facade1 = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade("dummyresource.instance1");
 +        auto facade1 = \
setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1");  \
facade1->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("resource1", \
                "id", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        auto facade2 = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade("dummyresource.instance2");
 +        auto facade2 = \
setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance2");  \
facade2->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("resource2", \
                "id", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
-        ResourceConfig::addResource("dummyresource.instance2", "dummyresource");
 
         Sink::Query query;
 
@@ -291,9 +296,8 @@ private slots:
 
     void testImperativeLoad()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1"); \
facade->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("resource", \
                "id", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         Sink::Query query;
         query.resourceFilter("dummyresource.instance1");
@@ -309,16 +313,15 @@ private slots:
 
     void testMultiresourceIncrementalLoad()
     {
-        auto facade1 = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade("dummyresource.instance1");
 +        auto facade1 = \
setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1");  for (int i = \
0; i < 4; i++) {  facade1->results << \
QSharedPointer<Sink::ApplicationDomain::Event>::create("resource1", "id" + \
QByteArray::number(i), 0, \
QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  }
-        auto facade2 = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade("dummyresource.instance2");
 +
+        auto facade2 = \
setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance2");  for (int i = \
0; i < 6; i++) {  facade2->results << \
QSharedPointer<Sink::ApplicationDomain::Event>::create("resource2", "id" + \
QByteArray::number(i), 0, \
QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  }
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
-        ResourceConfig::addResource("dummyresource.instance2", "dummyresource");
 
         Sink::Query query;
         query.limit(2);
@@ -344,8 +347,7 @@ private slots:
 
     void testCreateModifyDelete()
     {
-        auto facade = \
                TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade();
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
+        auto facade = \
setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1");  
         auto event = \
Sink::ApplicationDomain::Event::createEntity<Sink::ApplicationDomain::Event>("dummyresource.instance1");
  Sink::Store::create(event).exec().waitForFinished();
@@ -358,10 +360,9 @@ private slots:
     }
     void testMultiModify()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Event>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Event>("dummyresource.instance1"); \
facade->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("dummyresource.instance1", \
"id1", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  \
facade->results << QSharedPointer<Sink::ApplicationDomain::Event>::create("dummyresource.instance1", \
                "id2", 0, \
                QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
                
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         Sink::Query query;
         query.resourceFilter("dummyresource.instance1");
@@ -377,12 +378,11 @@ private slots:
 
     void testModelStress()
     {
-        auto facade = \
TestDummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); +        \
auto facade = setupFacade<Sink::ApplicationDomain::Folder>("dummyresource.instance1");
  facade->runAsync = true;
         for (int i = 0; i < 100; i++) {
             facade->results << \
QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id" + \
QByteArray::number(i), 0, \
QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());  }
-        ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
 
         Sink::Query query;
         query.resourceFilter("dummyresource.instance1");


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic