if op != qlang.OP_OR:
self._NeedAllNames()
- def NoteUnaryOp(self, op): # pylint: disable=W0613
+ def NoteUnaryOp(self, op, datakind): # pylint: disable=W0613
"""Called when handling an unary operation.
@type op: string
@param op: Operator
"""
+ if datakind is not None:
+ self._datakinds.add(datakind)
+
self._NeedAllNames()
def NoteBinaryOp(self, op, datakind, name, value):
"""
assert op_fn is None
- if hints_fn:
- hints_fn(op)
-
if len(operands) != 1:
raise errors.ParameterError("Unary operator '%s' expects exactly one"
" operand" % op)
if op == qlang.OP_TRUE:
- (_, _, _, retrieval_fn) = self._LookupField(operands[0])
+ (_, datakind, _, retrieval_fn) = self._LookupField(operands[0])
+
+ if hints_fn:
+ hints_fn(op, datakind)
op_fn = operator.truth
arg = retrieval_fn
elif op == qlang.OP_NOT:
+ if hints_fn:
+ hints_fn(op, None)
+
op_fn = operator.not_
arg = self._Compile(operands[0], level + 1)
else:
self.assertEqual(q.RequestedData(), set([DK_B]))
self.assertEqual(q.Query(data), [[]])
+ # Data type in boolean operator
+ q = query.Query(fielddefs, [], namefield="name",
+ qfilter=["?", "name"])
+ self.assertTrue(q.RequestedNames() is None)
+ self.assertEqual(q.RequestedData(), set([DK_A]))
+ self.assertEqual(q.Query(data), [[], [], []])
+
+ q = query.Query(fielddefs, [], namefield="name",
+ qfilter=["!", ["?", "name"]])
+ self.assertTrue(q.RequestedNames() is None)
+ self.assertEqual(q.RequestedData(), set([DK_A]))
+ self.assertEqual(q.Query(data), [])
+
def testFilterContains(self):
fielddefs = query._PrepareFieldList([
(query._MakeField("name", "Name", constants.QFT_TEXT, "Name"),