diff --git a/src/A3t.cpp b/src/A3t.cpp index 410202559..56860290b 100644 --- a/src/A3t.cpp +++ b/src/A3t.cpp @@ -1306,10 +1306,49 @@ void A3t::findPlainArgs () //////////////////////////////////////////////////////////////////////////////// void A3t::findMissingOperators () { -/* - while (insertMissingOperators ()) + while (insertOr ()) ; -*/ + + while (insertAnd ()) + ; +} + +//////////////////////////////////////////////////////////////////////////////// +// Two consecutive ID/UUID arguments get an 'or' inserted between them. +bool A3t::insertOr () +{ + std::vector ::iterator prev = _tree->_branches.begin (); + std::vector ::iterator i; + for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) + { + // Parser override operator. + if ((*i)->attribute ("raw") == "--") + break; + + // Skip known args. + if ((*i)->hasTag ("?")) + continue; + + if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO")) + { + if (prev != _tree->_branches.begin () && + ((*prev)->hasTag ("ID") || (*prev)->hasTag ("UUID")) && + ((*i)->hasTag ("ID") || (*i)->hasTag ("UUID"))) + { + Tree* branch = new Tree ("argOp"); + branch->attribute ("raw", "or"); + branch->tag ("OP"); + branch->tag ("FILTER"); + + _tree->_branches.insert (i, branch); + return true; + } + } + + prev = i; + } + + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -1321,7 +1360,7 @@ void A3t::findMissingOperators () // ) ( --> ) and ( // --> and // -bool A3t::insertMissingOperators () +bool A3t::insertAnd () { std::vector ::iterator prev = _tree->_branches.begin (); std::vector ::iterator i; @@ -1352,6 +1391,7 @@ bool A3t::insertMissingOperators () Tree* branch = new Tree ("argOp"); branch->attribute ("raw", "and"); branch->tag ("OP"); + branch->tag ("FILTER"); (*i)->_branches.insert (sub, branch); return true; } @@ -1379,6 +1419,7 @@ bool A3t::insertMissingOperators () Tree* branch = new Tree ("argOp"); branch->attribute ("raw", "and"); branch->tag ("OP"); + branch->tag ("FILTER"); _tree->_branches.insert (i, branch); return true; } diff --git a/src/A3t.h b/src/A3t.h index e03c067d4..13aa7e212 100644 --- a/src/A3t.h +++ b/src/A3t.h @@ -73,7 +73,8 @@ private: void findModifications (); void findPlainArgs (); void findMissingOperators (); - bool insertMissingOperators (); + bool insertOr (); + bool insertAnd (); void validate (); private: