summaryrefslogtreecommitdiffstats
path: root/sinksh/sinksh_utils.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-01-07 17:56:30 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-01-07 17:56:30 +0100
commit35a3afc591c85999de856c21dbb493e341951d91 (patch)
treef46b6a8c22e5bdb283148e48e0391c2691bcc343 /sinksh/sinksh_utils.cpp
parent470203f1c09fa1811ae2859520c168901d5fa6cd (diff)
downloadsink-35a3afc591c85999de856c21dbb493e341951d91.tar.gz
sink-35a3afc591c85999de856c21dbb493e341951d91.zip
Share query syntax
Diffstat (limited to 'sinksh/sinksh_utils.cpp')
-rw-r--r--sinksh/sinksh_utils.cpp63
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
148bool isId(const QByteArray &value)
149{
150 return value.startsWith("{");
151}
152
153bool 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
205bool applyFilter(Sink::Query &query, const SyntaxTree::Options &options)
206{
207 return applyFilter(query, options.positionalArguments);
208}
209
147} 210}