+ def __or__(self, query):
+ assert self.action == query.action
+ assert self.object == query.object
+ assert self.timestamp == query.timestamp # XXX
+ filter = self.filters | query.filters
+ # fast dict union
+ # http://my.safaribooksonline.com/book/programming/python/0596007973/python-shortcuts/pythoncook2-chp-4-sect-17
+ params = dict(self.params, **query.params)
+ fields = self.fields | query.fields
+ return Query.action(self.action, self.object).filter_by(filter).select(fields)
+
+ def __and__(self, query):
+ assert self.action == query.action
+ assert self.object == query.object
+ assert self.timestamp == query.timestamp # XXX
+ filter = self.filters & query.filters
+ # fast dict intersection
+ # http://my.safaribooksonline.com/book/programming/python/0596007973/python-shortcuts/pythoncook2-chp-4-sect-17
+ params = dict.fromkeys([x for x in self.params if x in query.params])
+ fields = self.fields & query.fields
+ return Query.action(self.action, self.object).filter_by(filter).select(fields)
+
+ def __le__(self, query):
+ return ( self == self & query ) or ( query == self | query )
+