def __init__ (self, typ, query): """Creates Query object: only typ == 'CCL' currently supported. See ccl module documentation for details.""" if typ == 'CCL': self.typ = 'RPN' try: self.query = ccl.mk_rpn_query (query) except ccl.QuerySyntaxError, err: raise QuerySyntaxError except z3950.ConnectionError, val: raise ConnectionError (val)
def __init__(self, typ, query): """Creates Query object. Supported query types: CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE """ typ = typ.upper() # XXX maybe replace if ... elif ... with dict mapping querytype to func if typ == 'CCL': self.typ = 'RPN' try: self.query = ccl.mk_rpn_query(query) except ccl.QuerySyntaxError, err: raise QuerySyntaxError(str(err))
def __init__ (self, typ, query): """Creates Query object. Supported query types: CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE """ typ = typ.upper() # XXX maybe replace if ... elif ... with dict mapping querytype to func if typ == 'CCL': self.typ = 'RPN' try: self.query = ccl.mk_rpn_query (query) except ccl.QuerySyntaxError, err: raise QuerySyntaxError (str(err))
def handleSearch(self, session, data): # Must return a response no matter what resp = SearchResponse() resp.resultCount = 0 resp.numberOfRecordsReturned = 0 resp.nextResultSetPosition = 1 resp.searchStatus = 1 resp.resultSetStatus = 1 resp.presentStatus = PresentStatus.get_num_from_name('failure') try: queryType = data.query[0] query = ["", ""] if (queryType in ['type_1', 'type_101']): zQuery = data.query[1] attrset = zQuery.attributeSet query = ['rpn', zQuery.rpn] elif (queryType == 'type_0'): # A Priori external. We assume CQL query = ['cql', data.query[1]] elif (queryType == 'type_2'): # ISO8777 (CCL) rpn = ccl.mk_rpn_query(data.query[1]) query = ['rpn', rpn] elif (queryType == 'type_104'): # Look for CQL or SQL type104 = data.query[1].direct_reference if (type104 == Z3950_QUERY_CQL_ov): query = ['cql', data.query[1].encoding[1]] elif (type104 == Z3950_QUERY_SQL_ov): query = ['sql', data.query[1].encoding[1].queryExpression] # XXX Implement direct to postgres raise NotImplementedError else: # Undefined query type raise NotImplementedError elif (queryType in ['type_102', 'type_100']): # 102: Ranked List, not yet /defined/ let alone implemented # 100: Z39.58 query (Standard was withdrawn) raise NotImplementedError rsetname = data.resultSetName dbs = data.databaseNames resultSets = [] if query[0] == 'cql': q = CQLParser.parse(query[1]) for dbname in dbs: cfg = self.session.configs.get(dbname, None) if cfg is not None: db = cfg.parent if query[0] == 'rpn': self.log("Trying to convert: %s" % (repr(query[1]))) q = CQLUtils.rpn2cql(query[1], cfg) self.log("--> " + q.toCQL()) session.database = db.id q = cqlParser.parse(q.toCQL()) resultSets.append(db.search(session, q)) else: raise ValueError("%s not in %r" % (dbname, self.session.configs.keys())) if len(resultSets) > 1: rs = resultSets[0] for r in resultSets[1:]: rs.combine(r) elif len(resultSets) == 1: rs = resultSets[0] else: # No resultset. return self.encode(('searchResponse', resp)) resp.resultCount = len(rs) # Maybe put it into our DB if session.resultSets.has_key(rsetname): rsid = session.resultSets[rsetname] rs.id = rsid session.resultSetStore.store_resultSet(session, rs) else: rsid = session.resultSetStore.create_resultSet(session, rs) session.resultSets[rsetname] = rsid # only keep 4 at once keys = session.resultSetCache.keys() if len(keys) > 3: # delete one at random r = rand.randint(0, 3) del session.resultSetCache[keys[r]] session.resultSetCache[rsid] = rs except Exception, err: # XXX add -correct- diagnostic resp.numberOfRecordsReturned = 1 resp.nextResultSetPosition = 0 resp.resultSetStatus = 3 d = self.generate_diagnostic(err) diag = ('nonSurrogateDiagnostic', d) resp.records = diag
def __init__ (self, typ, query): """Creates Query object. Supported query types: CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE """ typ = typ.upper() # XXX maybe replace if ... elif ... with dict mapping querytype to func if typ == 'CCL': self.typ = 'RPN' try: self.query = ccl.mk_rpn_query (query) except ccl.QuerySyntaxError as err: raise QuerySyntaxError (str(err)) elif typ == 'S-CCL': # server-side ccl self.typ = typ self.query = ('type-2', query) elif typ == 'S-CQL': # server-side cql self.typ = typ xq = asn1.EXTERNAL() xq.direct_reference = oids.Z3950_QUERY_CQL_ov xq.encoding = ('single-ASN1-type', query) self.query = ('type_104', xq) elif typ == 'CQL': # CQL to RPN transformation self.typ = 'RPN' try: q = CQLParser.parse(query) rpnq = z3950.RPNQuery() # XXX Allow Attribute Architecture somehow? rpnq.attributeSet = oids.Z3950_ATTRS_BIB1_ov rpnq.rpn = q.toRPN() self.query = ('type_1', rpnq) except SRWDiagnostics.SRWDiagnostic as err: raise err except: raise QuerySyntaxError elif typ == 'PQF': # PQF to RPN transformation self.typ = 'RPN' try: self.query = pqf.parse(query) except: raise QuerySyntaxError elif typ == 'C2': # Cheshire2 Syntax self.typ = 'RPN' try: q = c2.parse(query) self.query = q[0] except: raise QuerySyntaxError elif typ == 'ZSQL': # External SQL self.typ = typ xq = asn1.EXTERNAL() xq.direct_reference = oids.Z3950_QUERY_SQL_ov q = z3950.SQLQuery() q.queryExpression = query xq.encoding = ('single-ASN1-type', q) self.query = ('type_104', xq) elif typ == 'CQL-TREE': # Tree to RPN self.typ = 'RPN' try: rpnq = z3950.RPNQuery() # XXX Allow Attribute Architecture rpnq.attributeSet = oids.Z3950_ATTRS_BIB1_ov rpnq.rpn = query.toRPN() self.query = ('type_1', rpnq) except SRWDiagnostics.SRWDiagnostic as err: raise err except: raise QuerySyntaxError else: raise ClientNotImplError ('%s queries not supported' % typ)
def handleSearch(self, session, data): # Must return a response no matter what resp = SearchResponse() resp.resultCount = 0 resp.numberOfRecordsReturned = 0 resp.nextResultSetPosition = 1 resp.searchStatus = 1 resp.resultSetStatus = 1 resp.presentStatus = PresentStatus.get_num_from_name('failure') try: queryType = data.query[0] query = ["", ""] if (queryType in ['type_1', 'type_101']): zQuery = data.query[1] attrset = zQuery.attributeSet query = ['rpn', zQuery.rpn] elif (queryType == 'type_0'): # A Priori external. We assume CQL query = ['cql', data.query[1]] elif (queryType == 'type_2'): # ISO8777 (CCL) rpn = ccl.mk_rpn_query(data.query[1]) query = ['rpn', rpn] elif (queryType == 'type_104'): # Look for CQL or SQL type104 = data.query[1].direct_reference if (type104 == Z3950_QUERY_CQL_ov): query = ['cql', data.query[1].encoding[1]] elif (type104 == Z3950_QUERY_SQL_ov): query = ['sql', data.query[1].encoding[1].queryExpression] # XXX Implement direct to postgres raise NotImplementedError else: # Undefined query type raise NotImplementedError elif (queryType in ['type_102', 'type_100']): # 102: Ranked List, not yet /defined/ let alone implemented # 100: Z39.58 query (Standard was withdrawn) raise NotImplementedError rsetname = data.resultSetName dbs = data.databaseNames resultSets = [] if query[0] == 'cql': q = CQLParser.parse(query[1]) for dbname in dbs: cfg = self.session.configs.get(dbname, None) if cfg is not None: db = cfg.parent if query[0] == 'rpn': self.log("Trying to convert: %s" % (repr(query[1]))) q = CQLUtils.rpn2cql(query[1], cfg) self.log("--> " + q.toCQL()) session.database = db.id q = cqlParser.parse(q.toCQL()) resultSets.append(db.search(session, q)) else: raise ValueError("%s not in %r" % (dbname, self.session.configs.keys())) if len(resultSets) > 1: rs = resultSets[0] for r in resultSets[1:]: rs.combine(r) elif len(resultSets) == 1: rs = resultSets[0] else: # No resultset. return self.encode(('searchResponse', resp)) resp.resultCount = len(rs) # Maybe put it into our DB if session.resultSets.has_key(rsetname): rsid = session.resultSets[rsetname] rs.id = rsid session.resultSetStore.store_resultSet(session, rs) else: rsid = session.resultSetStore.create_resultSet(session, rs) session.resultSets[rsetname] = rsid # only keep 4 at once keys = session.resultSetCache.keys() if len(keys) > 3: # delete one at random r = rand.randint(0,3) del session.resultSetCache[keys[r]] session.resultSetCache[rsid] = rs except Exception, err: # XXX add -correct- diagnostic resp.numberOfRecordsReturned = 1 resp.nextResultSetPosition = 0 resp.resultSetStatus = 3 d = self.generate_diagnostic(err) diag = ('nonSurrogateDiagnostic', d) resp.records = diag