You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2010/01/28 22:10:08 UTC
svn commit: r904268 - in /qpid/trunk/qpid/python/qmf2: common.py console.py
tests/agent_discovery.py tests/basic_method.py tests/basic_query.py
tests/events.py tests/obj_gets.py
Author: kgiusti
Date: Thu Jan 28 21:10:07 2010
New Revision: 904268
URL: http://svn.apache.org/viewvc?rev=904268&view=rev
Log:
QPID-2261: Rework query impl to use list-based approach
Modified:
qpid/trunk/qpid/python/qmf2/common.py
qpid/trunk/qpid/python/qmf2/console.py
qpid/trunk/qpid/python/qmf2/tests/agent_discovery.py
qpid/trunk/qpid/python/qmf2/tests/basic_method.py
qpid/trunk/qpid/python/qmf2/tests/basic_query.py
qpid/trunk/qpid/python/qmf2/tests/events.py
qpid/trunk/qpid/python/qmf2/tests/obj_gets.py
Modified: qpid/trunk/qpid/python/qmf2/common.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/common.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/common.py (original)
+++ qpid/trunk/qpid/python/qmf2/common.py Thu Jan 28 21:10:07 2010
@@ -1,4 +1,3 @@
-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
@@ -17,7 +16,7 @@
# under the License.
#
import time
-import logging
+from logging import getLogger
from threading import Lock
from threading import Condition
try:
@@ -27,7 +26,8 @@
import md5
_md5Obj = md5.new
-
+log = getLogger("qmf")
+log_query = getLogger("qmf.query")
##
@@ -423,7 +423,10 @@
return self._tag
def get_value(self, name):
- # meta-properties:
+ """
+ Will throw an AttributeError exception if the named value does not exist.
+ """
+ # meta-properties first:
if name == SchemaClassId.KEY_PACKAGE:
if self._schema_id:
return self._schema_id.get_package_name()
@@ -453,7 +456,10 @@
if name == self.KEY_DELETE_TS:
return self._dtime
- return self._values.get(name)
+ try:
+ return self._values[name]
+ except KeyError:
+ raise AttributeError("no value named '%s' in this object" % name)
def has_value(self, name):
@@ -515,8 +521,7 @@
try:
result += unicode(self._values[key])
except:
- logging.error("get_object_id(): cannot convert value '%s'."
- % key)
+ log.error("get_object_id(): cannot convert value '%s'." % key)
return None
self._object_id = result
return result
@@ -931,23 +936,32 @@
# QmfData.KEY_DELETE_TS
# <name of data value>
- CMP_EQ="eq"
- CMP_NE="ne"
- CMP_LT="lt"
- CMP_LE="le"
- CMP_GT="gt"
- CMP_GE="ge"
- CMP_RE_MATCH="re_match"
- CMP_EXISTS="exists"
- CMP_TRUE="true"
- CMP_FALSE="false"
-
- LOGIC_AND="and"
- LOGIC_OR="or"
- LOGIC_NOT="not"
+ # supported predicate operators
+
+ # evaluation operators
+ QUOTE="quote"
+ UNQUOTE="unquote"
+ # boolean operators
+ EQ="eq"
+ NE="ne"
+ LT="lt"
+ LE="le"
+ GT="gt"
+ GE="ge"
+ RE_MATCH="re_match"
+ EXISTS="exists"
+ TRUE="true"
+ FALSE="false"
+ # logic operators
+ AND="and"
+ OR="or"
+ NOT="not"
_valid_targets = [TARGET_PACKAGES, TARGET_OBJECT_ID, TARGET_SCHEMA, TARGET_SCHEMA_ID,
TARGET_OBJECT, TARGET_AGENT]
+ _valid_bool_ops = [EQ, NE, LT, GT, LE, GE, EXISTS, RE_MATCH, TRUE, FALSE]
+ _valid_logic_ops = [AND, OR, NOT]
+ _valid_eval_ops = [QUOTE, UNQUOTE]
def __init__(self, _target=None, _target_params=None, _predicate=None,
_id=None, _map=None):
@@ -972,9 +986,7 @@
if _target == self.TARGET_SCHEMA:
_id = SchemaClassId.from_map(_id)
else:
- pred = _map.get(self.KEY_PREDICATE)
- if pred:
- _predicate = QmfQueryPredicate(pred)
+ _predicate = _map.get(self.KEY_PREDICATE, _predicate)
self._target = _target
if not self._target:
@@ -1038,7 +1050,7 @@
raise Exception("Unsupported query target '%s'" % str(self._target))
if self._predicate:
- return self._predicate.evaluate(qmfData)
+ return self._eval_pred(self._predicate, qmfData)
# no predicate and no id - always match
return True
@@ -1050,163 +1062,131 @@
else:
_map[self.KEY_ID] = self._id
elif self._predicate is not None:
- _map[self.KEY_PREDICATE] = self._predicate.map_encode()
+ _map[self.KEY_PREDICATE] = self._predicate
return _map
- def __repr__(self):
- return "QmfQuery=<<" + str(self.map_encode()) + ">>"
-
-
-
-class QmfQueryPredicate(_mapEncoder):
- """
- Class for Query predicates.
- """
- _valid_cmp_ops = [QmfQuery.CMP_EQ, QmfQuery.CMP_NE, QmfQuery.CMP_LT,
- QmfQuery.CMP_GT, QmfQuery.CMP_LE, QmfQuery.CMP_GE,
- QmfQuery.CMP_EXISTS, QmfQuery.CMP_RE_MATCH,
- QmfQuery.CMP_TRUE, QmfQuery.CMP_FALSE]
- _valid_logic_ops = [QmfQuery.LOGIC_AND, QmfQuery.LOGIC_OR, QmfQuery.LOGIC_NOT]
-
-
- def __init__( self, pmap):
- """
- {"op": listOf(operands)}
- """
- self._oper = None
- self._operands = []
-
- logic_op = False
- if type(pmap) == dict:
- for key in pmap.iterkeys():
- if key in self._valid_cmp_ops:
- # comparison operation - may have "name" and "value"
- self._oper = key
- break
- if key in self._valid_logic_ops:
- logic_op = True
- self._oper = key
- break
-
- if not self._oper:
- raise TypeError("invalid predicate expression: '%s'" % str(pmap))
-
- if type(pmap[self._oper]) == list or type(pmap[self._oper]) == tuple:
- if logic_op:
- for exp in pmap[self._oper]:
- self.append(QmfQueryPredicate(exp))
- else:
- self._operands = list(pmap[self._oper])
-
- else:
- raise TypeError("invalid predicate: '%s'" % str(pmap))
-
-
- def append(self, operand):
- """
- Append another operand to a predicate expression
- """
- self._operands.append(operand)
-
-
-
- def evaluate( self, qmfData ):
+ def _eval_pred(self, pred, qmfData):
"""
+ Evaluate the predicate expression against a QmfData object.
"""
if not isinstance(qmfData, QmfData):
raise TypeError("Query expects to evaluate QmfData types.")
- if self._oper == QmfQuery.CMP_TRUE:
- logging.debug("query evaluate TRUE")
- return True
- if self._oper == QmfQuery.CMP_FALSE:
- logging.debug("query evaluate FALSE")
+ if not isinstance(pred, type([])):
+ log_query.warning("Invalid type for predicate expression: '%s'" % str(pred))
return False
- if self._oper in [QmfQuery.CMP_EQ, QmfQuery.CMP_NE, QmfQuery.CMP_LT,
- QmfQuery.CMP_LE, QmfQuery.CMP_GT, QmfQuery.CMP_GE,
- QmfQuery.CMP_RE_MATCH]:
- if len(self._operands) != 2:
- logging.warning("Malformed query compare expression received: '%s, %s'" %
- (self._oper, str(self._operands)))
- return False
- # @todo: support regular expression match
- name = self._operands[0]
- logging.debug("looking for: '%s'" % str(name))
- if not qmfData.has_value(name):
- logging.warning("Malformed query, attribute '%s' not present."
- % name)
- return False
+ # empty predicate - match all???
+ if len(pred) == 0:
+ return True
- arg1 = qmfData.get_value(name)
- arg2 = self._operands[1]
- logging.debug("query evaluate %s: '%s' '%s' '%s'" %
- (name, str(arg1), self._oper, str(arg2)))
- try:
- if self._oper == QmfQuery.CMP_EQ: return arg1 == arg2
- if self._oper == QmfQuery.CMP_NE: return arg1 != arg2
- if self._oper == QmfQuery.CMP_LT: return arg1 < arg2
- if self._oper == QmfQuery.CMP_LE: return arg1 <= arg2
- if self._oper == QmfQuery.CMP_GT: return arg1 > arg2
- if self._oper == QmfQuery.CMP_GE: return arg1 >= arg2
- if self._oper == QmfQuery.CMP_RE_MATCH:
- logging.error("!!! RE QUERY TBD !!!")
- return False
- except:
- pass
- logging.warning("Malformed query - %s: '%s' '%s' '%s'" %
- (name, str(arg1), self._oper, str(self._operands[1])))
- return False
+ oper = pred[0]
+ if oper == QmfQuery.TRUE:
+ log_query.debug("query evaluate TRUE")
+ return True
+ if oper == QmfQuery.FALSE:
+ log_query.debug("query evaluate FALSE")
+ return False
- if self._oper == QmfQuery.CMP_EXISTS:
- if len(self._operands) != 1:
- logging.warning("Malformed query present expression received")
- return False
- name = self._operands[0]
- logging.debug("query evaluate PRESENT: [%s]" % str(name))
- return qmfData.has_value(name)
-
- if self._oper == QmfQuery.LOGIC_AND:
- logging.debug("query evaluate AND: '%s'" % str(self._operands))
- for exp in self._operands:
- if not exp.evaluate(qmfData):
+ if oper == QmfQuery.AND:
+ log_query.debug("query evaluate AND: '%s'" % str(pred))
+ for exp in pred[1:]:
+ if not self._eval_pred(exp, qmfData):
+ log_query.debug("---> False")
return False
+ log_query.debug("---> True")
return True
- if self._oper == QmfQuery.LOGIC_OR:
- logging.debug("query evaluate OR: [%s]" % str(self._operands))
- for exp in self._operands:
- if exp.evaluate(qmfData):
+ if oper == QmfQuery.OR:
+ log_query.debug("query evaluate OR: [%s]" % str(pred))
+ for exp in pred[1:]:
+ if self._eval_pred(exp, qmfData):
+ log_query.debug("---> True")
return True
+ log_query.debug("---> False")
return False
- if self._oper == QmfQuery.LOGIC_NOT:
- logging.debug("query evaluate NOT: [%s]" % str(self._operands))
- for exp in self._operands:
- if exp.evaluate(qmfData):
+ if oper == QmfQuery.NOT:
+ log_query.debug("query evaluate NOT: [%s]" % str(pred))
+ for exp in pred[1:]:
+ if self._eval_pred(exp, qmfData):
+ log_query.debug("---> False")
return False
+ log_query.debug("---> True")
return True
- logging.warning("Unrecognized query operator: [%s]" % str(self._oper))
- return False
+ if oper == QmfQuery.EXISTS:
+ if len(pred) != 2:
+ log_query.warning("Malformed query: 'exists' operator"
+ " - bad arguments '%s'" % str(pred))
+ return False
+ ### Q: Should we assume "quote", or should it be explicit?
+ ### "foo" or ["quote" "foo"]
+ ### my guess is "explicit"
+ log_query.debug("query evaluate EXISTS: [%s]" % str(pred))
+ try:
+ arg = self._fetch_pred_arg(pred[1], qmfData)
+ except AttributeError:
+ log_query.debug("query parameter not found: '%s'" % str(pred))
+ return False
+ v = qmfData.has_value(arg)
+ log_query.debug("---> %s" % str(v))
+ return v
+
+ # binary operators
+ if oper in [QmfQuery.EQ, QmfQuery.NE, QmfQuery.LT,
+ QmfQuery.LE, QmfQuery.GT, QmfQuery.GE,
+ QmfQuery.RE_MATCH]:
+ if len(pred) != 3:
+ log_query.warning("Malformed query: '%s' operator"
+ " - requires 2 arguments '%s'" %
+ (oper, str(pred)))
+ return False
+ # @todo: support regular expression match
+ log_query.debug("query evaluate binary op: [%s]" % str(pred))
+ try:
+ arg1 = self._fetch_pred_arg(pred[1], qmfData)
+ arg2 = self._fetch_pred_arg(pred[2], qmfData)
+ except AttributeError:
+ log_query.debug("query parameter not found: '%s'" % str(pred))
+ return False
+ log_query.debug("query evaluate %s: %s, %s" % (oper, str(arg1), str(arg2)))
+ v = False
+ try:
+ if oper == QmfQuery.EQ: v = arg1 == arg2
+ elif oper == QmfQuery.NE: v = arg1 != arg2
+ elif oper == QmfQuery.LT: v = arg1 < arg2
+ elif oper == QmfQuery.LE: v = arg1 <= arg2
+ elif oper == QmfQuery.GT: v = arg1 > arg2
+ elif oper == QmfQuery.GE: v = arg1 >= arg2
+ except TypeError:
+ log_query.warning("query comparison failed: '%s'" % str(pred))
+ log_query.debug("---> %s" % str(v))
+ return v
-
- def map_encode(self):
- _map = {}
- _list = []
- for exp in self._operands:
- if isinstance(exp, QmfQueryPredicate):
- _list.append(exp.map_encode())
- else:
- _list.append(exp)
- _map[self._oper] = _list
- return _map
+ log_query.warning("Unrecognized query operator: [%s]" % str(pred[0]))
+ return False
+ def _fetch_pred_arg(self, arg, qmfData):
+ """
+ Determine the value of a predicate argument by evaluating quoted
+ arguments.
+ """
+ if isinstance(arg, basestring):
+ return qmfData.get_value(arg)
+ if isinstance(arg, type([])) and len(arg) == 2:
+ if arg[0] == QmfQuery.QUOTE:
+ return arg[1]
+ if arg[0] == QmfQuery.UNQUOTE:
+ return qmfData.get_value(arg[1])
+ return arg
def __repr__(self):
- return "QmfQueryPredicate=<<" + str(self.map_encode()) + ">>"
-
+ return "QmfQuery=<<" + str(self.map_encode()) + ">>"
+
+
+
##==============================================================================
@@ -1924,13 +1904,3 @@
return cls(_map=map_)
from_map = classmethod(__from_map)
-
-
-
-
-
-
-
-
-
-
Modified: qpid/trunk/qpid/python/qmf2/console.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/console.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/console.py (original)
+++ qpid/trunk/qpid/python/qmf2/console.py Thu Jan 28 21:10:07 2010
@@ -31,7 +31,7 @@
from qpid.messaging import Connection, Message, Empty, SendError
from common import (make_subject, parse_subject, OpCode, QmfQuery, Notifier,
- QmfQueryPredicate, MsgKey, QmfData, QmfAddress,
+ MsgKey, QmfData, QmfAddress,
SchemaClass, SchemaClassId, SchemaEventClass,
SchemaObjectClass, WorkItem, SchemaMethod, QmfEvent)
@@ -992,26 +992,19 @@
# query by object id
query = QmfQuery.create_id(QmfQuery.TARGET_OBJECT, _object_id)
elif _schema_id is not None:
- pred = QmfQueryPredicate({QmfQuery.CMP_EQ:
- [QmfData.KEY_SCHEMA_ID,
- _schema_id.map_encode()]})
+ pred = [QmfQuery.EQ, QmfData.KEY_SCHEMA_ID, _schema_id.map_encode()]
query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT, pred)
elif _pname is not None:
# query by package name (and maybe class name)
if _cname is not None:
- pred = QmfQueryPredicate({QmfQuery.LOGIC_AND:
- [{QmfQuery.CMP_EQ:
- [SchemaClassId.KEY_PACKAGE,
- _pname]},
- {QmfQuery.CMP_EQ:
- [SchemaClassId.KEY_CLASS,
- _cname]}]})
+ pred = [QmfQuery.AND, [QmfQuery.EQ, SchemaClassId.KEY_PACKAGE,
+ [QmfQuery.QUOTE, _pname]],
+ [QmfQuery.EQ, SchemaClassId.KEY_CLASS,
+ [QmfQuery.QUOTE, _cname]]]
else:
- pred = QmfQueryPredicate({QmfQuery.CMP_EQ:
- [SchemaClassId.KEY_PACKAGE,
- _pname]})
+ pred = [QmfQuery.EQ, SchemaClassId.KEY_PACKAGE,
+ [QmfQuery.QUOTE, _pname]]
query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT, pred)
-
else:
raise Exception("invalid arguments")
@@ -1977,13 +1970,13 @@
logging.info( "******** Messing around with Queries ********" )
_q1 = QmfQuery.create_predicate(QmfQuery.TARGET_AGENT,
- QmfQueryPredicate({QmfQuery.LOGIC_AND:
- [{QmfQuery.CMP_EQ: ["vendor", "AVendor"]},
- {QmfQuery.CMP_EQ: ["product", "SomeProduct"]},
- {QmfQuery.CMP_EQ: ["name", "Thingy"]},
- {QmfQuery.LOGIC_OR:
- [{QmfQuery.CMP_LE: ["temperature", -10]},
- {QmfQuery.CMP_FALSE: None},
- {QmfQuery.CMP_EXISTS: ["namey"]}]}]}))
+ [QmfQuery.AND,
+ [QmfQuery.EQ, "vendor", [QmfQuery.QUOTE, "AVendor"]],
+ [QmfQuery.EQ, [QmfQuery.QUOTE, "SomeProduct"], "product"],
+ [QmfQuery.EQ, [QmfQuery.UNQUOTE, "name"], [QmfQuery.QUOTE, "Thingy"]],
+ [QmfQuery.OR,
+ [QmfQuery.LE, "temperature", -10],
+ [QmfQuery.FALSE],
+ [QmfQuery.EXISTS, "namey"]]])
print("_q1.mapEncode() = [%s]" % _q1.map_encode())
Modified: qpid/trunk/qpid/python/qmf2/tests/agent_discovery.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/tests/agent_discovery.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/tests/agent_discovery.py (original)
+++ qpid/trunk/qpid/python/qmf2/tests/agent_discovery.py Thu Jan 28 21:10:07 2010
@@ -180,9 +180,9 @@
self.console.add_connection(self.conn)
query = qmf2.common.QmfQuery.create_predicate(
- qmf2.common.QmfQuery.TARGET_AGENT,
- qmf2.common.QmfQueryPredicate({qmf2.common.QmfQuery.CMP_EQ:
- [qmf2.common.QmfQuery.KEY_AGENT_NAME, "agent1"]}))
+ qmf2.common.QmfQuery.TARGET_AGENT,
+ [qmf2.common.QmfQuery.EQ, qmf2.common.QmfQuery.KEY_AGENT_NAME,
+ [qmf2.common.QmfQuery.QUOTE, "agent1"]])
self.console.enable_agent_discovery(query)
agent1_found = agent2_found = False
Modified: qpid/trunk/qpid/python/qmf2/tests/basic_method.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/tests/basic_method.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/tests/basic_method.py (original)
+++ qpid/trunk/qpid/python/qmf2/tests/basic_method.py Thu Jan 28 21:10:07 2010
@@ -22,7 +22,7 @@
import qpid.messaging
from qmf2.common import (Notifier, SchemaObjectClass, SchemaClassId,
SchemaProperty, qmfTypes, SchemaMethod, QmfQuery,
- QmfData, QmfQueryPredicate, WorkItem)
+ QmfData, WorkItem)
import qmf2.console
from qmf2.agent import(QmfAgentData, Agent, MethodCallParams)
@@ -247,11 +247,9 @@
self.assertTrue(agent and agent.get_name() == aname)
query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
- QmfQueryPredicate(
- {QmfQuery.LOGIC_AND:
- [{QmfQuery.CMP_EXISTS: [SchemaClassId.KEY_PACKAGE]},
- {QmfQuery.CMP_EQ: [SchemaClassId.KEY_PACKAGE,
- "MyPackage"]}]}))
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, SchemaClassId.KEY_PACKAGE]],
+ [QmfQuery.EQ, SchemaClassId.KEY_PACKAGE, [QmfQuery.QUOTE, "MyPackage"]]])
obj_list = self.console.do_query(agent, query)
self.assertTrue(len(obj_list) == 2)
@@ -297,11 +295,9 @@
self.assertTrue(agent and agent.get_name() == aname)
query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
- QmfQueryPredicate(
- {QmfQuery.LOGIC_AND:
- [{QmfQuery.CMP_EXISTS: [SchemaClassId.KEY_PACKAGE]},
- {QmfQuery.CMP_EQ: [SchemaClassId.KEY_PACKAGE,
- "MyPackage"]}]}))
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, SchemaClassId.KEY_PACKAGE]],
+ [QmfQuery.EQ, [QmfQuery.UNQUOTE, SchemaClassId.KEY_PACKAGE], [QmfQuery.QUOTE, "MyPackage"]]])
obj_list = self.console.do_query(agent, query)
self.assertTrue(len(obj_list) == 2)
Modified: qpid/trunk/qpid/python/qmf2/tests/basic_query.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/tests/basic_query.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/tests/basic_query.py (original)
+++ qpid/trunk/qpid/python/qmf2/tests/basic_query.py Thu Jan 28 21:10:07 2010
@@ -22,7 +22,7 @@
import qpid.messaging
from qmf2.common import (Notifier, SchemaObjectClass, SchemaClassId,
SchemaProperty, qmfTypes, SchemaMethod, QmfQuery,
- QmfData, QmfQueryPredicate)
+ QmfData)
import qmf2.console
from qmf2.agent import(QmfAgentData, Agent)
@@ -107,6 +107,7 @@
_obj2.set_value("field2", 2)
_obj2.set_value("field3", {"a":1, "map":2, "value":3})
_obj2.set_value("field4", ["a", "list", "value"])
+ _obj2.set_value("index1", 50)
self.agent.add_object(_obj2)
self.running = False
@@ -296,9 +297,9 @@
self.assertTrue(agent and agent.get_name() == aname)
query = QmfQuery.create_predicate(QmfQuery.TARGET_SCHEMA,
- QmfQueryPredicate(
- {QmfQuery.CMP_EQ: [SchemaClassId.KEY_PACKAGE,
- "MyPackage"]}))
+ [QmfQuery.EQ,
+ SchemaClassId.KEY_PACKAGE,
+ [QmfQuery.QUOTE, "MyPackage"]])
schema_list = self.console.do_query(agent, query)
self.assertTrue(len(schema_list))
@@ -330,9 +331,9 @@
self.assertTrue(agent and agent.get_name() == aname)
query = QmfQuery.create_predicate(QmfQuery.TARGET_SCHEMA,
- QmfQueryPredicate(
- {QmfQuery.CMP_EQ: [SchemaClassId.KEY_PACKAGE,
- "No-Such-Package"]}))
+ [QmfQuery.EQ,
+ [QmfQuery.UNQUOTE, SchemaClassId.KEY_PACKAGE],
+ [QmfQuery.QUOTE, "No-Such-Package"]])
schema_list = self.console.do_query(agent, query)
self.assertTrue(len(schema_list) == 0)
@@ -340,3 +341,94 @@
self.console.destroy(10)
+ def test_predicate_match_string(self):
+ # create console
+ # find agents
+ # synchronous query for all objects with a value named
+ # set_string which is < or equal to "UNSET"
+ self.notifier = _testNotifier()
+ self.console = qmf2.console.Console(notifier=self.notifier,
+ agent_timeout=3)
+ self.conn = qpid.messaging.Connection(self.broker.host,
+ self.broker.port,
+ self.broker.user,
+ self.broker.password)
+ self.conn.connect()
+ self.console.add_connection(self.conn)
+
+ for aname in ["agent1", "agent2"]:
+ agent = self.console.find_agent(aname, timeout=3)
+ self.assertTrue(agent and agent.get_name() == aname)
+
+ query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, "set_string"]],
+ [QmfQuery.EQ, "set_string", [QmfQuery.QUOTE, "UNSET"]]])
+
+ obj_list = self.console.do_query(agent, query)
+ self.assertTrue(len(obj_list) == 2)
+ for obj in obj_list:
+ self.assertTrue(obj.has_value("set_string"))
+ self.assertTrue(obj.get_value("set_string") == "UNSET")
+
+ self.console.destroy(10)
+
+
+
+ def test_predicate_match_integer(self):
+ # create console
+ # find agents
+ # synchronous query for all objects with a value named
+ # "index1" which is < or equal to various values
+ self.notifier = _testNotifier()
+ self.console = qmf2.console.Console(notifier=self.notifier,
+ agent_timeout=3)
+ self.conn = qpid.messaging.Connection(self.broker.host,
+ self.broker.port,
+ self.broker.user,
+ self.broker.password)
+ self.conn.connect()
+ self.console.add_connection(self.conn)
+
+ for aname in ["agent1", "agent2"]:
+ agent = self.console.find_agent(aname, timeout=3)
+ self.assertTrue(agent and agent.get_name() == aname)
+
+ # == 99
+ query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, "index1"]],
+ [QmfQuery.EQ, "index1", 99]])
+
+ obj_list = self.console.do_query(agent, query)
+ self.assertTrue(len(obj_list) == 1)
+ self.assertTrue(obj_list[0].has_value("index1"))
+ self.assertTrue(obj_list[0].get_value("index1") == 99)
+
+ # <= 99
+ query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, "index1"]],
+ [QmfQuery.LE, "index1", 99]])
+
+ obj_list = self.console.do_query(agent, query)
+ self.assertTrue(len(obj_list) == 2)
+ for obj in obj_list:
+ self.assertTrue(obj.has_value("index1"))
+ self.assertTrue(obj.get_value("index1") <= 99)
+
+
+ # > 99
+ query = QmfQuery.create_predicate(QmfQuery.TARGET_OBJECT,
+ [QmfQuery.AND,
+ [QmfQuery.EXISTS, [QmfQuery.QUOTE, "index1"]],
+ [QmfQuery.GT, "index1", 99]])
+
+ obj_list = self.console.do_query(agent, query)
+ self.assertTrue(len(obj_list) == 1)
+ for obj in obj_list:
+ self.assertTrue(obj.has_value("index1"))
+ self.assertTrue(obj.get_value("index1") > 99)
+
+ self.console.destroy(10)
+
Modified: qpid/trunk/qpid/python/qmf2/tests/events.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/tests/events.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/tests/events.py (original)
+++ qpid/trunk/qpid/python/qmf2/tests/events.py Thu Jan 28 21:10:07 2010
@@ -25,7 +25,7 @@
from qpid.harness import Skipped
from qmf2.common import (Notifier, SchemaObjectClass, SchemaClassId,
SchemaProperty, qmfTypes, SchemaMethod, QmfQuery,
- QmfData, QmfQueryPredicate, SchemaEventClass,
+ QmfData, SchemaEventClass,
QmfEvent)
import qmf2.console
from qmf2.agent import(QmfAgentData, Agent)
Modified: qpid/trunk/qpid/python/qmf2/tests/obj_gets.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qmf2/tests/obj_gets.py?rev=904268&r1=904267&r2=904268&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qmf2/tests/obj_gets.py (original)
+++ qpid/trunk/qpid/python/qmf2/tests/obj_gets.py Thu Jan 28 21:10:07 2010
@@ -22,7 +22,7 @@
import qpid.messaging
from qmf2.common import (Notifier, SchemaObjectClass, SchemaClassId,
SchemaProperty, qmfTypes, SchemaMethod, QmfQuery,
- QmfData, QmfQueryPredicate)
+ QmfData)
import qmf2.console
from qmf2.agent import(QmfAgentData, Agent)
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org