mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Tests should now pass for facets branch
This commit is contained in:
parent
63e52c0936
commit
f6cdca3f6e
4 changed files with 23 additions and 8 deletions
|
|
@ -605,7 +605,7 @@ class Datasette:
|
|||
truncated = False
|
||||
except sqlite3.OperationalError as e:
|
||||
if e.args == ('interrupted',):
|
||||
raise InterruptedError(e)
|
||||
raise InterruptedError(e, sql, params)
|
||||
if log_sql_errors:
|
||||
print(
|
||||
"ERROR: conn={}, sql = {}, params = {}: {}".format(
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ from datasette.utils import (
|
|||
path_with_added_args,
|
||||
path_with_removed_args,
|
||||
detect_json1,
|
||||
InterruptedError,
|
||||
InvalidSql,
|
||||
sqlite3,
|
||||
)
|
||||
|
|
@ -142,7 +143,7 @@ class ColumnFacet(Facet):
|
|||
),
|
||||
})
|
||||
except InterruptedError:
|
||||
pass
|
||||
continue
|
||||
return suggested_facets
|
||||
|
||||
async def facet_results(self, sql, params):
|
||||
|
|
@ -238,6 +239,9 @@ class ManyToManyFacet(Facet):
|
|||
all_foreign_keys = await self.ds.execute_against_connection_in_thread(
|
||||
self.database, get_all_foreign_keys
|
||||
)
|
||||
if not all_foreign_keys.get(self.table):
|
||||
# It's probably a view
|
||||
return []
|
||||
incoming = all_foreign_keys[self.table]["incoming"]
|
||||
# Do any of these incoming tables have exactly two outgoing keys?
|
||||
for fk in incoming:
|
||||
|
|
@ -377,7 +381,7 @@ class DateFacet(Facet):
|
|||
suggested_facet_sql = """
|
||||
select date({column}) from (
|
||||
{sql}
|
||||
) limit 100;
|
||||
) where {column} glob "????-??-??" limit 100;
|
||||
""".format(
|
||||
column=escape_sqlite(column),
|
||||
sql=sql,
|
||||
|
|
@ -429,7 +433,7 @@ class DateFacet(Facet):
|
|||
{sql}
|
||||
)
|
||||
where date({col}) is not null
|
||||
group by date({col}) order by date({col}) desc limit {limit}
|
||||
group by date({col}) order by count desc limit {limit}
|
||||
""".format(
|
||||
col=escape_sqlite(column),
|
||||
sql=sql,
|
||||
|
|
@ -577,7 +581,6 @@ class EmojiFacet(Facet):
|
|||
),
|
||||
})
|
||||
except (InterruptedError, sqlite3.OperationalError) as e:
|
||||
print(" oh no ", e)
|
||||
continue
|
||||
return suggested_facets
|
||||
|
||||
|
|
|
|||
|
|
@ -464,11 +464,14 @@ class TableView(RowTableShared):
|
|||
else:
|
||||
page_size = self.ds.page_size
|
||||
|
||||
sql = "select {select} from {table_name} {where}{order_by}limit {limit}{offset}".format(
|
||||
sql_no_limit = "select {select} from {table_name} {where}{order_by}".format(
|
||||
select=select,
|
||||
table_name=escape_sqlite(table),
|
||||
where=where_clause,
|
||||
order_by=order_by,
|
||||
)
|
||||
sql = "{sql_no_limit} limit {limit}{offset}".format(
|
||||
sql_no_limit=sql_no_limit.rstrip(),
|
||||
limit=page_size + 1,
|
||||
offset=offset,
|
||||
)
|
||||
|
|
@ -498,7 +501,7 @@ class TableView(RowTableShared):
|
|||
|
||||
for facet in facet_instances:
|
||||
instance_facet_results, instance_facets_timed_out = await facet.facet_results(
|
||||
sql, params,
|
||||
sql_no_limit, params,
|
||||
)
|
||||
facet_results.update(instance_facet_results)
|
||||
facets_timed_out.extend(instance_facets_timed_out)
|
||||
|
|
@ -605,7 +608,7 @@ class TableView(RowTableShared):
|
|||
for facet in facet_instances:
|
||||
# TODO: ensure facet is not suggested if it is already active
|
||||
# used to use 'if facet_column in facets' for this
|
||||
suggested_facets.extend(await facet.suggest(sql, params, filtered_table_rows_count))
|
||||
suggested_facets.extend(await facet.suggest(sql_no_limit, params, filtered_table_rows_count))
|
||||
|
||||
# human_description_en combines filters AND search, if provided
|
||||
human_description_en = filters.human_description_en(extra=search_descriptions)
|
||||
|
|
|
|||
|
|
@ -551,3 +551,12 @@ The ``template``, ``database`` and ``table`` options can be used to return diffe
|
|||
The ``datasette`` instance is provided primarily so that you can consult any plugin configuration options that may have been set, using the ``datasette.plugin_config(plugin_name)`` method documented above.
|
||||
|
||||
The string that you return from this function will be treated as "safe" for inclusion in a ``<script>`` block directly in the page, so it is up to you to apply any necessary escaping.
|
||||
|
||||
.. _plugin_hook_register_facet_classes:
|
||||
|
||||
register_facet_classes()
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Return a list of additional ``Facet`` subclasses that can be used to suggest and render facets.
|
||||
|
||||
For examples of how this can be used, see `datasette/facets.py <https://github.com/simonw/datasette/blob/master/datasette/facets.py>`__.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue