From 4bb49848697e40b8b9a1557be42b8e59eac965b3 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 20 Mar 2023 13:43:28 -0700 Subject: [PATCH] Fix bug with facet_array= not returning facets Refs https://github.com/simonw/datasette/pull/1999#issuecomment-1476898261 --- datasette/views/table.py | 2 +- tests/test_table_api.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/datasette/views/table.py b/datasette/views/table.py index c3c00faa..32e989c0 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -1954,7 +1954,7 @@ async def table_view_data( # Resolve extras extras = _get_extras(request) - if request.args.getlist("_facet"): + if any(k for k in request.args.keys() if k == "_facet" or k.startswith("_facet_")): extras.add("facet_results") if request.args.get("_shape") == "object": extras.add("primary_keys") diff --git a/tests/test_table_api.py b/tests/test_table_api.py index 225a24e4..cd664ffb 100644 --- a/tests/test_table_api.py +++ b/tests/test_table_api.py @@ -927,6 +927,36 @@ async def test_facets(ds_client, path, expected_facet_results): assert expected_facet_results == facet_results["results"] +@pytest.mark.asyncio +@pytest.mark.skipif(not detect_json1(), reason="requires JSON1 extension") +async def test_facets_array(ds_client): + response = await ds_client.get("/fixtures/facetable.json?_facet_array=tags") + facet_results = response.json()["facet_results"] + assert facet_results["results"]["tags"]["results"] == [ + { + "value": "tag1", + "label": "tag1", + "count": 2, + "toggle_url": "http://localhost/fixtures/facetable.json?_facet_array=tags&tags__arraycontains=tag1", + "selected": False, + }, + { + "value": "tag2", + "label": "tag2", + "count": 1, + "toggle_url": "http://localhost/fixtures/facetable.json?_facet_array=tags&tags__arraycontains=tag2", + "selected": False, + }, + { + "value": "tag3", + "label": "tag3", + "count": 1, + "toggle_url": "http://localhost/fixtures/facetable.json?_facet_array=tags&tags__arraycontains=tag3", + "selected": False, + }, + ] + + @pytest.mark.asyncio async def test_suggested_facets(ds_client): suggestions = [