213{
214 const char* fname = "OksQuery::create_expression()";
215
217
218 OksQueryExpression* qe = 0;
219
220 if (!c) {
221 Oks::error_msg(fname) <<
"Can't create query without specified class\n";
222 return qe;
223 }
224
226 Oks::error_msg(fname) <<
"Can't create query from empty string\n";
227 return qe;
228 }
229
231
232 std::list<std::string> slist;
233
236
238 break;
239
240 if (s[0] == '\"' || s[0] == '\'' || s[0] == '`') {
241 char delimiter =
s[0];
243
244 std::string::size_type p =
s.find(delimiter);
245
246 if (p == std::string::npos) {
248 << "\"\n"
249 "the delimiter is \' "
250 << delimiter
251 << " \'\n"
252 "the rest of the expression is \""
254 return qe;
255 }
256
258 slist.push_back(std::string(s, 0, p));
259
261 } else if (s[0] == '(') {
262 std::string::size_type p = 1;
263 size_t strLength =
s.length();
265
266 while (p < strLength) {
267 if (s[p] == '(')
269 if (s[p] == ')') {
271 if (!r)
272 break;
273 }
274 p++;
275 }
276
277 if (r) {
279 <<
"There is no closing \')\' for " <<
'\"' <<
s <<
"\"\n";
280 return qe;
281 }
282
285
286 slist.push_back(std::string(s, 0, p - 1));
287
289 } else {
290 std::string::size_type p = 0;
291 size_t strLength =
s.length();
292
293 while (p < strLength && s[p] != ' ')
294 p++;
295
296 slist.push_back(std::string(s, 0, p));
297
299 }
300 }
301
302 if (slist.empty()) {
303 Oks::error_msg(fname) <<
"Can't create query from empty string \"" <<
str <<
"\"\n";
304 return qe;
305 }
306
307 const std::string first = slist.front();
308 slist.pop_front();
309
311 if (slist.size() < 2) {
312 Oks::error_msg(fname) <<
"\'" << first <<
"\' must have two or more arguments: (" <<
str <<
")'\n";
313 return qe;
314 }
315
318
319 while (!slist.empty()) {
320 const std::string item2 = slist.front();
321 slist.pop_front();
322
324
325 if (qe2) {
327 ((OksAndExpression*)qe)->add(qe2);
328 else
329 ((OksOrExpression*)qe)->add(qe2);
330 }
331 }
332
333 return qe;
335 if (slist.size() != 1) {
336 Oks::error_msg(fname) <<
"\'" << first <<
"\' must have exactly one argument: (" <<
str <<
")\n";
337 return qe;
338 }
339
341
342 const std::string item2 = slist.front();
343 slist.pop_front();
344
346
347 if (qe2)
348 ((OksNotExpression*)qe)->set(qe2);
349
350 return qe;
351 } else if (slist.size() != 2) {
353 return qe;
354 } else {
355 const std::string second = slist.front();
356 slist.pop_front();
357
358 const std::string third = slist.front();
359 slist.pop_front();
360
362 OksRelationship*
r =
c->find_relationship(first);
363
364 if (!r) {
366 << "\"\n"
367 "can't find relationship \""
368 << first <<
"\" in class \"" <<
c->get_name() <<
"\"\n";
369
370 return qe;
371 }
372
373 bool b;
374
376 b = false;
378 b = true;
379 else {
381 << "\"\n"
382 "second parameter \'"
384 << "\'\n";
385 return qe;
386 }
387
388 OksClass* relc =
c->get_kernel()->find_class(
r->get_type());
389
390 if (!relc) {
392 <<
"can't find class \"" <<
r->get_type() <<
"\"\n";
393 return qe;
394 }
395
397
398 if (qe2)
400
401 return qe;
402 } else {
403 OksAttribute* a = ((first !=
OksQuery::OID) ?
c->find_attribute(first) : 0);
404
407 <<
"can't find attribute \"" << first <<
"\" in class \"" <<
c->get_name() <<
"\"\n";
408 return qe;
409 }
410
412
420 : 0);
421
422 if (a) {
426 } else {
428 d->SetValues(second.c_str(), a);
429 }
430 } else {
432 }
433
434 if (!f)
436 << "can't find comparator function \"" << third << "\"\n";
437 else
439
440 return qe;
441 }
442 }
443}
OksComparator(const OksAttribute *a, OksData *v, OksQuery::Comparator f)
OksNotExpression(OksQueryExpression *q=0)
@ fStringToQueryExpression
static bool equal_cmp(const OksData *, const OksData *)
static bool reg_exp_cmp(const OksData *, const OksData *regexp)
bool(*) Comparator(const OksData *, const OksData *)
static bool greater_cmp(const OksData *, const OksData *)
static bool less_or_equal_cmp(const OksData *, const OksData *)
static bool not_equal_cmp(const OksData *, const OksData *)
static bool greater_or_equal_cmp(const OksData *, const OksData *)
static bool less_cmp(const OksData *, const OksData *)
OksRelationshipExpression(const OksRelationship *r, OksQueryExpression *q, bool b=false)
OksString()
to deallocate memory when destroyed