module ArelExtensions::Visitors

Public Class Methods

strftime_to_format(format, mapping) click to toggle source

Convert date format in strftime syntax to whatever the RDBMs wants, based on the table of conversion mapping.

# File lib/arel_extensions/visitors/convert_format.rb, line 5
def self.strftime_to_format format, mapping
  @mapping_regexps ||= {}
  @mapping_regexps[mapping] ||=
    Regexp.new(
      mapping
        .keys
        .map{|k| Regexp.escape(k)}
        .join('|')
    )

  regexp = @mapping_regexps[mapping]
  s = StringScanner.new format
  res = StringIO.new
  while !s.eos?
    res <<
      case
      when s.scan(regexp)
        if v = mapping[s.matched]
          v
        else
          # Should never happen.
          s.matched
        end
      when s.scan(/[^%]+/)
        s.matched
      when s.scan(/./)
        s.matched
      end
  end
  res.string
end

Public Instance Methods

is_distinct_from(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 45
def is_distinct_from(o, collector)
  collector << "DECODE("
  collector = visit [o.left, o.right, 0, 1], collector
  collector << ")"
end
visit_ArelExtensions_Nodes_Json(o,collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 51
def visit_ArelExtensions_Nodes_Json o,collector
  case o.dict
  when Array
    collector << 'json_array('
    o.dict.each.with_index do |v,i|
      if i != 0
        collector << Arel::Visitors::MySQL::COMMA
      end
      collector = visit v, collector
    end
    collector << ')'
  when Hash
    collector << 'json__object('
    o.dict.each.with_index do |(k,v),i|
      if i != 0
        collector << Arel::Visitors::MySQL::COMMA
      end
      collector << 'KEY '
      collector = visit k, collector
      collector << ' IS '
      collector = visit v, collector
      collector << 'FORMAT JSON'
    end
    collector << ')'
  when String, Numeric, TrueClass, FalseClass
    collector = visit Arel::Nodes.build_quoted("#{o.dict}"), collector
    collector << ' FORMAT JSON'
  when NilClass
    collector  << %Q['null' FORMAT JSON]
  when Arel::Attributes::Attribute
    collector = visit o.dict.cast('JSON'), collector
  else
    collector = visit o.dict, collector
    collector << ' FORMAT JSON'
  end
  collector
end
visit_Arel_Nodes_BindParam(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 41
def visit_Arel_Nodes_BindParam(o, collector)
  collector.add_bind(o.value) { |i| ":a#{i}" }
end
visit_Arel_Nodes_Except(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 24
def visit_Arel_Nodes_Except(o, collector)
  collector << "( "
  collector = infix_value o, collector, " MINUS "
  collector << " )"
end
visit_Arel_Nodes_Limit(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 12
def visit_Arel_Nodes_Limit(o, collector)
  collector << "FETCH FIRST "
  collector = visit o.expr, collector
  collector << " ROWS ONLY"
end
visit_Arel_Nodes_Offset(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 18
def visit_Arel_Nodes_Offset(o, collector)
  collector << "OFFSET "
  visit o.expr, collector
  collector << " ROWS"
end
visit_Arel_Nodes_SelectOptions(o, collector) click to toggle source
# File lib/arel_extensions/visitors/oracle12.rb, line 6
def visit_Arel_Nodes_SelectOptions(o, collector)
  collector = maybe_visit o.offset, collector
  collector = maybe_visit o.limit, collector
  maybe_visit o.lock, collector
end
visit_Arel_Nodes_UpdateStatement(o, collector) click to toggle source
Calls superclass method
# File lib/arel_extensions/visitors/oracle12.rb, line 30
def visit_Arel_Nodes_UpdateStatement(o, collector)
  # Oracle does not allow ORDER BY/LIMIT in UPDATEs.
  if o.orders.any? && o.limit.nil?
    # However, there is no harm in silently eating the ORDER BY clause if no LIMIT has been provided,
    # otherwise let the user deal with the error
    o = o.dup
    o.orders = []
  end
  super
end