class Sequel::Postgres::PGRange::Parser

  1. lib/sequel/extensions/pg_range.rb
Superclass: Object

Creates callable objects that convert strings into PGRange instances.

Methods

Public Class

  1. new

Public Instance

  1. call
  2. converter
  3. db_type

Attributes

converter [R]

A callable object to convert the beginning and ending of the range into the appropriate ruby type.

db_type [R]

The database range type for this parser (e.g. 'int4range'), automatically setting the db_type for the returned PGRange instances.

Public Class methods

new (db_type, converter=nil)

Set the db_type and converter on initialization.

[show source]
   # File lib/sequel/extensions/pg_range.rb
89 def initialize(db_type, converter=nil)
90   @db_type = db_type.to_s.dup.freeze if db_type
91   @converter = converter
92 end

Public Instance methods

call (string)

Parse the range type input string into a PGRange value.

[show source]
    # File lib/sequel/extensions/pg_range.rb
 95 def call(string)
 96   if string == 'empty'
 97     return PGRange.empty(db_type)
 98   end
 99 
100   raise(InvalidValue, "invalid or unhandled range format: #{string.inspect}") unless matches = /\A(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))\z/.match(string)
101 
102   exclude_begin = matches[1] == '('
103   exclude_end = matches[6] == ')'
104 
105   # If the input is quoted, it needs to be unescaped.  Also, quoted input isn't
106   # checked for emptiness, since the empty quoted string is considered an
107   # element that happens to be the empty string, while an unquoted empty string
108   # is considered unbounded.
109   #
110   # While PostgreSQL allows pure escaping for input (without quoting), it appears
111   # to always use the quoted output form when characters need to be escaped, so
112   # there isn't a need to unescape unquoted output.
113   if beg = matches[3]
114     beg.gsub!(/\\(.)/, '\1')
115   else
116     beg = matches[2] unless matches[2].empty?
117   end
118   if en = matches[5]
119     en.gsub!(/\\(.)/, '\1')
120   else
121     en = matches[4] unless matches[4].empty?
122   end
123 
124   if c = converter
125     beg = c.call(beg) if beg
126     en = c.call(en) if en
127   end
128 
129   PGRange.new(beg, en, :exclude_begin=>exclude_begin, :exclude_end=>exclude_end, :db_type=>db_type)
130 end