module SalesforceOrm::SqlToSoql

Public Instance Methods

aggregate_function?(keyword) click to toggle source
# File lib/salesforce-orm/sql_to_soql.rb, line 3
def aggregate_function?(keyword)
  keyword =~ /^(AVG|COUNT|COUNT|COUNT_DISTINCT|MIN|MAX|SUM)\(/i
end
boolean_data_type_conversion(sql) click to toggle source
# File lib/salesforce-orm/sql_to_soql.rb, line 16
def boolean_data_type_conversion(sql)
  klass.data_type_map.each do |keyword, data_type|
    if data_type == :boolean
      [0, 1].each do |value|
        regex = Regexp.new("\s+#{keyword}\s*\=\s*#{value}(\s+|$)")
        sql.gsub!(regex, " #{keyword} = #{value == 1}\\1")
      end
      ['t', 'f'].each do |value|
        regex = Regexp.new("\s+#{keyword}\s*\=\s*'#{value}'(\s+|$)")
        sql.gsub!(regex, " #{keyword} = #{value == 't'}\\1")
      end
    end
  end
  sql
end
convert_aliased_fields(sql_str) click to toggle source
# File lib/salesforce-orm/sql_to_soql.rb, line 7
def convert_aliased_fields(sql_str)
  result = sql_str.clone
  klass.field_map.keys.each do |k|
    regex = Regexp.new("([\(\)=<>!,%'\s\t]+)#{k.to_s}([\(\)=<>!,%'\s\t]+|$)")
    result.gsub!(regex, "\\1#{klass.field_map[k].to_s}\\2")
  end
  result.gsub!(/\s+/, ' ')
end
sql_to_soql(frozen_sql) click to toggle source

TODO: optimize this method

# File lib/salesforce-orm/sql_to_soql.rb, line 33
def sql_to_soql(frozen_sql)
  sql = frozen_sql.dup
  # Unescape column and table names
  sql.gsub!('`', '')

  # Remove table namespace from fields
  sql.gsub!("#{QueryBuilder::DUMMY_TABLE_NAME}.", '')

  # Add table name
  sql.gsub!(QueryBuilder::DUMMY_TABLE_NAME, klass.object_name)

  # Convert 1=0 to id IS NULL (id never be NULL, so it a false case)
  sql.gsub!(/\s+1=0(\s*)/i, ' id IS NULL\1')

  # Convert IS NOT to !=
  sql.gsub!(/\s+IS\s+NOT\s+/i, ' != ')

  # Convert IS to =
  sql.gsub!(/\s+IS\s+/i, ' = ')

  # Convert datatime to salesforce format
  sql.gsub!(/'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?'/, '\1T\2Z')

  # Convert date to salesforce format
  sql.gsub!(/'(\d{4}-\d{2}-\d{2})'/, '\1')

  # Convert boolean_field = (1|0) to boolean_field = (true|false)
  sql = boolean_data_type_conversion(sql)

  # Convert aliased fields
  convert_aliased_fields(sql).strip
end