diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-07 17:56:30 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-07 17:56:30 +0100 |
commit | 35a3afc591c85999de856c21dbb493e341951d91 (patch) | |
tree | f46b6a8c22e5bdb283148e48e0391c2691bcc343 /sinksh/sinksh_utils.cpp | |
parent | 470203f1c09fa1811ae2859520c168901d5fa6cd (diff) | |
download | sink-35a3afc591c85999de856c21dbb493e341951d91.tar.gz sink-35a3afc591c85999de856c21dbb493e341951d91.zip |
Share query syntax
Diffstat (limited to 'sinksh/sinksh_utils.cpp')
-rw-r--r-- | sinksh/sinksh_utils.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/sinksh/sinksh_utils.cpp b/sinksh/sinksh_utils.cpp index 82bd6c1..71a47b1 100644 --- a/sinksh/sinksh_utils.cpp +++ b/sinksh/sinksh_utils.cpp | |||
@@ -144,4 +144,67 @@ QMap<QString, QString> keyValueMapFromArgs(const QStringList &args) | |||
144 | } | 144 | } |
145 | return map; | 145 | return map; |
146 | } | 146 | } |
147 | |||
148 | bool isId(const QByteArray &value) | ||
149 | { | ||
150 | return value.startsWith("{"); | ||
151 | } | ||
152 | |||
153 | bool applyFilter(Sink::Query &query, const QStringList &args_) | ||
154 | { | ||
155 | if (args_.isEmpty()) { | ||
156 | return false; | ||
157 | } | ||
158 | auto args = args_; | ||
159 | |||
160 | auto type = args.takeFirst(); | ||
161 | |||
162 | if ((type.isEmpty() || !SinkshUtils::isValidStoreType(type)) && type != "*") { | ||
163 | qWarning() << "Unknown type: " << type; | ||
164 | return false; | ||
165 | } | ||
166 | if (type != "*") { | ||
167 | query.setType(type.toUtf8()); | ||
168 | } | ||
169 | if (!args.isEmpty()) { | ||
170 | auto resource = args.takeFirst().toLatin1(); | ||
171 | |||
172 | if (resource.contains('/')) { | ||
173 | //The resource isn't an id but a path | ||
174 | auto list = resource.split('/'); | ||
175 | const auto resourceId = list.takeFirst(); | ||
176 | query.resourceFilter(resourceId); | ||
177 | if (type == Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Mail>() && !list.isEmpty()) { | ||
178 | auto value = list.takeFirst(); | ||
179 | if (isId(value)) { | ||
180 | query.filter<Sink::ApplicationDomain::Mail::Folder>(value); | ||
181 | } else { | ||
182 | Sink::Query folderQuery; | ||
183 | folderQuery.resourceFilter(resourceId); | ||
184 | folderQuery.filter<Sink::ApplicationDomain::Folder::Name>(value); | ||
185 | folderQuery.filter<Sink::ApplicationDomain::Folder::Parent>(QVariant()); | ||
186 | auto folders = Sink::Store::read<Sink::ApplicationDomain::Folder>(folderQuery); | ||
187 | if (folders.size() == 1) { | ||
188 | query.filter<Sink::ApplicationDomain::Mail::Folder>(folders.first()); | ||
189 | } else { | ||
190 | qWarning() << "Folder name did not match uniquely: " << folders.size(); | ||
191 | for (const auto &f : folders) { | ||
192 | qWarning() << f.getName(); | ||
193 | } | ||
194 | return false; | ||
195 | } | ||
196 | } | ||
197 | } | ||
198 | } else { | ||
199 | query.resourceFilter(resource); | ||
200 | } | ||
201 | } | ||
202 | return true; | ||
203 | } | ||
204 | |||
205 | bool applyFilter(Sink::Query &query, const SyntaxTree::Options &options) | ||
206 | { | ||
207 | return applyFilter(query, options.positionalArguments); | ||
208 | } | ||
209 | |||
147 | } | 210 | } |