diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 25f78d69edafec336e3e35f868a198aeca60cdf7..975aa041c01d1d3eb3805f3da0d09755935e3a94 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,7 @@ Search API 1.x, dev (xxxx-xx-xx): --------------------------------- +- #2942846 by idebr, drunken monkey, borisson_: Added empty/not empty operators + to Views fulltext field filters. - #2940255 by drunken monkey: Updated the DB autocomplete implementation to the stable API version. - #2938646 by drunken monkey, Johnny vd Laar: Fixed item-boosts in database diff --git a/src/Plugin/views/filter/SearchApiText.php b/src/Plugin/views/filter/SearchApiText.php index a306990164554534c898347f5f61070d6e71fa30..aff9698611a61e3757be7d87a781dc7e578a4f5c 100644 --- a/src/Plugin/views/filter/SearchApiText.php +++ b/src/Plugin/views/filter/SearchApiText.php @@ -20,7 +20,13 @@ class SearchApiText extends SearchApiString { $operators['=']['title'] = $this->t('contains'); $operators['!=']['title'] = $this->t("doesn't contain"); - $operators = array_intersect_key($operators, ['=' => 1, '!=' => 1]); + $supported_operators = [ + '=' => 1, + '!=' => 1, + 'empty' => 1, + 'not empty' => 1, + ]; + $operators = array_intersect_key($operators, $supported_operators); return $operators; } diff --git a/tests/search_api_test_views/config/install/views.view.search_api_test_view.yml b/tests/search_api_test_views/config/install/views.view.search_api_test_view.yml index 7823869dc8d157a0427093671ba03d7bf47fd027..98df161cdf5364a1412cbc828d7fd1cf6ef9509a 100644 --- a/tests/search_api_test_views/config/install/views.view.search_api_test_view.yml +++ b/tests/search_api_test_views/config/install/views.view.search_api_test_view.yml @@ -176,6 +176,31 @@ display: anonymous: '0' administrator: '0' is_grouped: false + name: + plugin_id: search_api_text + id: name + table: search_api_index_database_search_index + field: name + relationship: none + admin_label: '' + operator: '=' + group: 1 + exposed: true + expose: + operator_id: name_op + label: '' + description: '' + use_operator: true + operator: name_op + identifier: name + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + is_grouped: false search_api_language: plugin_id: search_api_language id: search_api_language diff --git a/tests/src/Functional/ViewsTest.php b/tests/src/Functional/ViewsTest.php index 0048b90e1fd51e6261275981c9e0af8096820bcf..4a1106fddd5d088a015948a3cd6bbe277af16c95 100644 --- a/tests/src/Functional/ViewsTest.php +++ b/tests/src/Functional/ViewsTest.php @@ -197,6 +197,24 @@ class ViewsTest extends SearchApiBrowserTestBase { ]; $this->checkResults($query, [1, 2, 4, 5], 'Search with Keywords "not empty" filter'); + $query = [ + 'name[value]' => 'foo', + ]; + $this->checkResults($query, [1, 2, 4], 'Search with Name "contains" filter'); + $query = [ + 'name[value]' => 'foo', + 'name_op' => '!=', + ]; + $this->checkResults($query, [3, 5], 'Search with Name "doesn\'t contain" filter'); + $query = [ + 'name_op' => 'empty', + ]; + $this->checkResults($query, [], 'Search with Name "empty" filter'); + $query = [ + 'name_op' => 'not empty', + ]; + $this->checkResults($query, [1, 2, 3, 4, 5], 'Search with Name "not empty" filter'); + $query = [ 'language' => ['***LANGUAGE_site_default***'], ];