Преглед изворни кода

HUE-1817 [beeswax] Disable execute button of parameterized query when blank field

Fix tests to.
Romain Rigaux пре 12 година
родитељ
комит
2a6c670

+ 5 - 4
apps/beeswax/src/beeswax/templates/execute.mako

@@ -409,13 +409,13 @@ ${layout.menubar(section='query')}
             <div class="control-group">
             <div class="control-group">
               <label data-bind="text: name" class="control-label"></label>
               <label data-bind="text: name" class="control-label"></label>
               <div class="controls">
               <div class="controls">
-                <input data-bind="value: value" type="text"/>
+                <input data-bind="value: value, valueUpdate:'afterkeydown'" type="text"/>
               </div>
               </div>
             </div>
             </div>
             <!-- /ko -->
             <!-- /ko -->
             <div class="form-actions" style="padding-left: 10px">
             <div class="form-actions" style="padding-left: 10px">
               <a class="btn" href="javascript:history.go(-1);">${_('Cancel')}</a>
               <a class="btn" href="javascript:history.go(-1);">${_('Cancel')}</a>
-              <button data-bind="click: tryExecuteParameterizedQuery" type="button" class="btn btn-primary">${_('Execute query')}</button>
+              <button data-bind="enable: $root.hasParametersFilled, click: tryExecuteParameterizedQuery" type="button" class="btn btn-primary">${_('Execute query')}</button>
             </div>
             </div>
           </fieldset>
           </fieldset>
         </form>
         </form>
@@ -441,13 +441,13 @@ ${layout.menubar(section='query')}
               <label data-bind="text: name" class="control-label"></label>
               <label data-bind="text: name" class="control-label"></label>
 
 
               <div class="controls">
               <div class="controls">
-                <input data-bind="value: value" type="text"/>
+                <input data-bind="value: value, valueUpdate:'afterkeydown'" type="text"/>
               </div>
               </div>
             </div>
             </div>
             <!-- /ko -->
             <!-- /ko -->
             <div class="form-actions" style="padding-left: 10px">
             <div class="form-actions" style="padding-left: 10px">
               <a class="btn" href="javascript:history.go(-1);">${_('Cancel')}</a>
               <a class="btn" href="javascript:history.go(-1);">${_('Cancel')}</a>
-              <button data-bind="click: tryExplainParameterizedQuery" type="button" class="btn btn-primary">${_('Explain query')}</button>
+              <button data-bind="enable: $root.hasParametersFilled, click: tryExplainParameterizedQuery" type="button" class="btn btn-primary">${_('Explain query')}</button>
             </div>
             </div>
           </fieldset>
           </fieldset>
         </form>
         </form>
@@ -730,6 +730,7 @@ var HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK = function (data) {
   }
   }
 };
 };
 
 
