def test_substitute_variables(): data = ['$greeting', dict(a='${where} $where')] assert_equal(['hi', dict(a='there there')], substitute_variables(data, dict(greeting='hi', where='there'))) data = [None, 'foo', dict(a=None)] assert_equal(data, substitute_variables(data, dict()), 'Nothing to substitute')
def test_substitute_variables(): data = ["$greeting", dict(a="${where} $where")] assert_equal(["hi", dict(a="there there")], substitute_variables(data, dict(greeting="hi", where="there"))) data = [None, "foo", dict(a=None)] assert_equal(data, substitute_variables(data, dict()), "Nothing to substitute")
def execute(request, design_id=None): response = {'status': -1, 'message': ''} if request.method != 'POST': response['message'] = _('A POST request is required.') app_name = get_app_name(request) query_server = get_query_server_config(app_name) query_type = beeswax.models.SavedQuery.TYPES_MAPPING[app_name] design = safe_get_design(request, query_type, design_id) try: query_form = get_query_form(request) if query_form.is_valid(): query_str = query_form.query.cleaned_data["query"] explain = request.GET.get('explain', 'false').lower() == 'true' design = save_design(request, query_form, query_type, design, False) if query_form.query.cleaned_data['is_parameterized']: # Parameterized query parameterization_form_cls = make_parameterization_form( query_str) if parameterization_form_cls: parameterization_form = parameterization_form_cls( request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables( query_str, parameterization_form.cleaned_data) query = HQLdesign(query_form, query_type=query_type) query._data_dict['query']['query'] = real_query try: if explain: return explain_directly( request, query, design, query_server) else: return execute_directly( request, query, design, query_server) except Exception, ex: db = dbms.get(request.user, query_server) error_message, log = expand_exception(ex, db) response['message'] = error_message return HttpResponse(json.dumps(response), mimetype="application/json") else: response['errors'] = parameterization_form.errors return HttpResponse(json.dumps(response), mimetype="application/json") # Non-parameterized query query = HQLdesign(query_form, query_type=query_type) if request.GET.get('explain', 'false').lower() == 'true': return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, design, query_server) else:
def _run_parameterized_query(request, design_id, explain): """ Given a design and arguments to parameterize that design, runs the query. - explain is a boolean to determine whether to run as an explain or as an execute. This is an extra "step" in the flow from execute_query. """ design = authorized_get_design(request, design_id, must_exist=True) # Reconstitute the form design_obj = beeswax.design.HQLdesign.loads(design.data) query_form = QueryForm() params = design_obj.get_query_dict() params.update(request.POST) databases = _get_db_choices(request) query_form.bind(params) query_form.query.fields["database"].choices = databases # Could not do it in the form if not query_form.is_valid(): raise PopupException(_("Query form is invalid: %s") % query_form.errors) query_str = query_form.query.cleaned_data["query"] app_name = get_app_name(request) query_server = get_query_server_config(app_name) query_type = SavedQuery.TYPES_MAPPING[app_name] parameterization_form_cls = make_parameterization_form(query_str) if not parameterization_form_cls: raise PopupException(_("Query is not parameterizable.")) parameterization_form = parameterization_form_cls(request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables(query_str, parameterization_form.cleaned_data) query = HQLdesign(query_form, query_type=query_type) query._data_dict["query"]["query"] = real_query try: if explain: return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, query_server, design) except Exception, ex: db = dbms.get(request.user, query_server) error_message, log = expand_exception(ex, db) return render( "execute.mako", request, { "action": reverse(get_app_name(request) + ":execute_query"), "design": design, "error_message": error_message, "form": query_form, "log": log, "autocomplete_base_url": reverse(get_app_name(request) + ":autocomplete", kwargs={}), }, )
def is_valid_parameterization(self, post_data): self.parameterization_form = self._parameterization_form(self.data)(post_data) if self.parameterization_form.is_valid(): self.parameterization_data = self.parameterization_form.cleaned_data self.parameterized_data = substitute_variables(copy.deepcopy(self.data), self.parameterization_data) return True else: return False
def _run_parameterized_query(request, design_id, explain): """ Given a design and arguments to parameterize that design, runs the query. - explain is a boolean to determine whether to run as an explain or as an execute. This is an extra "step" in the flow from execute_query. """ design = authorized_get_design(request, design_id, must_exist=True) # Reconstitute the form design_obj = beeswax.design.HQLdesign.loads(design.data) query_form = QueryForm() params = design_obj.get_query_dict() params.update(request.POST) databases = _get_db_choices(request) query_form.bind(params) query_form.query.fields['database'].choices = databases # Could not do it in the form if not query_form.is_valid(): raise PopupException(_("Query form is invalid: %s") % query_form.errors) query_str = query_form.query.cleaned_data["query"] app_name = get_app_name(request) query_server = get_query_server_config(app_name) query_type = SavedQuery.TYPES_MAPPING[app_name] parameterization_form_cls = make_parameterization_form(query_str) if not parameterization_form_cls: raise PopupException(_("Query is not parameterizable.")) parameterization_form = parameterization_form_cls(request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables(query_str, parameterization_form.cleaned_data) query = HQLdesign(query_form, query_type=query_type) query._data_dict['query']['query'] = real_query try: if explain: return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, query_server, design) except Exception, ex: db = dbms.get(request.user, query_server) error_message, log = expand_exception(ex, db) return render('execute.mako', request, { 'action': reverse(get_app_name(request) + ':execute_query'), 'design': design, 'error_message': error_message, 'form': query_form, 'log': log, 'autocomplete_base_url': reverse(get_app_name(request) + ':autocomplete', kwargs={}), })
def execute(request, query_id=None): response = {'status': -1, 'message': ''} if request.method != 'POST': response['message'] = _('A POST request is required.') app_name = get_app_name(request) query_server = get_query_server_config(app_name) query_type = beeswax.models.SavedQuery.TYPES_MAPPING[app_name] design = safe_get_design(request, query_type, query_id) try: query_form = get_query_form(request) if query_form.is_valid(): query_str = query_form.query.cleaned_data["query"] explain = request.GET.get('explain', 'false').lower() == 'true' design = save_design(request, query_form, query_type, design, False) if query_form.query.cleaned_data['is_parameterized']: # Parameterized query parameterization_form_cls = make_parameterization_form(query_str) if parameterization_form_cls: parameterization_form = parameterization_form_cls(request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables(query_str, parameterization_form.cleaned_data) query = HQLdesign(query_form, query_type=query_type) query._data_dict['query']['query'] = real_query try: if explain: return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, design, query_server) except Exception, ex: db = dbms.get(request.user, query_server) error_message, log = expand_exception(ex, db) response['message'] = error_message return HttpResponse(json.dumps(response), mimetype="application/json") else: response['errors'] = parameterization_form.errors return HttpResponse(json.dumps(response), mimetype="application/json") # non-parameterized query query = HQLdesign(query_form, query_type=query_type) if request.GET.get('explain', 'false').lower() == 'true': return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, design, query_server) else:
def _run_parameterized_query(request, design_id, explain): """ Given a design and arguments to parameterize that design, runs the query. - explain is a boolean to determine whether to run as an explain or as an execute. This is an extra "step" in the flow from execute_query. """ design = authorized_get_design(request, design_id, must_exist=True) # Reconstitute the form design_obj = beeswax.design.HQLdesign.loads(design.data) query_form = QueryForm() params = design_obj.get_query_dict() params.update(request.POST) query_form.bind(params) assert query_form.is_valid() query_str = query_form.query.cleaned_data["query"] query_server = get_query_server_config(get_app_name(request)) parameterization_form_cls = make_parameterization_form(query_str) if not parameterization_form_cls: raise PopupException(_("Query is not parameterizable.")) parameterization_form = parameterization_form_cls(request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables(query_str, parameterization_form.cleaned_data) query = HQLdesign(query_form) query._data_dict['query']['query'] = real_query try: if explain: return explain_directly(request, query, design, query_server) else: return execute_directly(request, query, query_server, design) except Exception, ex: db = dbms.get(request.user, query_server) error_message, log = expand_exception(ex, db) return render('execute.mako', request, { 'action': reverse(get_app_name(request) + ':execute_query'), 'design': design, 'error_message': error_message, 'form': query_form, 'log': log, 'autocomplete': json.dumps({}), })
def _run_parameterized_query(request, design_id, explain): """ Given a design and arguments to parameterize that design, runs the query. - explain is a boolean to determine whether to run as an explain or as an execute. This is an extra "step" in the flow from execute_query. """ design = authorized_get_design(request, design_id, must_exist=True) # Reconstitute the form design_obj = beeswax.design.HQLdesign.loads(design.data) query_form = beeswax.forms.query_form() params = design_obj.get_query_dict() params.update(request.POST) query_form.bind(params) assert query_form.is_valid() query_str = _strip_trailing_semicolon(query_form.query.cleaned_data["query"]) query_server = db_utils.get_query_server(query_form.query_servers.cleaned_data["server"]) parameterization_form_cls = make_parameterization_form(query_str) if not parameterization_form_cls: raise PopupException(_("Query is not parameterizable.")) parameterization_form = parameterization_form_cls(request.REQUEST, prefix="parameterization") if parameterization_form.is_valid(): real_query = substitute_variables(query_str, parameterization_form.cleaned_data) query_msg = make_beeswax_query(request, real_query, query_form) try: if explain: return explain_directly(request, query_str, query_msg, design, query_server) else: return execute_directly(request, query_msg, query_server, design) except BeeswaxException, ex: error_message, log = expand_exception(ex, query_server) return render('execute.mako', request, { 'action': urlresolvers.reverse(execute_query), 'design': design, 'error_message': error_message, 'form': query_form, 'log': log, })