Sha256: f78fe6c23db0432f1f7f42c24d6294c10559cffc2ce4379ecc099ba646c865ce

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

require 'lhm/sql_retry'

module Lhm
  class ChunkInsert
    def initialize(migration, connection, lowest, highest, options = {})
      @migration = migration
      @connection = connection
      @lowest = lowest
      @highest = highest
      @retry_options = options[:retriable] || {}
    end

    def insert_and_return_count_of_rows_created
      @connection.update(sql, @retry_options)
    end

    def sql
      "insert ignore into `#{ @migration.destination_name }` (#{ @migration.destination_columns }) " \
      "select #{ @migration.origin_columns } from `#{ @migration.origin_name }` " \
      "#{ conditions } `#{ @migration.origin_name }`.`id` between #{ @lowest } and #{ @highest }"
    end

    private
    # XXX this is extremely brittle and doesn't work when filter contains more
    # than one SQL clause, e.g. "where ... group by foo". Before making any
    # more changes here, please consider either:
    #
    # 1. Letting users only specify part of defined clauses (i.e. don't allow
    # `filter` on Migrator to accept both WHERE and INNER JOIN
    # 2. Changing query building so that it uses structured data rather than
    # strings until the last possible moment.
    def conditions
      if @migration.conditions
        @migration.conditions.
          # strip ending paren
          sub(/\)\Z/, '').
          # put any where conditions in parens
          sub(/where\s(\w.*)\Z/, 'where (\\1)') + ' and'
      else
        'where'
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lhm-shopify-3.5.0 lib/lhm/chunk_insert.rb