+
 // Navigator.
 // Navigator.
 $(document).ready(function () {
 $(document).ready(function () {
 
 

+ 5 - 1
apps/beeswax/src/beeswax/test_base.py

@@ -216,7 +216,7 @@ def fetch_query_result_data(client, status_response):
 def make_query(client, query, submission_type="Execute",
 def make_query(client, query, submission_type="Execute",
                udfs=None, settings=None, resources=None,
                udfs=None, settings=None, resources=None,
                wait=False, name=None, desc=None, local=True,
                wait=False, name=None, desc=None, local=True,
-               is_parameterized=True, max=30.0, database='default', email_notify=False, **kwargs):
+               is_parameterized=True, max=30.0, database='default', email_notify=False, params=None, **kwargs):
   """
   """
   Prepares arguments for the execute view.
   Prepares arguments for the execute view.
 
 
@@ -225,6 +225,8 @@ def make_query(client, query, submission_type="Execute",
 
 
   if settings is None:
   if settings is None:
     settings = []
     settings = []
+  if params is None:
+    params = []
   if local:
   if local:
     # Tests run faster if not run against the real cluster.
     # Tests run faster if not run against the real cluster.
     settings.append(('mapreduce.framework.name', 'local'))
     settings.append(('mapreduce.framework.name', 'local'))
@@ -269,6 +271,8 @@ def make_query(client, query, submission_type="Execute",
     parameters["file_resources-%d-type" % i] = str(type)
     parameters["file_resources-%d-type" % i] = str(type)
     parameters["file_resources-%d-path" % i] = str(path)
     parameters["file_resources-%d-path" % i] = str(path)
     parameters["file_resources-%d-_exists" % i] = 'True'
     parameters["file_resources-%d-_exists" % i] = 'True'
+  for name, value in params:
+    parameters["parameterization-%s" % name] = value
 
 
   kwargs.setdefault('follow', True)
   kwargs.setdefault('follow', True)
   execute_url = reverse("beeswax:api_execute")
   execute_url = reverse("beeswax:api_execute")

+ 24 - 32
apps/beeswax/src/beeswax/tests.py

@@ -42,7 +42,6 @@ from desktop.lib.test_utils import grant_access, add_to_group
 from desktop.lib.security_util import get_localhost_name
 from desktop.lib.security_util import get_localhost_name
 
 
 import beeswax.create_table
 import beeswax.create_table
-import beeswax.forms
 import beeswax.hive_site
 import beeswax.hive_site
 import beeswax.models
 import beeswax.models
 import beeswax.views
 import beeswax.views
@@ -69,11 +68,11 @@ LOG = logging.getLogger(__name__)
 def _make_query(client, query, submission_type="Execute",
 def _make_query(client, query, submission_type="Execute",
                 udfs=None, settings=None, resources=[],
                 udfs=None, settings=None, resources=[],
                 wait=False, name=None, desc=None, local=True,
                 wait=False, name=None, desc=None, local=True,
-                is_parameterized=True, max=30.0, database='default', email_notify=False, **kwargs):
-  """Wrapper around the real make_query"""
+                is_parameterized=True, max=30.0, database='default', email_notify=False, params=None, **kwargs):
+
   res = make_query(client, query, submission_type,
   res = make_query(client, query, submission_type,
                    udfs, settings, resources,
                    udfs, settings, resources,
-                   wait, name, desc, local, is_parameterized, max, database, email_notify, **kwargs)
+                   wait, name, desc, local, is_parameterized, max, database, email_notify, params, **kwargs)
 
 
   # Should be in the history if it's submitted.
   # Should be in the history if it's submitted.
   if submission_type == 'Execute':
   if submission_type == 'Execute':
@@ -353,42 +352,37 @@ for x in sys.stdin:
       'query-database': "default"
       'query-database': "default"
     }
     }
     response = self.client.post(reverse('beeswax:api_parameters'), data)
     response = self.client.post(reverse('beeswax:api_parameters'), data)
-    assert_equal([], content['parameters'], content)
-
-    response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'") # Save?
     content = json.loads(response.content)
     content = json.loads(response.content)
-    design_id = content['id']
-
-    # todo below
-
-    # Don't fill out the form
-    response = self.client.post("/beeswax/execute_parameterized/%d" % design_id)
-    assert_true("parameterization.mako", response.template)
+    assert_equal([
+        {'parameter': 'parameterization-x', 'name': 'x'},
+        {'parameter': 'parameterization-y', 'name': 'y'}
+      ], content['parameters'], content)
 
 
     # Now fill it out
     # Now fill it out
-    response = self.client.post("/beeswax/execute_parameterized/%d" % design_id, {
-                                "parameterization-x": str(1), "parameterization-y": str(2)}, follow=True)
-    assert_true(any(["watch_wait.mako" in _template.filename for _template in response.template]))
+    response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'", params=[('x', '1'), ('y', '2')])
+    content = json.loads(response.content)
+    assert_true('watch_url' in content, content)
+    query_history = QueryHistory.get(content['id'])
 
 
     # Check that substitution happened!
     # Check that substitution happened!
-    assert_equal("SELECT foo FROM test WHERE foo='1' and bar='2'", response.context["query"].query)
+    assert_equal("SELECT foo FROM test WHERE foo='1' and bar='2'", query_history.query)
 
 
     # Check that error handling is reasonable
     # Check that error handling is reasonable
-    response = self.client.post("/beeswax/execute_parameterized/%d" % design_id,
-                                {"parameterization-x": "'_this_is_not SQL ", "parameterization-y": str(2)},
-                                follow=True)
-    response = wait_for_query_to_finish(self.client, response)
-    assert_true("FAILED: ParseException" in response.content, response.content)
+    response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'", params=[('x', "'_this_is_not SQL "), ('y', '2')])
+    content = json.loads(response.content)
+    assert_true("FAILED: ParseException" in content.get('message'), content)
 
 
     # Check multi DB with a non default DB
     # Check multi DB with a non default DB
     response = _make_query(self.client, "CREATE TABLE test (foo INT, bar STRING)", database='other_db')
     response = _make_query(self.client, "CREATE TABLE test (foo INT, bar STRING)", database='other_db')
     response = wait_for_query_to_finish(self.client, response)
     response = wait_for_query_to_finish(self.client, response)
     response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'", database='other_db')
     response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'", database='other_db')
-    assert_true("parameterization.mako", response.template)
-    design_id = response.context["design"].id
-    response = self.client.post("/beeswax/execute_parameterized/%d" % design_id, {
-                                "parameterization-x": str(1), "parameterization-y": str(2)}, follow=True)
-    assert_equal('other_db', response.context['query'].design.get_design().query['database'])
+
+    response = _make_query(self.client, "SELECT foo FROM test WHERE foo='$x' and bar='$y'", database='other_db',
+                           params=[('x', '1'), ('y', '2')])
+    content = json.loads(response.content)
+    assert_true('watch_url' in content, content)
+    query_history = QueryHistory.get(content['id'])
+    assert_equal('other_db', query_history.design.get_design().query['database'])
 
 
   def test_explain_query(self):
   def test_explain_query(self):
     c = self.client
     c = self.client
@@ -416,8 +410,7 @@ for x in sys.stdin:
     # Selecting from utf-8 table should get correct result
     # Selecting from utf-8 table should get correct result
     query = u"SELECT * FROM test_utf8 WHERE bar='%s'" % (unichr(200),)
     query = u"SELECT * FROM test_utf8 WHERE bar='%s'" % (unichr(200),)
     response = _make_query(self.client, query, wait=True)
     response = _make_query(self.client, query, wait=True)
-    assert_equal(["200", unichr(200)], response.context["results"][0],
-                 "selecting from utf-8 table should get correct result")
+    assert_equal(["200", unichr(200)], response.context["results"][0], "selecting from utf-8 table should get correct result")
 
 
     csv = get_csv(self.client, response)
     csv = get_csv(self.client, response)
     assert_equal('"200","%s"' % (unichr(200).encode('utf-8'),), csv.split()[1])
     assert_equal('"200","%s"' % (unichr(200).encode('utf-8'),), csv.split()[1])
@@ -425,8 +418,7 @@ for x in sys.stdin:
     # Selecting from latin1 table should not blow up
     # Selecting from latin1 table should not blow up
     query = u"SELECT * FROM test_latin1 WHERE bar='%s'" % (unichr(200),)
     query = u"SELECT * FROM test_latin1 WHERE bar='%s'" % (unichr(200),)
     response = _make_query(self.client, query, wait=True)
     response = _make_query(self.client, query, wait=True)
-    assert_true(response.context.has_key("results"),
-                "selecting from latin1 table should not blow up")
+    assert_true(response.context.has_key("results"), "selecting from latin1 table should not blow up")
 
 
     # Describe table should be fine with non-ascii comment
     # Describe table should be fine with non-ascii comment
     response = self.client.get('/beeswax/table/default/test_utf8')
     response = self.client.get('/beeswax/table/default/test_utf8')

+ 10 - 0
apps/beeswax/static/js/beeswax.vm.js

@@ -90,6 +90,16 @@ function BeeswaxViewModel(server, query_id) {
     'deferEvaluation': true
     'deferEvaluation': true
   });
   });
 
 
+  self.hasParametersFilled = ko.computed(function() {
+    var hasBlank = false;
+    $.each(self.query.parameters(), function(index, element) {
+      if (element.value() == '') {
+        hasBlank = true;
+      }
+    });
+    return ! hasBlank;
+  });
+
   self.resetQuery = function() {
   self.resetQuery = function() {
     ko.mapping.fromJS(QUERY_DEFAULTS, self.query);
     ko.mapping.fromJS(QUERY_DEFAULTS, self.query);
   };
   };