@@ -212,6 +212,7 @@ parse_logop(const Store& store, Xapian::Query::op op, Sexp&& args, Mu::ParserFla
212212
213213 switch (op) {
214214 case Xapian::Query::OP_AND_NOT:
215+ // TODO: optimize AND_NOT
215216 if (qs.size () != 1 )
216217 return Err (Error::Code::InvalidArgument,
217218 " expected single argument for NOT" );
@@ -328,7 +329,7 @@ parse(const Store& store, Sexp&& s, Mu::ParserFlags flags)
328329 return Err (Error::Code::InvalidArgument, " unexpected sexp {}" , s.to_string ());
329330}
330331
331- /* LCOV_EXCL_START */
332+ /* LCOV_EXCL_START*/
332333// parse the way Xapian's internal parser does it; for testing.
333334static Xapian::Query
334335xapian_query_classic (const std::string& expr, Mu::ParserFlags flags)
@@ -363,7 +364,7 @@ xapian_query_classic(const std::string& expr, Mu::ParserFlags flags)
363364 xqp.set_default_op (Xapian::Query::OP_AND);
364365 return xqp.parse_query (expr, xflags);
365366}
366- /* LCOV_EXCL_STOP */
367+ /* LCOV_EXCL_STOP*/
367368
368369Result<Xapian::Query>
369370Mu::make_xapian_query (const Store& store, const std::string& expr, Mu::ParserFlags flags) noexcept
@@ -399,10 +400,18 @@ main (int argc, char *argv[])
399400 if (auto && query{make_xapian_query (*store, expr)}; !query) {
400401 mu_printerrln (" error: {}" , query.error ());
401402 return 1 ;
402- } else {
403- mu_println (" {}" , query->get_description ());
404- return 0 ;
405- }
403+ } else
404+ mu_println (" mu: {}" , query->get_description ());
405+
406+ if (auto && query{make_xapian_query (*store, expr, ParserFlags::XapianParser)}; !query) {
407+ mu_printerrln (" error: {}" , query.error ());
408+ return 2 ;
409+ } else
410+ mu_println (" xp: {}" , query->get_description ());
411+
412+ return 0 ;
413+
414+
406415}
407416#endif /* BUILD_XAPIANIZE_QUERY*/
408417
@@ -416,6 +425,25 @@ main (int argc, char *argv[])
416425
417426using TestCase = std::pair<std::string, std::string>;
418427
428+ static void
429+ test_sexp ()
430+ {
431+ /* tail */
432+ g_assert_false (!!tail (Sexp{}));
433+ auto t = tail (Sexp{1 ,2 ,3 });
434+ g_assert_true (!!t && t->listp () && t->size () == 2 );
435+
436+ /* head_symbol */
437+ g_assert_false (!!head_symbol (Sexp{}));
438+ assert_equal (head_symbol (Sexp{" foo" _sym, 1 , 2 }).value_or (" bar" ), " foo" );
439+
440+ /* string_nth */
441+ g_assert_false (!!string_nth (Sexp{}, 123 ));
442+ g_assert_false (!!string_nth (Sexp{1 , 2 , 3 }, 1 ));
443+ assert_equal (string_nth (Sexp{" aap" , " noot" , " mies" }, 2 ).value_or (" wim" ), " mies" );
444+ }
445+
446+
419447static void
420448test_xapian ()
421449{
@@ -483,6 +511,8 @@ main(int argc, char* argv[])
483511 mu_test_init (&argc, &argv);
484512
485513 Xapian::QueryParser qp;
514+
515+ g_test_add_func (" /query-parser/sexp" , test_sexp);
486516 g_test_add_func (" /query-parser/xapianizer" , test_xapian);
487517
488518 return g_test_run ();
0 commit comments