def tree_to_q (ast): if ast.type == 'op': myrpnRpnOp = z3950.RpnRpnOp () myrpnRpnOp.rpn1 = tree_to_q(ast.children[0]) myrpnRpnOp.rpn2 = tree_to_q(ast.children[1]) op = ast.leaf.lower () if op == 'not': op = 'and-not' # CCL spec of 'not' vs. Z39.50 spec of 'and-not' myrpnRpnOp.op = (op, None) return ('rpnRpnOp', myrpnRpnOp) elif ast.type == 'relop': # XXX but e.g. LC (http://lcweb.loc.gov/z3950/lcserver.html) # doesn't support other relation attributes, either. try: relattr = relop_to_attrib [ast.leaf] except(KeyError): # should never happen, how could we have lexed it? raise UnimplError (ast.leaf) def make_aelt (qual): val = ('numeric', qual [1]) return z3950.AttributeElement (attributeType = qual[0], attributeValue = val) apt = z3950.AttributesPlusTerm () quallist = ast.children.quallist if ast.leaf != '=': quallist.append ((2,relattr)) # 2 is relation attribute # see http://www.loc.gov/z3950/agency/markup/13.html ATR.1.1 apt.attributes = map (make_aelt, quallist) apt.term = ('general', ast.children.val) # XXX update for V3? return ('op', ('attrTerm', apt)) elif ast.type == 'set': return ('op', ('resultSet', ast.leaf)) raise UnimplError("Bad ast type " + str(ast.type))
def toRPN(self, top=None): """rpnRpnOp""" if not top: top = self op = z3950.RpnRpnOp() op.rpn1 = self.leftOperand.toRPN(top) op.rpn2 = self.rightOperand.toRPN(top) op.op = self.boolean.toRPN(top) return ('rpnRpnOp', op)
def query(self): self.fetch_token() left = self.subquery() while 1: if not self.currentToken: break bool = self.is_boolean() if bool: bool = self.boolean() right = self.subquery() # Put left into triple, make triple new left op = z3950.RpnRpnOp() op.rpn1 = left op.rpn2 = right op.op = bool wrap = ('rpnRpnOp', op) left = wrap else: break return left
def complex(self): op = z3950.RpnRpnOp() op.op = self.boolean() op.rpn1 = self.query_struct() op.rpn2 = self.query_struct() return ('rpnRpnOp', op)