예제 #1
0
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))
예제 #2
0
    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)
예제 #3
0
 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
예제 #4
0
 def complex(self):
     op = z3950.RpnRpnOp()
     op.op = self.boolean()
     op.rpn1 = self.query_struct()
     op.rpn2 = self.query_struct()
     return ('rpnRpnOp', op)