Sha256: 276a920e1567e799d84d7955db0cfd8028dc04d41df4828c591e77c9abf9f386

Contents?: true

Size: 1.5 KB

Versions: 6

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module Spotlight
  ##
  # Reindex an exhibit by parallelizing resource indexing into multiple batches of reindex jobs
  class ReindexExhibitJob < Spotlight::ApplicationJob
    include Spotlight::JobTracking
    with_job_tracking(resource: ->(job) { job.arguments.first })

    include Spotlight::LimitConcurrency

    def perform(exhibit, batch_size: Spotlight::Engine.config.reindexing_batch_size, batch_count: Spotlight::Engine.config.reindexing_batch_count, **)
      count = exhibit.resources.count

      # Use the provided batch size, or calculate a reasonable default
      batch_count = (count.to_f / batch_size).ceil if batch_size
      batch_count ||= 1 + Math.log(count).round # e.g. 10 => 3, 100 => 6, 1000 => 8

      return Spotlight::ReindexJob.perform_now(exhibit, reports_on: job_tracker) if batch_count == 1

      batch_size ||= (count.to_f / batch_count).ceil

      perform_later_in_batches(exhibit, of: batch_size)

      # mark the job as 'pending' and let the UpdateJobTrackersJob finalize this status after the ReindexJobs finish
      job_tracker.update(status: 'pending')
    end

    def perform_later_in_batches(exhibit, of:)
      last = 0
      exhibit.resources.select(:id).in_batches(of: of) do |batch|
        last = batch.last.id
        Spotlight::ReindexJob.perform_later(exhibit, reports_on: job_tracker, start: batch.first.id, finish: batch.last.id)
      end

      Spotlight::ReindexJob.perform_later(exhibit, reports_on: job_tracker, start: last)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
blacklight-spotlight-3.0.3 app/jobs/spotlight/reindex_exhibit_job.rb
blacklight-spotlight-3.0.2 app/jobs/spotlight/reindex_exhibit_job.rb
blacklight-spotlight-3.0.1 app/jobs/spotlight/reindex_exhibit_job.rb
blacklight-spotlight-3.0.0 app/jobs/spotlight/reindex_exhibit_job.rb
blacklight-spotlight-3.0.0.rc6 app/jobs/spotlight/reindex_exhibit_job.rb
blacklight-spotlight-3.0.0.rc5 app/jobs/spotlight/reindex_exhibit_job.rb