Skip to content

Commit

Permalink
Attempt at fixing scheduled parameterized queries
Browse files Browse the repository at this point in the history
- generating query_hash with query expanded with default parameters
  values to match query_result with queries hash
- added default parameters related properties in Query model class
  • Loading branch information
Rémi Laurent committed Oct 30, 2023
1 parent ae77e72 commit ea4a1c2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 deletions.
13 changes: 12 additions & 1 deletion redash/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,17 @@ def lowercase_name(cls):
def parameters(self):
return self.options.get("parameters", [])

@property
def default_parameters_query_text(self):
if any(self.parameters_dict):
return self.parameterized.apply(self.parameters_dict).query
else:
return self.query_text

@property
def parameters_dict(self):
return { p["name"]: p.get("value") for p in self.parameters }

@property
def parameterized(self):
return ParameterizedQuery(self.query_text, self.parameters, self.org)
Expand All @@ -831,7 +842,7 @@ def dashboard_api_keys(self):
def update_query_hash(self):
should_apply_auto_limit = self.options.get("apply_auto_limit", False) if self.options else False
query_runner = self.data_source.query_runner if self.data_source else BaseQueryRunner({})
self.query_hash = query_runner.gen_query_hash(self.query_text, should_apply_auto_limit)
self.query_hash = query_runner.gen_query_hash(self.default_parameters_query_text, should_apply_auto_limit)


@listens_for(Query, "before_insert")
Expand Down
32 changes: 15 additions & 17 deletions redash/tasks/queries/maintenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,23 +52,21 @@ def _should_refresh_query(query):


def _apply_default_parameters(query):
parameters = {p["name"]: p.get("value") for p in query.parameters}
if any(parameters):
try:
return query.parameterized.apply(parameters).query
except InvalidParameterError as e:
error = f"Skipping refresh of {query.id} because of invalid parameters: {str(e)}"
track_failure(query, error)
raise
except QueryDetachedFromDataSourceError as e:
error = (
f"Skipping refresh of {query.id} because a related dropdown "
f"query ({e.query_id}) is unattached to any datasource."
)
track_failure(query, error)
raise
else:
return query.query_text
try:
return query.default_parameters_query_text
except InvalidParameterError as e:
error = u"Skipping refresh of {} because of invalid parameters: {}".format(
query.id, str(e)
)
track_failure(query, error)
raise
except QueryDetachedFromDataSourceError as e:
error = (
"Skipping refresh of {} because a related dropdown "
"query ({}) is unattached to any datasource."
).format(query.id, e.query_id)
track_failure(query, error)
raise


class RefreshQueriesError(Exception):
Expand Down

0 comments on commit ea4a1c2

Please sign in to comment.