Example #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
Example #2
0
 def test_instance(self):
     """Test appearance of instance in a DAS query"""
     query = 'dataset=/a/b/c instance=global'
     mongo = {'fields': ['dataset'], 'spec': {'dataset':'/a/b/c'}, 'instance':'global'}
     ply_query = self.dasply.parser.parse(query)
     result = ply2mongo(ply_query)
     self.assertEqual(mongo, result)
Example #3
0
 def submit(self, query):
     """submit query"""
     print "RAW: ", query
     ply = self.dasply.parser.parse(query)
     print "PLY: ", ply
     mongo = ply2mongo(ply)
     print "MONGO: ", mongo
     return True
Example #4
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
Example #5
0
 def test_parser(self):
     """Test DAS PLY parser"""
     for query, expect in self.queries.items():
         try:
             ply_query = self.dasply.parser.parse(query)
         except:
             self.dasply.parser.parse(query, debug=1)
             print("Input query:", query)
             raise
         if  self.debug:
             print()
             print("input query", query)
             print("ply query  ", ply_query)
         result = ply2mongo(ply_query)
         self.assertEqual(expect, result)