diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb index 8849acf12..06055eecd 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 5817e3d1d..bbe5dce74 100644 --- a/spec/lib/search_query_transformer_spec.rb +++ b/spec/lib/search_query_transformer_spec.rb @@ -77,4 +77,24 @@ describe SearchQueryTransformer do expect(subject.send(:filter_clauses).map(&:term)).to contain_exactly(lt: '2022-01-01 23:00', time_zone: 'UTC') 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