From 2e0a00ab46aaa2bd9f4e91fffadb8babee41bcba Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 26 Jun 2025 12:35:49 +0200 Subject: [PATCH] Fix search operators sometimes getting lost (#35190) --- app/lib/search_query_transformer.rb | 2 +- spec/lib/search_query_transformer_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) 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