浏览代码

HUE-7820 [metadata] Allow raw querying of the navigator entity search API

Johan Ahlen 7 年之前
父节点
当前提交
74d6c54

+ 4 - 2
desktop/libs/metadata/src/metadata/navigator_api.py

@@ -94,15 +94,17 @@ def search_entities(request):
 
   offset = request.POST.get('offset', 0)
   limit = int(request.POST.get('limit', 100))
+  raw_query = request.POST.get('raw_query', False)
   sources = json.loads(request.POST.get('sources') or '[]')
   if sources and not has_navigator_file_search(request.user):
     sources = ['sql']
 
   query_s = query_s.strip() or '*'
 
-  entities = api.search_entities(query_s, limit=limit, offset=offset, sources=sources)
+  entities = api.search_entities(query_s, limit=limit, offset=offset, raw_query=raw_query, sources=sources)
 
-  _augment_highlighting(query_s, entities)
+  if not raw_query:
+    _augment_highlighting(query_s, entities)
 
   response = {
     'entities': entities,

+ 47 - 44
desktop/libs/metadata/src/metadata/navigator_client.py

@@ -145,7 +145,7 @@ class NavigatorApi(object):
     return default_entity_types, entity_types
 
 
-  def search_entities(self, query_s, limit=100, offset=0, **filters):
+  def search_entities(self, query_s, limit=100, offset=0, raw_query=False, **filters):
     """
     Solr edismax query parser syntax.
 
@@ -159,50 +159,53 @@ class NavigatorApi(object):
     default_entity_types, entity_types = self._get_types_from_sources(sources)
 
     try:
-      query_s = query_s.replace('{', '\\{').replace('}', '\\}').replace('(', '\\(').replace(')', '\\)').replace('[', '\\[').replace(']', '\\]')
       params = self.__params
-
-      search_terms = [term for term in query_s.strip().split()]
-
-      query_clauses = []
-      user_filters = []
-      source_type_filter = []
-
-      for term in search_terms:
-        if ':' not in term:
-          if ('sql' in sources or 'hive' in sources or 'impala' in sources):
-            if '.' in term:
-              parent, term = term.rsplit('.', 1)
-              user_filters.append('parentPath:"/%s"' % parent.replace('.', '/'))
-          query_clauses.append('OR'.join(['(%s:*%s*)' % (field, term) for field in search_fields]))
-        else:
-          name, val = term.split(':')
-          if val:
-            if name == 'type':
-              term = '%s:%s' % (name, val.upper().strip('*'))
-              default_entity_types = entity_types # Make sure type value still makes sense for the source
-            user_filters.append(term + '*') # Manual filter allowed e.g. type:VIE* ca
-
-      filter_query = '*'
-
-      if query_clauses:
-        filter_query = 'OR'.join(['(%s)' % clause for clause in query_clauses])
-
-      user_filter_clause = 'AND '.join(['(%s)' % f for f in user_filters]) or '*'
-      source_filter_clause = 'OR'.join(['(%s:%s)' % ('type', entity_type) for entity_type in default_entity_types])
-
-      if 's3' in sources:
-        source_type_filter.append('sourceType:s3')
-      elif 'sql' in sources or 'hive' in sources or 'impala' in sources:
-        source_type_filter.append('sourceType:HIVE OR sourceType:IMPALA')
-
-      filter_query = '%s AND (%s) AND (%s)' % (filter_query, user_filter_clause, source_filter_clause)
-      if source_type_filter:
-        filter_query += ' AND (%s)' % 'OR '.join(source_type_filter)
-
-      source_ids = get_cluster_source_ids(self)
-      if source_ids:
-        filter_query = source_ids + '(' + filter_query + ')'
+      if not raw_query:
+        query_s = query_s.replace('{', '\\{').replace('}', '\\}').replace('(', '\\(').replace(')', '\\)').replace('[', '\\[').replace(']', '\\]')
+
+        search_terms = [term for term in query_s.strip().split()]
+
+        query_clauses = []
+        user_filters = []
+        source_type_filter = []
+
+        for term in search_terms:
+          if ':' not in term:
+            if ('sql' in sources or 'hive' in sources or 'impala' in sources):
+              if '.' in term:
+                parent, term = term.rsplit('.', 1)
+                user_filters.append('parentPath:"/%s"' % parent.replace('.', '/'))
+            query_clauses.append('OR'.join(['(%s:*%s*)' % (field, term) for field in search_fields]))
+          else:
+            name, val = term.split(':')
+            if val:
+              if name == 'type':
+                term = '%s:%s' % (name, val.upper().strip('*'))
+                default_entity_types = entity_types # Make sure type value still makes sense for the source
+              user_filters.append(term + '*') # Manual filter allowed e.g. type:VIE* ca
+
+        filter_query = '*'
+
+        if query_clauses:
+          filter_query = 'OR'.join(['(%s)' % clause for clause in query_clauses])
+
+        user_filter_clause = 'AND '.join(['(%s)' % f for f in user_filters]) or '*'
+        source_filter_clause = 'OR'.join(['(%s:%s)' % ('type', entity_type) for entity_type in default_entity_types])
+
+        if 's3' in sources:
+          source_type_filter.append('sourceType:s3')
+        elif 'sql' in sources or 'hive' in sources or 'impala' in sources:
+          source_type_filter.append('sourceType:HIVE OR sourceType:IMPALA')
+
+        filter_query = '%s AND (%s) AND (%s)' % (filter_query, user_filter_clause, source_filter_clause)
+        if source_type_filter:
+          filter_query += ' AND (%s)' % 'OR '.join(source_type_filter)
+
+        source_ids = get_cluster_source_ids(self)
+        if source_ids:
+          filter_query = source_ids + '(' + filter_query + ')'
+      else:
+        filter_query = query_s
 
       params += (
         ('query', filter_query),