Browse Source

HUE-9549 [SQLAlchemy] API - Support explain

Romain Rigaux 4 years ago
parent
commit
36261127c0

+ 4 - 0
desktop/libs/notebook/src/notebook/connectors/sql_alchemy.py

@@ -298,6 +298,10 @@ class SqlAlchemyApi(Api):
     if statement:
       if self.options['url'].startswith('bigquery://'):
         explanation = ''
+      else:
+        result = connection.execute('EXPLAIN '+ statement)
+
+        explanation = "\n".join("{}: {},".format(k, v) for row in result for k, v in row.items())
 
     return {
       'status': 0,

+ 22 - 0
desktop/libs/notebook/src/notebook/connectors/sql_alchemy_tests.py

@@ -243,6 +243,28 @@ class TestApi(object):
       create_engine.assert_called_with('presto://test@hue:8080/hue', pool_pre_ping=True)
 
 
+  def test_explain(self):
+
+    with patch('notebook.connectors.sql_alchemy.SqlAlchemyApi._create_connection') as _create_connection:
+      with patch('notebook.connectors.sql_alchemy.SqlAlchemyApi._create_engine') as _create_engine:
+        with patch('notebook.connectors.sql_alchemy.SqlAlchemyApi._get_session') as _get_session:
+
+          result = [{"id": 1}, {"select_type": "SIMPLE"}, {"Extra": "No tables used"}]
+          
+          execute = Mock(return_value=result)
+          _create_connection.return_value = Mock(
+            execute=execute
+          )
+          notebook = {}
+          snippet = {'statement': 'SELECT 1;'}
+
+          explanation = 'id: 1,\nselect_type: SIMPLE,\nExtra: No tables used,'
+
+          response = SqlAlchemyApi(self.user, self. interpreter).explain(notebook, snippet)
+
+        assert_equal(explanation, response['explanation'])
+
+
   def test_check_status(self):
     notebook = Mock()