From 83afd813575cd29207cedf85de00ab0c79b45958 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Tue, 18 Jan 2022 21:29:55 -0800 Subject: [PATCH] Anchor regular expressions by default [skip ci] --- CHANGELOG.md | 1 + lib/searchkick/query.rb | 10 ++-------- test/where_test.rb | 28 ++++++++-------------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 297a42b..cf2cb7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## 5.0.0 (unreleased) +- Anchor regular expressions by default - Raise error when `search` called on relations - Raise `ArgumentError` (instead of warning) for invalid regular expression modifiers - Dropped support for Ruby < 2.6 and Active Record < 5.2 diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 18f3a01..308fb50 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -1036,24 +1036,18 @@ module Searchkick {bool: {must_not: {exists: {field: field}}}} elsif value.is_a?(Regexp) source = value.source - unless source.start_with?("\\A") && source.end_with?("\\z") - # https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html - Searchkick.warn("Regular expressions are always anchored in Elasticsearch") - end # TODO handle other anchor characters, like ^, $, \Z if source.start_with?("\\A") source = source[2..-1] else - # TODO uncomment in Searchkick 5 - # source = ".*#{source}" + source = ".*#{source}" end if source.end_with?("\\z") source = source[0..-3] else - # TODO uncomment in Searchkick 5 - # source = "#{source}.*" + source = "#{source}.*" end if below710? diff --git a/test/where_test.rb b/test/where_test.rb index bfb423f..b7e3bc4 100644 --- a/test/where_test.rb +++ b/test/where_test.rb @@ -113,31 +113,19 @@ class WhereTest < Minitest::Test def test_regexp_not_anchored store_names ["abcde"] - # regular expressions are always anchored right now - # TODO change in future release - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", [], where: {name: /abcd/} - end - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", [], where: {name: /bcde/} - end - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", ["abcde"], where: {name: /abcde/} - end - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", ["abcde"], where: {name: /.*bcd.*/} - end + assert_search "*", ["abcde"], where: {name: /abcd/} + assert_search "*", ["abcde"], where: {name: /bcde/} + assert_search "*", ["abcde"], where: {name: /abcde/} + assert_search "*", ["abcde"], where: {name: /.*bcd.*/} end def test_regexp_anchored store_names ["abcde"] assert_search "*", ["abcde"], where: {name: /\Aabcde\z/} - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", [], where: {name: /\Abcd/} - end - assert_warns "Regular expressions are always anchored in Elasticsearch" do - assert_search "*", [], where: {name: /bcd\z/} - end + assert_search "*", ["abcde"], where: {name: /\Aabc/} + assert_search "*", ["abcde"], where: {name: /cde\z/} + assert_search "*", [], where: {name: /\Abcd/} + assert_search "*", [], where: {name: /bcd\z/} end def test_regexp_case -- libgit2 0.21.0