From ffec82701de38da2def2217e442123d7283c732d Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 12 May 2014 00:16:32 -0400 Subject: [PATCH] A3t - Added ID and UUID sequence generation, as part of the filter expression. Now creates efficient filters, like '(id >= 1 and id <= 10)' --- src/A3t.cpp | 60 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/A3t.cpp b/src/A3t.cpp index 44f1a6c6d..35001e775 100644 --- a/src/A3t.cpp +++ b/src/A3t.cpp @@ -522,12 +522,49 @@ Tree* A3t::captureFirst (const std::string& arg) //////////////////////////////////////////////////////////////////////////////// const std::string A3t::getFilterExpression () { - // TODO Construct an efficient ID/UUID clause. + // Construct an efficient ID/UUID clause. + std::string sequence = ""; + std::vector ::iterator i; + for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) + { + if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO")) + { + if ((*i)->hasTag ("ID")) + { + // Construct ID sequence clause. + std::vector ::iterator range; + for (range = (*i)->_branches.begin (); range != (*i)->_branches.end (); ++range) + { + if (sequence != "") + sequence += " or "; + + 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 + ")"; + } + } + else if ((*i)->hasTag ("UUID")) + { + // 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"); + } + } + } + } // Locate and extract the filter elements. std::string filter = ""; std::vector ::iterator prev = _tree->_branches.begin (); - std::vector ::iterator i; for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) { if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO")) @@ -547,22 +584,12 @@ const std::string A3t::getFilterExpression () filter += " and"; } - if ((*i)->hasTag ("ID")) + else if ((*i)->hasTag ("ID") || + (*i)->hasTag ("UUID")) { - // TODO Construct sequence clause clause. - if (filter != "") - filter += ' '; - - filter += ""; + // Skipped, as they are already processed. } - else if ((*i)->hasTag ("UUID")) - { - // TODO Construct sequence clause clause. - if (filter != "") - filter += ' '; - filter += ""; - } else if ((*i)->hasTag ("ATTMOD")) { // name.mod:value --> name value @@ -696,6 +723,9 @@ const std::string A3t::getFilterExpression () } } + if (sequence != "") + return "( " + sequence + " ) " + filter; + return filter; }