Skip to content

Commit

Permalink
Refactor string value in expression into class
Browse files Browse the repository at this point in the history
  • Loading branch information
csutter committed Dec 11, 2023
1 parent 9055c91 commit 746f662
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -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
13 changes: 2 additions & 11 deletions app/services/discovery_engine/query/filters.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def filter_expression
].compact

expressions
.map { surround(_1, delimiter: "(", delimiter_end: ")") }
.map { "(#{_1})" }
.join(" AND ")
.presence
end
Expand Down Expand Up @@ -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

0 comments on commit 746f662

Please sign in to comment.