summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-15 18:44:29 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-15 18:44:29 +0000
commitb6bc286d888f4aa64b80aca431b3d812874f1280 (patch)
tree1a35824eb0e11e25bd21d581cc8d4a2ef204e03e
parentfea21d3bd5dfa9c5ac02619243af699621f20bdc (diff)
downloadqpid-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.cpp40
-rw-r--r--qpid/cpp/src/tests/Selector.cpp5
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)