diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb index 59352c6e6..fae240328 100644 --- a/app/lib/search_query_transformer.rb +++ b/app/lib/search_query_transformer.rb @@ -35,7 +35,7 @@ class SearchQueryTransformer < Parslet::Transform private def clauses_by_operator - @clauses_by_operator ||= @clauses.compact.chunk(&:operator).to_h + @clauses_by_operator ||= @clauses.compact.group_by(&:operator) end def flags_from_clauses! diff --git a/spec/lib/search_query_transformer_spec.rb b/spec/lib/search_query_transformer_spec.rb index b69e3afc9..e77d54f36 100644 --- a/spec/lib/search_query_transformer_spec.rb +++ b/spec/lib/search_query_transformer_spec.rb @@ -129,4 +129,24 @@ RSpec.describe SearchQueryTransformer do end end end + + context 'with multiple prefix clauses before a search term' do + let(:query) { 'from:me has:media foo' } + + it 'transforms clauses' do + expect(subject.send(:must_clauses).map(&:term)).to contain_exactly('foo') + expect(subject.send(:must_not_clauses)).to be_empty + expect(subject.send(:filter_clauses).map(&:prefix)).to contain_exactly('from', 'has') + end + end + + context 'with a search term between two prefix clauses' do + let(:query) { 'from:me foo has:media' } + + it 'transforms clauses' do + expect(subject.send(:must_clauses).map(&:term)).to contain_exactly('foo') + expect(subject.send(:must_not_clauses)).to be_empty + expect(subject.send(:filter_clauses).map(&:prefix)).to contain_exactly('from', 'has') + end + end end