mirror of
https://github.com/simonw/datasette.git
synced 2026-06-12 03:57:00 +02:00
QueryView: only resolve extras for renderer formats, single metadata path
Extras were resolved before the format dispatch, so a .csv request carrying ?_extra= parameters paid for extras (including per-cell render_cell plugin calls) whose results were then discarded, and the HTML path duplicated the stored-query metadata derivation. Extras now resolve inside the renderer-dispatch branch only, and both consumers share a query_metadata() helper that no longer fetches database metadata just to throw it away for stored queries. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
bbf0424c45
commit
6babd23cec
1 changed files with 26 additions and 29 deletions
|
|
@ -700,33 +700,12 @@ class QueryView(View):
|
|||
except DatasetteError:
|
||||
raise
|
||||
|
||||
extras = extra_names_from_request(request)
|
||||
metadata = None
|
||||
data = {"ok": True, "rows": rows, "columns": columns}
|
||||
if extras:
|
||||
metadata = await datasette.get_database_metadata(database)
|
||||
async def query_metadata():
|
||||
if stored_query:
|
||||
metadata = stored_query_to_dict(stored_query)
|
||||
metadata.pop("source", None)
|
||||
query_extra_context = QueryExtraContext(
|
||||
datasette=datasette,
|
||||
request=request,
|
||||
db=db,
|
||||
database_name=database,
|
||||
private=private,
|
||||
rows=rows,
|
||||
columns=columns,
|
||||
sql=sql,
|
||||
params=named_parameter_values,
|
||||
query_name=stored_query.name if stored_query else None,
|
||||
stored_query=stored_query,
|
||||
stored_query_write=stored_query_write,
|
||||
error=query_error,
|
||||
metadata=metadata,
|
||||
extras=extras,
|
||||
extra_registry=table_extra_registry,
|
||||
)
|
||||
data.update(await resolve_query_extras(extras, query_extra_context))
|
||||
return metadata
|
||||
return await datasette.get_database_metadata(database)
|
||||
|
||||
# Handle formats from plugins
|
||||
if format_ == "csv":
|
||||
|
|
@ -740,6 +719,28 @@ class QueryView(View):
|
|||
|
||||
return await stream_csv(datasette, fetch_data_for_csv, request, db.name)
|
||||
elif format_ in datasette.renderers.keys():
|
||||
data = {"ok": True, "rows": rows, "columns": columns}
|
||||
extras = extra_names_from_request(request)
|
||||
if extras:
|
||||
query_extra_context = QueryExtraContext(
|
||||
datasette=datasette,
|
||||
request=request,
|
||||
db=db,
|
||||
database_name=database,
|
||||
private=private,
|
||||
rows=rows,
|
||||
columns=columns,
|
||||
sql=sql,
|
||||
params=named_parameter_values,
|
||||
query_name=stored_query.name if stored_query else None,
|
||||
stored_query=stored_query,
|
||||
stored_query_write=stored_query_write,
|
||||
error=query_error,
|
||||
metadata=await query_metadata(),
|
||||
extras=extras,
|
||||
extra_registry=table_extra_registry,
|
||||
)
|
||||
data.update(await resolve_query_extras(extras, query_extra_context))
|
||||
# Dispatch request to the correct output format renderer
|
||||
# (CSV is not handled here due to streaming)
|
||||
result = call_with_supported_arguments(
|
||||
|
|
@ -806,11 +807,7 @@ class QueryView(View):
|
|||
)
|
||||
}
|
||||
)
|
||||
if metadata is None:
|
||||
metadata = await datasette.get_database_metadata(database)
|
||||
if stored_query:
|
||||
metadata = stored_query_to_dict(stored_query)
|
||||
metadata.pop("source", None)
|
||||
metadata = await query_metadata()
|
||||
renderers = {}
|
||||
for key, (_, can_render) in datasette.renderers.items():
|
||||
it_can_render = call_with_supported_arguments(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue