diff options
author | Andrew Stitcher <astitcher@apache.org> | 2013-03-15 18:44:29 +0000 |
---|---|---|
committer | Andrew Stitcher <astitcher@apache.org> | 2013-03-15 18:44:29 +0000 |
commit | b6bc286d888f4aa64b80aca431b3d812874f1280 (patch) | |
tree | 1a35824eb0e11e25bd21d581cc8d4a2ef204e03e | |
parent | fea21d3bd5dfa9c5ac02619243af699621f20bdc (diff) | |
download | qpid-python-b6bc286d888f4aa64b80aca431b3d812874f1280.tar.gz |
QPID-4623: Fixed unknown semantics of "between" comparison
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1457058 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/src/qpid/broker/SelectorExpression.cpp | 40 | ||||
-rw-r--r-- | qpid/cpp/src/tests/Selector.cpp | 5 |
2 files changed, 19 insertions, 26 deletions
diff --git a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp index 62de067396..8c6d82cc6f 100644 --- a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp +++ b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp @@ -184,17 +184,11 @@ public: BoolOrNone eval_bool(const SelectorEnv& env) const { BoolOrNone bn1(e1->eval_bool(env)); - if (bn1==BN_TRUE) { - return BN_TRUE; - } else { - BoolOrNone bn2(e2->eval_bool(env)); - if (bn2==BN_TRUE) { - return BN_TRUE; - } else { - if (bn1==BN_FALSE && bn2==BN_FALSE) return BN_FALSE; - else return BN_UNKNOWN; - } - } + if (bn1==BN_TRUE) return BN_TRUE; + BoolOrNone bn2(e2->eval_bool(env)); + if (bn2==BN_TRUE) return BN_TRUE; + if (bn1==BN_FALSE && bn2==BN_FALSE) return BN_FALSE; + else return BN_UNKNOWN; } }; @@ -214,17 +208,11 @@ public: BoolOrNone eval_bool(const SelectorEnv& env) const { BoolOrNone bn1(e1->eval_bool(env)); - if (bn1==BN_FALSE) { - return BN_FALSE; - } else { - BoolOrNone bn2(e2->eval_bool(env)); - if (bn2==BN_FALSE) { - return BN_FALSE; - } else { - if (bn1==BN_TRUE && bn2==BN_TRUE) return BN_TRUE; - else return BN_UNKNOWN; - } - } + if (bn1==BN_FALSE) return BN_FALSE; + BoolOrNone bn2(e2->eval_bool(env)); + if (bn2==BN_FALSE) return BN_FALSE; + if (bn1==BN_TRUE && bn2==BN_TRUE) return BN_TRUE; + else return BN_UNKNOWN; } }; @@ -340,11 +328,11 @@ public: Value ve(e->eval(env)); if (unknown(ve)) return BN_UNKNOWN; Value vl(l->eval(env)); - if (unknown(vl)) return BN_UNKNOWN; - if (ve<vl) return BN_FALSE; + if (!unknown(vl) && ve<vl) return BN_FALSE; Value vu(u->eval(env)); - if (unknown(vu)) return BN_UNKNOWN; - return BoolOrNone(ve<=vu); + if (!unknown(vu) && ve>vu) return BN_FALSE; + if (unknown(vl) || unknown(vu)) return BN_UNKNOWN; + return BN_TRUE; } }; diff --git a/qpid/cpp/src/tests/Selector.cpp b/qpid/cpp/src/tests/Selector.cpp index 1b0eea3d7e..288d8ee6c3 100644 --- a/qpid/cpp/src/tests/Selector.cpp +++ b/qpid/cpp/src/tests/Selector.cpp @@ -298,6 +298,11 @@ QPID_AUTO_TEST_CASE(numericEval) BOOST_CHECK(!qb::Selector("A<>17 and B=5.6e17").eval(env)); BOOST_CHECK(qb::Selector("A BETWEEN B and 98.5").eval(env)); BOOST_CHECK(!qb::Selector("B NOT BETWEEN 35 AND 100").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN B and 40").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN C and 40").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN 45 and C").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN 40 and C AND A NOT BETWEEN 40 and C").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN C and 45 AND A NOT BETWEEN C and 45").eval(env)); } QPID_AUTO_TEST_CASE(comparisonEval) |