mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
First working prototype of columns and column_selects metadata
refs #292 Currently breaks if you forget to include the primary keys in the columns setting as we can no longer calculate the _next link using the returned data. Needs a whole lotta unit tests and documentation.
This commit is contained in:
parent
02870e5731
commit
2ef42bb980
1 changed files with 38 additions and 5 deletions
|
|
@ -277,16 +277,50 @@ class TableView(RowTableShared):
|
||||||
table_definition = table_definition_rows[0][0]
|
table_definition = table_definition_rows[0][0]
|
||||||
info = self.ds.inspect()
|
info = self.ds.inspect()
|
||||||
table_info = info[name]["tables"].get(table) or {}
|
table_info = info[name]["tables"].get(table) or {}
|
||||||
|
table_metadata = self.table_metadata(name, table)
|
||||||
pks = table_info.get("primary_keys") or []
|
pks = table_info.get("primary_keys") or []
|
||||||
use_rowid = not pks and not is_view
|
use_rowid = not pks and not is_view
|
||||||
|
|
||||||
|
# Figure out which columns to select and how
|
||||||
|
meta_columns = table_metadata.get("columns") or []
|
||||||
|
meta_column_selects = table_metadata.get("column_selects") or {}
|
||||||
|
columns_for_faceting = []
|
||||||
|
if not meta_columns:
|
||||||
|
meta_columns = table_info.get("columns", [])
|
||||||
|
if not meta_columns:
|
||||||
|
select_fragments = ['*']
|
||||||
|
else:
|
||||||
|
# Totally failed to detect event inspected columns
|
||||||
|
select_fragments = []
|
||||||
|
meta_column_selects_seen = set()
|
||||||
|
for col in meta_columns:
|
||||||
|
fragment = escape_sqlite(col)
|
||||||
|
if col in meta_column_selects:
|
||||||
|
fragment = '{} as {}'.format(
|
||||||
|
meta_column_selects[col], escape_sqlite(col)
|
||||||
|
)
|
||||||
|
meta_column_selects_seen.add(col)
|
||||||
|
columns_for_faceting.append(meta_column_selects[col])
|
||||||
|
else:
|
||||||
|
columns_for_faceting.append(col)
|
||||||
|
select_fragments.append(fragment)
|
||||||
|
# Anything left in meta_column_selects should be tagged on the end
|
||||||
|
for col, fragment in meta_column_selects.items():
|
||||||
|
if col not in meta_column_selects_seen:
|
||||||
|
meta_column_selects_seen.add(col)
|
||||||
|
select_fragments.append('{} as {}'.format(
|
||||||
|
fragment, escape_sqlite(col)
|
||||||
|
))
|
||||||
|
columns_for_faceting.append(fragment)
|
||||||
|
|
||||||
if use_rowid:
|
if use_rowid:
|
||||||
select = "rowid, *"
|
select_fragments.insert(0, 'rowid')
|
||||||
order_by = "rowid"
|
order_by = "rowid"
|
||||||
order_by_pks = "rowid"
|
order_by_pks = "rowid"
|
||||||
else:
|
else:
|
||||||
select = "*"
|
|
||||||
order_by_pks = ", ".join([escape_sqlite(pk) for pk in pks])
|
order_by_pks = ", ".join([escape_sqlite(pk) for pk in pks])
|
||||||
order_by = order_by_pks
|
order_by = order_by_pks
|
||||||
|
select = ', '.join(select_fragments)
|
||||||
|
|
||||||
if is_view:
|
if is_view:
|
||||||
order_by = ""
|
order_by = ""
|
||||||
|
|
@ -334,7 +368,6 @@ class TableView(RowTableShared):
|
||||||
forward_querystring=False,
|
forward_querystring=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
table_metadata = self.table_metadata(name, table)
|
|
||||||
units = table_metadata.get("units", {})
|
units = table_metadata.get("units", {})
|
||||||
filters = Filters(sorted(other_args.items()), units, ureg)
|
filters = Filters(sorted(other_args.items()), units, ureg)
|
||||||
where_clauses, params = filters.build_where_clauses()
|
where_clauses, params = filters.build_where_clauses()
|
||||||
|
|
@ -653,7 +686,7 @@ class TableView(RowTableShared):
|
||||||
# Detect suggested facets
|
# Detect suggested facets
|
||||||
suggested_facets = []
|
suggested_facets = []
|
||||||
if self.ds.config["suggest_facets"] and self.ds.config["allow_facet"]:
|
if self.ds.config["suggest_facets"] and self.ds.config["allow_facet"]:
|
||||||
for facet_column in columns:
|
for facet_column in (columns_for_faceting or columns):
|
||||||
if facet_column in facets:
|
if facet_column in facets:
|
||||||
continue
|
continue
|
||||||
if not self.ds.config["suggest_facets"]:
|
if not self.ds.config["suggest_facets"]:
|
||||||
|
|
@ -663,7 +696,7 @@ class TableView(RowTableShared):
|
||||||
{and_or_where} {column} is not null
|
{and_or_where} {column} is not null
|
||||||
limit {limit}
|
limit {limit}
|
||||||
'''.format(
|
'''.format(
|
||||||
column=escape_sqlite(facet_column),
|
column=columns_for_faceting and facet_column or escape_sqlite(facet_column),
|
||||||
from_sql=from_sql,
|
from_sql=from_sql,
|
||||||
and_or_where='and' if from_sql_where_clauses else 'where',
|
and_or_where='and' if from_sql_where_clauses else 'where',
|
||||||
limit=facet_size+1
|
limit=facet_size+1
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue