Skip to content

Commit

Permalink
Moved expand_foreign_keys() from TableView to Datasette
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed Apr 13, 2019
1 parent f2c767c commit 274ef43
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 42 deletions.
40 changes: 40 additions & 0 deletions datasette/app.py
Expand Up @@ -358,6 +358,46 @@ async def table_exists(self, database, table):
)
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:
Expand Down
44 changes: 2 additions & 42 deletions datasette/views/table.py
Expand Up @@ -53,46 +53,6 @@ async def expandable_columns(self, database, table):
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,
Expand Down Expand Up @@ -556,7 +516,7 @@ async def data(self, request, database, hash, table, default_labels=False, _nex
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:
Expand Down Expand Up @@ -617,7 +577,7 @@ async def data(self, request, database, hash, table, default_labels=False, _nex
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:
Expand Down

0 comments on commit 274ef43

Please sign in to comment.