summaryrefslogtreecommitdiffstats
path: root/common/domainadaptor.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-20 17:46:10 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-21 09:18:50 +0200
commit0c1f6da51631c0a573a44e2f93eb4012d52dfe5c (patch)
treecf3cd3bec9fabd44a7107f47e7b0b057880ecb61 /common/domainadaptor.h
parent9a03eb1a54c6289773bc1b8eb96181ed01553927 (diff)
downloadsink-0c1f6da51631c0a573a44e2f93eb4012d52dfe5c.tar.gz
sink-0c1f6da51631c0a573a44e2f93eb4012d52dfe5c.zip
Get access to properties in indexes.
Diffstat (limited to 'common/domainadaptor.h')
-rw-r--r--common/domainadaptor.h52
1 files changed, 49 insertions, 3 deletions
diff --git a/common/domainadaptor.h b/common/domainadaptor.h
index 0eb90b3..0f5bdc7 100644
--- a/common/domainadaptor.h
+++ b/common/domainadaptor.h
@@ -83,6 +83,42 @@ static void createBufferPartBuffer(const Sink::ApplicationDomain::ApplicationDom
83 } 83 }
84} 84}
85 85
86class IndexPropertyMapper
87{
88public:
89 typedef std::function<QVariant(TypeIndex &index, const Sink::ApplicationDomain::BufferAdaptor &adaptor)> Accessor;
90 virtual ~IndexPropertyMapper(){};
91
92 virtual QVariant getProperty(const QByteArray &key, TypeIndex &index, const Sink::ApplicationDomain::BufferAdaptor &adaptor) const
93 {
94 auto accessor = mReadAccessors.value(key);
95 Q_ASSERT(accessor);
96 if (!accessor) {
97 return QVariant();
98 }
99 return accessor(index, adaptor);
100 }
101
102 bool hasMapping(const QByteArray &key) const
103 {
104 return mReadAccessors.contains(key);
105 }
106
107 QList<QByteArray> availableProperties() const
108 {
109 return mReadAccessors.keys();
110 }
111
112 template<typename Property>
113 void addIndexLookupProperty(const Accessor &accessor)
114 {
115 mReadAccessors.insert(Property::name, accessor);
116 }
117
118private:
119 QHash<QByteArray, Accessor> mReadAccessors;
120};
121
86/** 122/**
87 * A generic adaptor implementation that uses a property mapper to read/write values. 123 * A generic adaptor implementation that uses a property mapper to read/write values.
88 */ 124 */
@@ -107,6 +143,8 @@ public:
107 return mResourceMapper->getProperty(key, mResourceBuffer); 143 return mResourceMapper->getProperty(key, mResourceBuffer);
108 } else if (mLocalBuffer && mLocalMapper->hasMapping(key)) { 144 } else if (mLocalBuffer && mLocalMapper->hasMapping(key)) {
109 return mLocalMapper->getProperty(key, mLocalBuffer); 145 return mLocalMapper->getProperty(key, mLocalBuffer);
146 } else if (mIndex && mIndexMapper->hasMapping(key)) {
147 return mIndexMapper->getProperty(key, *mIndex, *this);
110 } 148 }
111 SinkWarning() << "No mapping available for key " << key << mLocalBuffer << mResourceBuffer; 149 SinkWarning() << "No mapping available for key " << key << mLocalBuffer << mResourceBuffer;
112 return QVariant(); 150 return QVariant();
@@ -117,13 +155,15 @@ public:
117 */ 155 */
118 virtual QList<QByteArray> availableProperties() const Q_DECL_OVERRIDE 156 virtual QList<QByteArray> availableProperties() const Q_DECL_OVERRIDE
119 { 157 {
120 return mResourceMapper->availableProperties() + mLocalMapper->availableProperties(); 158 return mResourceMapper->availableProperties() + mLocalMapper->availableProperties() + mIndexMapper->availableProperties();
121 } 159 }
122 160
123 LocalBuffer const *mLocalBuffer; 161 LocalBuffer const *mLocalBuffer;
124 ResourceBuffer const *mResourceBuffer; 162 ResourceBuffer const *mResourceBuffer;
125 QSharedPointer<ReadPropertyMapper<LocalBuffer>> mLocalMapper; 163 QSharedPointer<ReadPropertyMapper<LocalBuffer>> mLocalMapper;
126 QSharedPointer<ReadPropertyMapper<ResourceBuffer>> mResourceMapper; 164 QSharedPointer<ReadPropertyMapper<ResourceBuffer>> mResourceMapper;
165 QSharedPointer<IndexPropertyMapper> mIndexMapper;
166 TypeIndex *mIndex;
127}; 167};
128 168
129/** 169/**
@@ -142,11 +182,14 @@ public:
142 : mLocalMapper(QSharedPointer<ReadPropertyMapper<LocalBuffer>>::create()), 182 : mLocalMapper(QSharedPointer<ReadPropertyMapper<LocalBuffer>>::create()),
143 mResourceMapper(QSharedPointer<ReadPropertyMapper<ResourceBuffer>>::create()), 183 mResourceMapper(QSharedPointer<ReadPropertyMapper<ResourceBuffer>>::create()),
144 mLocalWriteMapper(QSharedPointer<WritePropertyMapper<LocalBuilder>>::create()), 184 mLocalWriteMapper(QSharedPointer<WritePropertyMapper<LocalBuilder>>::create()),
145 mResourceWriteMapper(QSharedPointer<WritePropertyMapper<ResourceBuilder>>::create()) 185 mResourceWriteMapper(QSharedPointer<WritePropertyMapper<ResourceBuilder>>::create()),
186 mIndexMapper(QSharedPointer<IndexPropertyMapper>::create())
146 { 187 {
147 Sink::ApplicationDomain::TypeImplementation<DomainType>::configure(*mLocalMapper); 188 Sink::ApplicationDomain::TypeImplementation<DomainType>::configure(*mLocalMapper);
148 Sink::ApplicationDomain::TypeImplementation<DomainType>::configure(*mLocalWriteMapper); 189 Sink::ApplicationDomain::TypeImplementation<DomainType>::configure(*mLocalWriteMapper);
190 Sink::ApplicationDomain::TypeImplementation<DomainType>::configure(*mIndexMapper);
149 } 191 }
192
150 virtual ~DomainTypeAdaptorFactory(){}; 193 virtual ~DomainTypeAdaptorFactory(){};
151 194
152 /** 195 /**
@@ -154,13 +197,15 @@ public:
154 * 197 *
155 * This returns by default a DatastoreBufferAdaptor initialized with the corresponding property mappers. 198 * This returns by default a DatastoreBufferAdaptor initialized with the corresponding property mappers.
156 */ 199 */
157 virtual QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> createAdaptor(const Sink::Entity &entity) Q_DECL_OVERRIDE 200 virtual QSharedPointer<Sink::ApplicationDomain::BufferAdaptor> createAdaptor(const Sink::Entity &entity, TypeIndex *index = nullptr) Q_DECL_OVERRIDE
158 { 201 {
159 auto adaptor = QSharedPointer<DatastoreBufferAdaptor<LocalBuffer, ResourceBuffer>>::create(); 202 auto adaptor = QSharedPointer<DatastoreBufferAdaptor<LocalBuffer, ResourceBuffer>>::create();
160 adaptor->mLocalBuffer = Sink::EntityBuffer::readBuffer<LocalBuffer>(entity.local()); 203 adaptor->mLocalBuffer = Sink::EntityBuffer::readBuffer<LocalBuffer>(entity.local());
161 adaptor->mLocalMapper = mLocalMapper; 204 adaptor->mLocalMapper = mLocalMapper;
162 adaptor->mResourceBuffer = Sink::EntityBuffer::readBuffer<ResourceBuffer>(entity.resource()); 205 adaptor->mResourceBuffer = Sink::EntityBuffer::readBuffer<ResourceBuffer>(entity.resource());
163 adaptor->mResourceMapper = mResourceMapper; 206 adaptor->mResourceMapper = mResourceMapper;
207 adaptor->mIndexMapper = mIndexMapper;
208 adaptor->mIndex = index;
164 return adaptor; 209 return adaptor;
165 } 210 }
166 211
@@ -198,4 +243,5 @@ protected:
198 QSharedPointer<ReadPropertyMapper<ResourceBuffer>> mResourceMapper; 243 QSharedPointer<ReadPropertyMapper<ResourceBuffer>> mResourceMapper;
199 QSharedPointer<WritePropertyMapper<LocalBuilder>> mLocalWriteMapper; 244 QSharedPointer<WritePropertyMapper<LocalBuilder>> mLocalWriteMapper;
200 QSharedPointer<WritePropertyMapper<ResourceBuilder>> mResourceWriteMapper; 245 QSharedPointer<WritePropertyMapper<ResourceBuilder>> mResourceWriteMapper;
246 QSharedPointer<IndexPropertyMapper> mIndexMapper;
201}; 247};