Exemple #1
0
 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
Exemple #2
0
 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