diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-20 17:46:10 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-21 09:18:50 +0200 |
commit | 0c1f6da51631c0a573a44e2f93eb4012d52dfe5c (patch) | |
tree | cf3cd3bec9fabd44a7107f47e7b0b057880ecb61 /common/domainadaptor.h | |
parent | 9a03eb1a54c6289773bc1b8eb96181ed01553927 (diff) | |
download | sink-0c1f6da51631c0a573a44e2f93eb4012d52dfe5c.tar.gz sink-0c1f6da51631c0a573a44e2f93eb4012d52dfe5c.zip |
Get access to properties in indexes.
Diffstat (limited to 'common/domainadaptor.h')
-rw-r--r-- | common/domainadaptor.h | 52 |
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 | ||
86 | class IndexPropertyMapper | ||
87 | { | ||
88 | public: | ||
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 | |||
118 | private: | ||
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 | }; |