From 07044bd130542870d5eb2e545988d0a24eb573ec Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 15 Nov 2021 15:41:07 -0800 Subject: [PATCH] SQL view-friendly arraycontains/arraynotcontains implementation, refs #448 --- datasette/filters.py | 10 ++-------- tests/test_filters.py | 11 +++++++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/datasette/filters.py b/datasette/filters.py index 2b859d99..cbd94415 100644 --- a/datasette/filters.py +++ b/datasette/filters.py @@ -149,19 +149,13 @@ class Filters: TemplatedFilter( "arraycontains", "array contains", - """rowid in ( - select {t}.rowid from {t}, json_each([{t}].[{c}]) j - where j.value = :{p} - )""", + """:{p} in (select value from json_each([{t}].[{c}]))""", '{c} contains "{v}"', ), TemplatedFilter( "arraynotcontains", "array does not contain", - """rowid not in ( - select {t}.rowid from {t}, json_each([{t}].[{c}]) j - where j.value = :{p} - )""", + """:{p} not in (select value from json_each([{t}].[{c}]))""", '{c} does not contain "{v}"', ), ] diff --git a/tests/test_filters.py b/tests/test_filters.py index f22b7b5c..d05ae80f 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -56,12 +56,15 @@ import pytest # Not in, and JSON array not in ((("foo__notin", "1,2,3"),), ["foo not in (:p0, :p1, :p2)"], ["1", "2", "3"]), ((("foo__notin", "[1,2,3]"),), ["foo not in (:p0, :p1, :p2)"], [1, 2, 3]), - # JSON arraycontains + # JSON arraycontains, arraynotcontains ( (("Availability+Info__arraycontains", "yes"),), - [ - "rowid in (\n select table.rowid from table, json_each([table].[Availability+Info]) j\n where j.value = :p0\n )" - ], + [":p0 in (select value from json_each([table].[Availability+Info]))"], + ["yes"], + ), + ( + (("Availability+Info__arraynotcontains", "yes"),), + [":p0 not in (select value from json_each([table].[Availability+Info]))"], ["yes"], ), ],