From 746f6623b5f3607865b45e6d8df593921b73b320 Mon Sep 17 00:00:00 2001 From: Christian Sutter Date: Mon, 11 Dec 2023 11:47:48 +0000 Subject: [PATCH] Refactor string value in expression into class --- .../query/filter_expressions/string_value.rb | 19 +++++++++++++++++++ .../discovery_engine/query/filters.rb | 13 ++----------- 2 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 app/services/discovery_engine/query/filter_expressions/string_value.rb diff --git a/app/services/discovery_engine/query/filter_expressions/string_value.rb b/app/services/discovery_engine/query/filter_expressions/string_value.rb new file mode 100644 index 0000000..3c8b513 --- /dev/null +++ b/app/services/discovery_engine/query/filter_expressions/string_value.rb @@ -0,0 +1,19 @@ +module DiscoveryEngine::Query::FilterExpressions + class StringValue + def initialize(raw_string) + @raw_string = raw_string + end + + def to_s + "\"#{escaped_string}\"" + end + + private + + attr_reader :raw_string + + def escaped_string + raw_string.gsub(/(["\\])/, '\\\\\1') + end + end +end diff --git a/app/services/discovery_engine/query/filters.rb b/app/services/discovery_engine/query/filters.rb index 62dcf68..e6b0bcf 100644 --- a/app/services/discovery_engine/query/filters.rb +++ b/app/services/discovery_engine/query/filters.rb @@ -14,7 +14,7 @@ def filter_expression ].compact expressions - .map { surround(_1, delimiter: "(", delimiter_end: ")") } + .map { "(#{_1})" } .join(" AND ") .presence end @@ -46,19 +46,10 @@ def any_filter(field, value_or_values) end def string_filter_expression(field, value_or_values, negate: false) - values = Array(value_or_values).map do |value| - # Input strings need to be wrapped in double quotes and have double quotes or backslashes - # escaped for Discovery Engine's filter syntax - escaped_value = value.gsub(/(["\\])/, '\\\\\1') - surround(escaped_value, delimiter: '"') - end + values = Array(value_or_values).map { FilterExpressions::StringValue.new(_1) } return if values.blank? "#{negate ? 'NOT ' : ''}#{field}: ANY(#{values.join(',')})" end - - def surround(str, delimiter:, delimiter_end: delimiter) - "#{delimiter}#{str}#{delimiter_end}" - end end end