class Sequel::SQL::EscapedLikeExpression

Represents an pattern match SQL expression, where the pattern can depend upon interpolated values in a database-dependent manner.

Public Class Methods

new(expr, case_sensitive, placeholder_pattern, placeholder_values) click to toggle source

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
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

Public Instance Methods

to_s_append(ds, sql) click to toggle source

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
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