| Class | Sequel::SQL::EscapedLikeExpression |
| In: |
lib/sequel/extensions/escaped_like.rb
|
| Parent: | Expression |
Represents an pattern match SQL expression, where the pattern can depend upon interpolated values in a database-dependent manner.
Initialize the expression. Arguments:
| expr : | Right hand site of LIKE/ILIKE operator, what you are matching against the pattern |
| case_insensitive : | Whether the match is case sensitive |
| placeholder_pattern : | The pattern to match against, with +?+ for the placeholders |
| placeholder_values : | The string values for each +?+ in the placeholder pattern. Should be an array of strings, though it can be a single string if there is only a single placeholder. |
# File lib/sequel/extensions/escaped_like.rb, line 37
37: def initialize(expr, case_sensitive, placeholder_pattern, placeholder_values)
38: @expr = expr
39: @method = case_sensitive ? :like : :ilike
40: @pattern = placeholder_pattern
41: unless placeholder_values.is_a?(Array)
42: placeholder_values = [placeholder_values].freeze
43: end
44: @values = placeholder_values
45: freeze
46: end
Interpolate the pattern values into the placeholder pattern to get the final pattern, now that we have access to the dataset. Use the expression and final pattern and add an appropriate LIKE/ILIKE expression to the SQL being built.
# File lib/sequel/extensions/escaped_like.rb, line 51
51: def to_s_append(ds, sql)
52: i = -1
53: match_len = @values.length - 1
54: like_pattern = String.new
55: pattern = @pattern
56: while true
57: previous, q, pattern = pattern.partition('?')
58: like_pattern << previous
59:
60: unless q.empty?
61: if i == match_len
62: raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
63: end
64: like_pattern << ds.escape_like(@values.at(i+=1))
65: end
66:
67: if pattern.empty?
68: unless i == match_len
69: raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{@values.length}) for escaped like expression: #{@pattern.inspect}"
70: end
71: break
72: end
73: end
74: ds.literal_append(sql, Sequel.send(@method, @expr, like_pattern))
75: end