class ArelExtensions::Visitors::ArelExtensions::Visitors::Arel::Visitors::SQLite

Constants

DATE_FORMAT_DIRECTIVES
DATE_MAPPING
NUMBER_COMMA_MAPPING

Public Instance Methods

get_time_converted(element) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 326
def get_time_converted element
  if element.is_a?(Time)
    return Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
  elsif element.is_a?(Arel::Attributes::Attribute)
    col = Arel.column_of(element.relation.table_name, element.name.to_s)
    if col && (col.type == :time)
      return Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
    else
      return element
    end
  else
    return element
  end
end
old_visit_Arel_Nodes_As(o, collector)
Alias for: visit_Arel_Nodes_As
visit_ArelExtensions_InsertManager_BulkValues(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 241
def visit_ArelExtensions_InsertManager_BulkValues o, collector
  o.left.each_with_index do |row, idx|
    collector << 'SELECT '
    len = row.length - 1
    row.zip(o.cols).each_with_index { |(value, attr), i|
      case value
      when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
        collector = visit value.as(attr.name), collector
      else
        collector << quote(value, attr && column_for(attr)).to_s
        if idx == 0
          collector << ' AS '
          collector << quote(attr.name)
        end
      end
        collector << COMMA unless i == len
    }
    collector << ' UNION ALL ' unless idx == o.left.length - 1
  end
  collector
end
visit_ArelExtensions_Nodes_AiIMatches(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 45
def visit_ArelExtensions_Nodes_AiIMatches o, collector
  collector = visit o.left.collate(true, true), collector
  collector << ' LIKE '
  collector = visit o.right.collate(true, true), collector
  if o.escape
    collector << ' ESCAPE '
    visit o.escape, collector
  else
    collector
  end
end
visit_ArelExtensions_Nodes_AiMatches(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 33
def visit_ArelExtensions_Nodes_AiMatches o, collector
  collector = visit o.left.ai_collate, collector
  collector << ' LIKE '
  collector = visit o.right.ai_collate, collector
  if o.escape
    collector << ' ESCAPE '
    visit o.escape, collector
  else
    collector
  end
end
visit_ArelExtensions_Nodes_Ceil(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 227
def visit_ArelExtensions_Nodes_Ceil o, collector
  collector << 'CASE WHEN ROUND('
  collector = visit o.left, collector
  collector << ', 1) > ROUND('
  collector = visit o.left, collector
  collector << ') THEN ROUND('
  collector = visit o.left, collector
  collector << ') + 1 ELSE ROUND('
  collector = visit o.left, collector
  collector << ') END'
  collector
end
visit_ArelExtensions_Nodes_Collate(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 69
def visit_ArelExtensions_Nodes_Collate o, collector
  if o.ai
    collector = visit o.expressions.first, collector
    collector << ' COLLATE NOACCENTS'
  elsif o.ci
    collector = visit o.expressions.first, collector
    collector << ' COLLATE NOCASE'
  else
    collector = visit o.expressions.first, collector
    collector << ' COLLATE BINARY'
  end
  collector
end
visit_ArelExtensions_Nodes_Concat(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 138
def visit_ArelExtensions_Nodes_Concat o, collector
  collector << '('
  o.expressions.each_with_index { |arg, i|
    collector = visit arg, collector
    collector << ' || ' unless i == o.expressions.length - 1
  }
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_DateAdd(o, collector) click to toggle source

Date operations

# File lib/arel_extensions/visitors/sqlite.rb, line 96
def visit_ArelExtensions_Nodes_DateAdd o, collector
  collector << 'date('
  collector = visit o.expressions.first, collector
  collector << COMMA
  collector = visit o.sqlite_value, collector
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_DateDiff(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 105
def visit_ArelExtensions_Nodes_DateDiff o, collector
  case o.left_node_type
  when :ruby_time, :datetime, :time
    collector << "strftime('%s', "
    collector = visit o.left, collector
    collector << ") - strftime('%s', "
    collector = visit o.right, collector
  else
    collector << 'julianday('
    collector = visit o.left, collector
    collector << ') - julianday('
    collector = visit o.right, collector
  end
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_Duration(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 122
def visit_ArelExtensions_Nodes_Duration o, collector
  collector << "strftime('#{DATE_MAPPING[o.left]}'#{COMMA}"
  collector = visit o.right, collector
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_Floor(o, collector) click to toggle source

CAST(

CASE
  WHEN 3.42 >= 0 THEN CAST(3.42 AS INT)
  WHEN CAST(3.42 AS INT) = 3.42 THEN CAST(3.42 AS INT)
  ELSE CAST((3.42 - 1.0) AS INT)
END
AS FLOAT

)

# File lib/arel_extensions/visitors/sqlite.rb, line 210
def visit_ArelExtensions_Nodes_Floor o, collector
  collector << 'CAST(CASE WHEN '
  collector = visit o.left, collector
  collector << ' >= 0 THEN CAST('
  collector = visit o.left, collector
  collector << ' AS INT) WHEN CAST('
  collector = visit o.left, collector
  collector << ' AS INT) = '
  collector = visit o.left, collector
  collector << ' THEN CAST('
  collector = visit o.left, collector
  collector << ' AS INT) ELSE CAST(('
  collector = visit o.left, collector
  collector << ' - 1.0) AS INT) END AS FLOAT)'
  collector
end
visit_ArelExtensions_Nodes_FormattedNumber(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 389
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
  format = Arel::Nodes::NamedFunction.new('printf', [Arel.quoted(o.original_string), o.left])
  locale_map = NUMBER_COMMA_MAPPING[o.locale]
  if locale_map
    format = format.replace(',', locale_map[',']).replace('.', locale_map['.'])
  end
  visit format, collector
  collector
end
visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 83
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
  collector = visit o.left.lower, collector
  collector << ' NOT LIKE '
  collector = visit o.right.lower(o.right), collector
  if o.escape
    collector << ' ESCAPE '
    visit o.escape, collector
  else
    collector
  end
end
visit_ArelExtensions_Nodes_IMatches(o, collector) click to toggle source

String functions

# File lib/arel_extensions/visitors/sqlite.rb, line 21
def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
  collector = visit o.left.ci_collate, collector
  collector << ' LIKE '
  collector = visit o.right.ci_collate, collector
  if o.escape
    collector << ' ESCAPE '
    visit o.escape, collector
  else
    collector
  end
end
visit_ArelExtensions_Nodes_IsNotNull(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 164
def visit_ArelExtensions_Nodes_IsNotNull o, collector
  collector = visit o.expr, collector
    collector << ' IS NOT NULL'
    collector
end
visit_ArelExtensions_Nodes_IsNull(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 158
def visit_ArelExtensions_Nodes_IsNull o, collector
  collector = visit o.expr, collector
  collector << ' IS NULL'
  collector
end
visit_ArelExtensions_Nodes_Locate(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 129
def visit_ArelExtensions_Nodes_Locate o, collector
  collector << 'instr('
  collector = visit o.expr, collector
  collector << COMMA
  collector = visit o.right, collector
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_Rand(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 170
def visit_ArelExtensions_Nodes_Rand o, collector
  collector << 'RANDOM('
  if o.left != nil && o.right != nil
    collector = visit o.left, collector
    collector << COMMA
    collector = visit o.right, collector
  end
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_SMatches(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 57
def visit_ArelExtensions_Nodes_SMatches o, collector
  collector = visit o.left.collate, collector
  collector << ' LIKE '
  collector = visit o.right.collate, collector
  if o.escape
    collector << ' ESCAPE '
    visit o.escape, collector
  else
    collector
  end
end
visit_ArelExtensions_Nodes_Substring(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 148
def visit_ArelExtensions_Nodes_Substring o, collector
  collector << 'SUBSTR('
  o.expressions.each_with_index { |arg, i|
    collector << COMMA if i != 0
    collector = visit arg, collector
  }
  collector << ')'
  collector
end
visit_ArelExtensions_Nodes_Union(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 292
def visit_ArelExtensions_Nodes_Union o, collector
  collector =
    if o.left.is_a?(Arel::SelectManager)
      visit o.left.ast, collector
    else
      visit o.left, collector
    end
  collector << ' UNION '
  collector =
    if o.right.is_a?(Arel::SelectManager)
      visit o.right.ast, collector
    else
      visit o.right, collector
    end
  collector
end
visit_ArelExtensions_Nodes_UnionAll(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 309
def visit_ArelExtensions_Nodes_UnionAll o, collector
  collector =
    if o.left.is_a?(Arel::SelectManager)
      visit o.left.ast, collector
    else
      visit o.left, collector
    end
  collector << ' UNION ALL '
  collector =
    if o.right.is_a?(Arel::SelectManager)
      visit o.right.ast, collector
    else
      visit o.right, collector
    end
  collector
end
visit_ArelExtensions_Nodes_Wday(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 195
def visit_ArelExtensions_Nodes_Wday o, collector
  collector << "STRFTIME('%w',"
  collector = visit o.date, collector
  collector << ')'
  collector
end
visit_Arel_Nodes_As(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 374
def visit_Arel_Nodes_As o, collector
  if o.left.is_a?(Arel::Nodes::Binary)
    collector << '('
    collector = visit o.left, collector
    collector << ')'
  else
    collector = visit o.left, collector
  end
  sep = o.right.size > 1 && o.right[0] == '"' && o.right[-1] == '"' ? '' : '"'
  collector << " AS #{sep}"
  collector = visit o.right, collector
  collector << "#{sep}"
  collector
end
Also aliased as: old_visit_Arel_Nodes_As
visit_Arel_Nodes_GreaterThan(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 350
def visit_Arel_Nodes_GreaterThan o, collector
  collector = visit get_time_converted(o.left), collector
  collector << ' > '
  collector = visit get_time_converted(o.right), collector
  collector
end
visit_Arel_Nodes_GreaterThanOrEqual(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 342
def visit_Arel_Nodes_GreaterThanOrEqual o, collector
  collector = visit get_time_converted(o.left), collector
  collector << ' >= '
  collector = visit get_time_converted(o.right), collector
  collector
end
visit_Arel_Nodes_LessThan(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 366
def visit_Arel_Nodes_LessThan o, collector
  collector = visit get_time_converted(o.left), collector
  collector << ' < '
  collector = visit get_time_converted(o.right), collector
  collector
end
visit_Arel_Nodes_LessThanOrEqual(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 358
def visit_Arel_Nodes_LessThanOrEqual o, collector
  collector = visit get_time_converted(o.left), collector
  collector << ' <= '
  collector = visit get_time_converted(o.right), collector
  collector
end
visit_Arel_Nodes_NotRegexp(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 188
def visit_Arel_Nodes_NotRegexp o, collector
  collector = visit o.left, collector
  collector << ' NOT REGEXP '
  collector = visit o.right, collector
  collector
end
visit_Arel_Nodes_Regexp(o, collector) click to toggle source
# File lib/arel_extensions/visitors/sqlite.rb, line 181
def visit_Arel_Nodes_Regexp o, collector
  collector = visit o.left, collector
  collector << ' REGEXP'
  collector = visit o.right, collector
  collector
end