def mongo_query(self, query): """ Return mongo query for provided input query """ mongo_query = None if self.verbose: ply_output(query, self.daskeys, self.dasservices, self.parserdir, self.verbose) parse_again = True if self.enabledb: status, value = self.parserdb.lookup_query(query) if status == PARSERCACHE_VALID and \ len(last_key_pattern.findall(query)) == 0: mongo_query = value parse_again = False elif status == PARSERCACHE_INVALID: # we unable to find query in parserdb, so will parse again parse_again = True else: ply_query = self.get_ply_query(query) if ply_query: try: mongo_query = ply2mongo(ply_query) parse_again = False except Exception as exc: msg = "Fail in ply2mongo, query=%s, ply_query=%s" \ % (query, ply_query) print msg try: self.parserdb.insert_valid_query(query, mongo_query) except Exception as exc: msg = "Fail to insert into parserdb, exception=%s" \ % str(exc) print_exc(msg, print_traceback=True) if parse_again: try: ply_query = self.get_ply_query(query) mongo_query = ply2mongo(ply_query) except Exception as exc: msg = "Fail to parse query='%s'" % query print_exc(msg, print_traceback=False) raise exc if set(mongo_query.keys()) & set(['fields', 'spec']) != \ set(['fields', 'spec']): raise Exception('Invalid MongoDB query %s' % mongo_query) if not mongo_query['fields'] and len(mongo_query['spec'].keys()) > 1: raise Exception(ambiguous_msg(query, mongo_query['spec'].keys())) for key, val in mongo_query['spec'].iteritems(): if isinstance(val, list): raise Exception(ambiguos_val_msg(query, key, val)) return mongo_query
def mongo_query(self, query): """ Return mongo query for provided input query """ # NOTE: somehow I need to keep build call just before using # PLY parser, otherwise it fails to parse. self.dasply.build() if self.verbose: msg = "input query='%s'" % query self.logger.debug(msg) self.dasply.test_lexer(query) if self.enabledb: status, value = self.parserdb.lookup_query(query) if status == PARSERCACHE_VALID and \ len(last_key_pattern.findall(query)) == 0: mongo_query = value elif status == PARSERCACHE_INVALID: raise Exception(value) else: try: ply_query = self.dasply.parser.parse(query) mongo_query = ply2mongo(ply_query) self.parserdb.insert_valid_query(query, mongo_query) except Exception as exp: self.parserdb.insert_invalid_query(query, exp) print "Input query=%s" % query raise exp else: try: ply_query = self.dasply.parser.parse(query) mongo_query = ply2mongo(ply_query) except Exception as exc: msg = "Fail to convert input query='%s' into MongoDB format" \ % query print_exc(msg, print_traceback=False) raise exc if set(mongo_query.keys()) & set(['fields', 'spec']) != \ set(['fields', 'spec']): raise Exception('Invalid MongoDB query %s' % mongo_query) if not mongo_query['fields'] and len(mongo_query['spec'].keys()) > 1: raise Exception(ambiguous_msg(query, mongo_query['spec'].keys())) for key, val in mongo_query['spec'].iteritems(): if isinstance(val, list): raise Exception(ambiguos_val_msg(query, key, val)) return mongo_query