Sha256: 04f85d9c912ca5e950e25b2f681e8c011f00c7543f1d5f813af43044cd666371

Contents?: true

Size: 1.11 KB

Versions: 3

Compression:

Stored size: 1.11 KB

Contents

class WorkerPlugins::SelectColumnWithTypeCast < WorkerPlugins::ApplicationService
  arguments :column_name_to_select, :column_to_compare_with, :query

  def perform
    return succeed! query.select(column_name_to_select) if same_type?

    if column_to_compare_with.type == :string
      succeed! query_with_varchar
    elsif column_to_compare_with.type == :integer
      succeed! query_with_integer
    else
      raise "Cant handle type cast between types: " \
        "#{model_class.table_name}.#{column_name_to_select} (#{column_to_select.type}) " \
        "#{column_to_compare_with.name} (#{column_to_compare_with.type})"
    end
  end

  def column_to_select
    @column_to_select ||= model_class.column_for_attribute(column_name_to_select)
  end

  def model_class
    @model_class ||= query.klass
  end

  def query_with_integer
    query.select("CAST(#{model_class.table_name}.#{column_name_to_select} AS BIGINT)")
  end

  def query_with_varchar
    query.select("CAST(#{model_class.table_name}.#{column_name_to_select} AS VARCHAR)")
  end

  def same_type?
    column_to_select.type == column_to_compare_with.type
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
worker_plugins-0.0.7 app/services/worker_plugins/select_column_with_type_cast.rb
worker_plugins-0.0.6 app/services/worker_plugins/select_column_with_type_cast.rb
worker_plugins-0.0.5 app/services/worker_plugins/select_column_with_type_cast.rb