diff --git a/lib/search.rb b/lib/search.rb index d7114133af7..dd41ed9db45 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -832,8 +832,8 @@ class Search ts_config = ActiveRecord::Base.connection.quote(ts_config) if ts_config all_terms = data.scan(/'([^']+)'\:\d+/).flatten all_terms.map! do |t| - t.split(/[\)\(&']/)[0] - end.compact! + t.split(/[\)\(&']/).find(&:present?) + end.reject!(&:blank?) query = ActiveRecord::Base.connection.quote( all_terms diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 15d67adf92c..877812d9d2e 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -945,12 +945,18 @@ describe Search do end end - it 'can parse complex strings using ts_query helper' do - str = " grigio:babel deprecated? " - str << "page page on Atmosphere](https://atmospherejs.com/grigio/babel)xxx: aaa.js:222 aaa'\"bbb" + context '#ts_query' do + it 'can parse complex strings using ts_query helper' do + str = " grigio:babel deprecated? " + str << "page page on Atmosphere](https://atmospherejs.com/grigio/babel)xxx: aaa.js:222 aaa'\"bbb" - ts_query = Search.ts_query(term: str, ts_config: "simple") - DB.exec("SELECT to_tsvector('bbb') @@ " << ts_query) + ts_query = Search.ts_query(term: str, ts_config: "simple") + expect { DB.exec("SELECT to_tsvector('bbb') @@ " << ts_query) }.to_not raise_error + + ts_query = Search.ts_query(term: "foo.bar/'&baz", ts_config: "simple") + expect { DB.exec("SELECT to_tsvector('bbb') @@ " << ts_query) }.to_not raise_error + expect(ts_query).to include("baz") + end end context '#word_to_date' do