From 274ef43bb7b129ddc2e68805b4f4ff3776fb9503 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 13 Apr 2019 11:48:00 -0700 Subject: [PATCH] Moved expand_foreign_keys() from TableView to Datasette --- datasette/app.py | 40 ++++++++++++++++++++++++++++++++++++ datasette/views/table.py | 44 ++-------------------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index 0b992fbe..f998f390 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -358,6 +358,46 @@ class Datasette: ) return bool(results.rows) + async def expand_foreign_keys(self, database, table, column, values): + "Returns dict mapping (column, value) -> label" + labeled_fks = {} + foreign_keys = await self.foreign_keys_for_table(database, table) + # Find the foreign_key for this column + try: + fk = [ + foreign_key for foreign_key in foreign_keys + if foreign_key["column"] == column + ][0] + except IndexError: + return {} + label_column = await self.label_column_for_table(database, fk["other_table"]) + if not label_column: + return { + (fk["column"], value): str(value) + for value in values + } + labeled_fks = {} + sql = ''' + select {other_column}, {label_column} + from {other_table} + where {other_column} in ({placeholders}) + '''.format( + other_column=escape_sqlite(fk["other_column"]), + label_column=escape_sqlite(label_column), + other_table=escape_sqlite(fk["other_table"]), + placeholders=", ".join(["?"] * len(set(values))), + ) + try: + results = await self.execute( + database, sql, list(set(values)) + ) + except InterruptedError: + pass + else: + for id, value in results: + labeled_fks[(fk["column"], id)] = value + return labeled_fks + def inspect(self): " Inspect the database and return a dictionary of table metadata " if self._inspect: diff --git a/datasette/views/table.py b/datasette/views/table.py index efd6c0e2..5e95aeed 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -53,46 +53,6 @@ class RowTableShared(BaseView): expandables.append((fk, label_column)) return expandables - async def expand_foreign_keys(self, database, table, column, values): - "Returns dict mapping (column, value) -> label" - labeled_fks = {} - foreign_keys = await self.ds.foreign_keys_for_table(database, table) - # Find the foreign_key for this column - try: - fk = [ - foreign_key for foreign_key in foreign_keys - if foreign_key["column"] == column - ][0] - except IndexError: - return {} - label_column = await self.ds.label_column_for_table(database, fk["other_table"]) - if not label_column: - return { - (fk["column"], value): str(value) - for value in values - } - labeled_fks = {} - sql = ''' - select {other_column}, {label_column} - from {other_table} - where {other_column} in ({placeholders}) - '''.format( - other_column=escape_sqlite(fk["other_column"]), - label_column=escape_sqlite(label_column), - other_table=escape_sqlite(fk["other_table"]), - placeholders=", ".join(["?"] * len(set(values))), - ) - try: - results = await self.ds.execute( - database, sql, list(set(values)) - ) - except InterruptedError: - pass - else: - for id, value in results: - labeled_fks[(fk["column"], id)] = value - return labeled_fks - async def display_columns_and_rows( self, database, @@ -556,7 +516,7 @@ class TableView(RowTableShared): facet_rows = facet_rows_results.rows[:facet_size] # Attempt to expand foreign keys into labels values = [row["value"] for row in facet_rows] - expanded = (await self.expand_foreign_keys( + expanded = (await self.ds.expand_foreign_keys( database, table, column, values )) for row in facet_rows: @@ -617,7 +577,7 @@ class TableView(RowTableShared): column_index = columns.index(column) values = [row[column_index] for row in rows] # Expand them - expanded_labels.update(await self.expand_foreign_keys( + expanded_labels.update(await self.ds.expand_foreign_keys( database, table, column, values )) if expanded_labels: