JSON faceting now suggested even if column has blank strings, closes #1246

This commit is contained in:
Simon Willison 2021-02-28 19:44:04 -08:00
commit 47eb885cc2
2 changed files with 30 additions and 3 deletions

View file

@ -279,6 +279,7 @@ class ArrayFacet(Facet):
suggested_facet_sql = """ suggested_facet_sql = """
select distinct json_type({column}) select distinct json_type({column})
from ({sql}) from ({sql})
where {column} is not null and {column} != ''
""".format( """.format(
column=escape_sqlite(column), sql=self.sql column=escape_sqlite(column), sql=self.sql
) )
@ -298,9 +299,13 @@ class ArrayFacet(Facet):
v[0] v[0]
for v in await self.ds.execute( for v in await self.ds.execute(
self.database, self.database,
"select {column} from ({sql}) where {column} is not null and json_array_length({column}) > 0 limit 100".format( (
column=escape_sqlite(column), sql=self.sql "select {column} from ({sql}) "
), "where {column} is not null "
"and {column} != '' "
"and json_array_length({column}) > 0 "
"limit 100"
).format(column=escape_sqlite(column), sql=self.sql),
self.params, self.params,
truncate=False, truncate=False,
custom_time_limit=self.ds.setting( custom_time_limit=self.ds.setting(

View file

@ -1,3 +1,5 @@
from datasette.app import Datasette
from datasette.database import Database
from datasette.facets import ColumnFacet, ArrayFacet, DateFacet from datasette.facets import ColumnFacet, ArrayFacet, DateFacet
from datasette.utils.asgi import Request from datasette.utils.asgi import Request
from datasette.utils import detect_json1 from datasette.utils import detect_json1
@ -325,3 +327,23 @@ async def test_date_facet_results(app_client):
"truncated": False, "truncated": False,
} }
} == buckets } == buckets
@pytest.mark.asyncio
async def test_json_array_with_blanks_and_nulls():
ds = Datasette([], memory=True)
db = ds.add_database(Database(ds, memory_name="test_json_array"))
await db.execute_write("create table foo(json_column text)", block=True)
for value in ('["a", "b", "c"]', '["a", "b"]', "", None):
await db.execute_write(
"insert into foo (json_column) values (?)", [value], block=True
)
response = await ds.client.get("/test_json_array/foo.json")
data = response.json()
assert data["suggested_facets"] == [
{
"name": "json_column",
"type": "array",
"toggle_url": "http://localhost/test_json_array/foo.json?_facet_array=json_column",
}
]