소스 검색

[beeswax] Implement get_functions API endpoint

GET beeswax/api/functions?prefix=a

{
	"status": 0,
	"functions": ["abs", "acos", "add_months", "and", "array", "array_contains", "ascii", "asin", "assert_true", "atan", "avg"],
	"error_message": ""
}
Jenny Kim 10 년 전
부모
커밋
f7f0c3c
4개의 변경된 파일48개의 추가작업 그리고 0개의 파일을 삭제
  1. 21 0
      apps/beeswax/src/beeswax/api.py
  2. 13 0
      apps/beeswax/src/beeswax/server/dbms.py
  3. 13 0
      apps/beeswax/src/beeswax/tests.py
  4. 1 0
      apps/beeswax/src/beeswax/urls.py

+ 21 - 0
apps/beeswax/src/beeswax/api.py

@@ -704,6 +704,27 @@ def get_indexes(request, database, table):
   return JsonResponse(response)
 
 
+def get_functions(request):
+  query_server = dbms.get_query_server_config(get_app_name(request))
+  db = dbms.get(request.user, query_server)
+  response = {'status': -1, 'error_message': ''}
+
+  try:
+    prefix = request.GET.get('prefix', None)
+    functions = db.get_functions(prefix)
+    if functions:
+      response['status'] = 0
+      rows = escape_rows(functions.rows(), nulls_only=True)
+      response['functions'] = [row[0] for row in rows]
+    else:
+      response['error_message'] = _('Fetching functions timed out.')
+  except Exception, ex:
+    error_message, logs = dbms.expand_exception(ex, db)
+    response['error_message'] = error_message
+
+  return JsonResponse(response)
+
+
 def get_query_form(request):
   try:
     try:

+ 13 - 0
apps/beeswax/src/beeswax/server/dbms.py

@@ -772,6 +772,19 @@ class HiveServer2Dbms(object):
     return result
 
 
+  def get_functions(self, prefix=None):
+    filter = '"%s.*"' % prefix if prefix else '".*"'
+    hql = 'SHOW FUNCTIONS %s' % filter
+
+    query = hql_query(hql)
+    handle = self.execute_and_wait(query, timeout_sec=15.0)
+
+    if handle:
+      result = self.fetch(handle, rows=5000)
+
+    return result
+
+
   def explain(self, query):
     return self.client.explain(query)
 

+ 13 - 0
apps/beeswax/src/beeswax/tests.py

@@ -1908,6 +1908,19 @@ for x in sys.stdin:
     assert_equal(2, len(json_resp['rows']), json_resp['rows'])
 
 
+  def test_get_functions(self):
+    resp = self.client.get(reverse("beeswax:get_functions"))
+    json_resp = json.loads(resp.content)
+    assert_true('functions' in json_resp, json_resp)
+    assert_true('coalesce' in json_resp['functions'], json_resp['functions'])
+
+    resp = self.client.get(reverse("beeswax:get_functions"), {'prefix': 'a'})
+    json_resp = json.loads(resp.content)
+    assert_true('functions' in json_resp, json_resp)
+    assert_true('avg' in json_resp['functions'], json_resp['functions'])
+    assert_false('coalesce' in json_resp['functions'], json_resp['functions'])
+
+
   def test_databases_quote(self):
     c = self.client
     db_name = '__%s' % self.db_name

+ 1 - 0
apps/beeswax/src/beeswax/urls.py

@@ -87,6 +87,7 @@ urlpatterns += patterns(
   url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)$', 'describe_table', name='describe_table'),
   url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/sample$', 'get_sample_data', name='get_sample_data'),
   url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/indexes$', 'get_indexes', name='get_indexes'),
+  url(r'^api/functions$', 'get_functions', name='get_functions'),
 
   url(r'^api/analyze/(?P<database>\w+)/(?P<table>\w+)/(?P<columns>\w+)?$', 'analyze_table', name='analyze_table'),
   url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/stats/(?P<column>\w+)?$', 'get_table_stats', name='get_table_stats'),