Kaynağa Gözat

HUE-4966 [metadata] Introduce interactive facet API for autocomplete

e.g.

          $.post('/metadata/api/navigator/search_entities_interactive', { // For facets
            query_s: '*',
            limit: 3,
            sources: '["hive"]'
          }, function (data) {
            console.log(JSON.stringify(data));
          });
Romain Rigaux 9 yıl önce
ebeveyn
işleme
c584706

+ 41 - 3
desktop/libs/metadata/src/metadata/navigator_api.py

@@ -64,7 +64,7 @@ def error_handler(view_fn):
 def search_entities(request):
   api = NavigatorApi()
 
-  query_s = request.POST.get('query_s')
+  query_s = request.POST.get('query_s', '')
   offset = request.POST.get('offset', 0)
   limit = request.POST.get('limit', 100)
   sources = json.loads(request.POST.get('sources')) or []
@@ -85,15 +85,53 @@ def search_entities(request):
   return JsonResponse(response)
 
 
+@error_handler
+def search_entities_interactive(request):
+  api = NavigatorApi()
+
+  query_s = request.POST.get('query_s', '')
+  prefix = request.POST.get('prefix')
+  offset = request.POST.get('offset', 0)
+  limit = request.POST.get('limit', 25)
+  sources = json.loads(request.POST.get('sources')) or []
+
+  fqs = []
+  fq_type = []
+
+  if 'hive' in sources or 'impala' in sources:
+    fq_type.append('TABLE')
+    fq_type.append('VIEW') # 'DATABASE', 'PARTITION', 'FIELD'
+  elif 'hdfs' in sources:
+    fq_type.append('FILE')
+    fq_type.append('DIRECTORY')
+
+  fqs += ['{!tag=type} %s' % ' OR '.join(['type:%s' % fq for fq in fq_type])]
+
+  response = api.search_entities_interactive(
+      query=query_s,
+      limit=limit,
+      offset=offset,
+      facetFields=None,
+      facetPrefix=prefix,
+      facetRanges=None,
+      filterQueries=fqs,
+      firstClassEntitiesOnly=None
+  )
+
+  response['status'] = 0
+
+  return JsonResponse(response)
+
+
 @error_handler
 def list_tags(request):
   api = NavigatorApi()
 
   prefix = request.POST.get('prefix')
   offset = request.POST.get('offset', 0)
-  limit = request.POST.get('limit', 100)
+  limit = request.POST.get('limit', 25)
 
-  data = api.search_entities_interactive(facetFields=['tags'], facetPrefix=prefix, limit=0, offset=offset)
+  data = api.search_entities_interactive(facetFields=['tags'], facetPrefix=prefix, limit=limit, offset=offset)
 
   response = {
     'tags': data['facets']['tags'],

+ 11 - 10
desktop/libs/metadata/src/metadata/navigator_client.py

@@ -121,24 +121,25 @@ class NavigatorApi(object):
         'limit': limit,
       }
 
-      body = {'query': query or '*'}
+      body = {'query': query.strip() or '*'}
 
-      if facetFields is not None:
-        body['facetFields'] = facetFields
-      if facetPrefix is not None:
+      body['facetFields'] = facetFields or [] # Currently mandatory
+      if facetPrefix:
         body['facetPrefix'] = facetPrefix
-      if facetRanges is not None:
+      if facetRanges:
         body['facetRanges'] = facetRanges
-      if filterQueries is not None:
+      if filterQueries:
         body['filterQueries'] = filterQueries
-      if firstClassEntitiesOnly is not None:
+      if firstClassEntitiesOnly:
         body['firstClassEntitiesOnly'] = firstClassEntitiesOnly
 
-      response = self._root.post('interactive/entities?limit=%(limit)s&offset=%(offset)s' % pagination, data=json.dumps(body), contenttype=_JSON_CONTENT_TYPE)
+      data = json.dumps(body)
+      LOG.info(data)
+      response = self._root.post('interactive/entities?limit=%(limit)s&offset=%(offset)s' % pagination, data=data, contenttype=_JSON_CONTENT_TYPE)
 
       return response
-    except RestException, e:
-      msg = 'Failed to search for entities with search query: %s' % body
+    except RestException:
+      msg = 'Failed to search for entities with search query %s' % json.dumps(body)
       LOG.exception(msg)
       raise NavigatorApiException(msg)
 

+ 1 - 0
desktop/libs/metadata/src/metadata/urls.py

@@ -21,6 +21,7 @@ from django.conf.urls import patterns, url
 # Navigator API
 urlpatterns = patterns('metadata.navigator_api',
   url(r'^api/navigator/search_entities/?$', 'search_entities', name='search_entities'),
+  url(r'^api/navigator/search_entities_interactive/?$', 'search_entities_interactive', name='search_entities_interactive'),
   url(r'^api/navigator/find_entity/?$', 'find_entity', name='find_entity'),
   url(r'^api/navigator/get_entity/?$', 'get_entity', name='get_entity'),
   url(r'^api/navigator/add_tags/?$', 'add_tags', name='add_tags'),