From 5aeb35663b2225406d33c6b6ffa8d0dd7f1f983a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 20 May 2014 18:29:05 -0400 Subject: [PATCH] A3t - ::getFilterExpression now has a simplified implementation. Sure, it returns bad filters, but that will change. --- src/A3t.cpp | 149 +++++++--------------------------------------------- 1 file changed, 20 insertions(+), 129 deletions(-) diff --git a/src/A3t.cpp b/src/A3t.cpp index 345dfd34e..0fce55e8e 100644 --- a/src/A3t.cpp +++ b/src/A3t.cpp @@ -529,39 +529,36 @@ const std::string A3t::getFilterExpression () { if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO")) { - if ((*i)->hasTag ("ID")) + if ((*i)->hasTag ("EXPANDED")) { - // Construct ID sequence clause. - std::vector ::iterator range; - for (range = (*i)->_branches.begin (); range != (*i)->_branches.end (); ++range) + std::vector ::iterator b; + for (b = (*i)->_branches.begin (); b != (*i)->_branches.end (); ++b) { if (sequence != "") - sequence += " or "; + sequence += " "; - std::string lower = (*range)->attribute ("min"); - std::string upper = (*range)->attribute ("max"); - - if (lower == upper) - sequence += "id == " + lower; - else - sequence += "( id >= " + lower + " and id <= " + upper + ")"; + sequence += (*b)->attribute ("value"); } } - else if ((*i)->hasTag ("UUID")) + else { - // UUIDs are compared using a partial match. - std::vector ::iterator range; - for (range = (*i)->_branches.begin (); range != (*i)->_branches.end (); ++range) - { - if (sequence != "") - sequence += " or "; - - sequence += "uuid = " + (*range)->attribute ("value"); - } + sequence += (*i)->attribute ("raw"); } } } + return sequence; + + + + + + + + + + + // Locate and extract the filter elements. std::string filter = ""; std::vector ::iterator prev = _tree->_branches.begin (); @@ -587,105 +584,10 @@ const std::string A3t::getFilterExpression () else if ((*i)->hasTag ("ID") || (*i)->hasTag ("UUID")) { - // Skipped, as they are already processed. } else if ((*i)->hasTag ("ATTMOD")) { - // name.mod:value --> name value - if (filter != "") - filter += ' '; - - std::string name = (*i)->attribute ("name"); - std::string mod = (*i)->attribute ("modifier"); - std::string value = (*i)->attribute ("value"); - std::string sense = (*i)->attribute ("sense"); // TODO Not used. Why? - - // name.before:value --> name < value - if (mod == "before" || mod == "under" || mod == "below") - { - filter += name + " < " + value; - } - - // name.after:value --> name > value - else if (mod == "after" || mod == "over" || mod == "above") - { - filter += name + " > " + value; - } - - // name.none: --> name == "" - else if (mod == "none") - { - filter += name + " == ''"; - } - - // name.any: --> name != "" - else if (mod == "any") - { - filter += name + " != ''"; - } - - // name.is:value --> name = value - else if (mod == "is" || mod == "equals") - { - filter += name + " == " + value; - } - - // name.isnt:value --> name != value - else if (mod == "isnt" || mod == "not") - { - filter += name + " != " + value; - } - - // name.has:value --> name ~ value - else if (mod == "has" || mod == "contains") - { - filter += name + " ~ " + value; - } - - // name.hasnt:value --> name !~ value - else if (mod == "hasnt") - { - filter += name + " !~ " + value; - } - - // name.startswith:value --> name ~ ^value - else if (mod == "startswith" || mod == "left") - { - filter += name + " ~ '^" + value + "'"; - } - - // name.endswith:value --> name ~ value$ - else if (mod == "endswith" || mod == "right") - { - filter += name + " ~ '" + value + "$'"; - } - - // name.word:value --> name ~ \bvalue\b - else if (mod == "word") - { -#if defined (DARWIN) - filter += name + " ~ " + value; -#elif defined (SOLARIS) - filter += name + " ~ '\\<" + value + "\\>'"; -#else - filter += name + " ~ '\\b" + value + "\\b'"; -#endif - } - - // name.noword:value --> name !~ \bvalue\n - else if (mod == "noword") - { -#if defined (DARWIN) - filter += name + " !~ " + value; -#elif defined (SOLARIS) - filter += name + " !~ '\\<" + value + "\\>'"; -#else - filter += name + " !~ '\\b" + value + "\\b'"; -#endif - } - else - throw format (STRING_A3_UNKNOWN_ATTMOD, mod); } else if ((*i)->hasTag ("ATTRIBUTE")) { @@ -696,20 +598,9 @@ const std::string A3t::getFilterExpression () } else if ((*i)->hasTag ("TAG")) { - if (filter != "") - filter += ' '; - - if ((*i)->attribute ("sign") == "+") - filter += "tags _hastag_ " + (*i)->attribute ("tag"); - else - filter += "tags _notag_ " + (*i)->attribute ("tag"); } else if ((*i)->hasTag ("PATTERN")) { - if (filter != "") - filter += ' '; - - filter += "description ~ " + (*i)->attribute ("pattern"); } else { @@ -1451,7 +1342,7 @@ void A3t::findModifications () } //////////////////////////////////////////////////////////////////////////////// -// This is a called after parsing. The intention is to find plain arguments that +// This is called after parsing. The intention is to find plain arguments that // are not otherwise recognized, and potentially promote them to patterns. void A3t::findPlainArgs () {