module Sidekiq::Worker::ClassMethods::Overrides

def self.included(base)

def self.included(base)
  override_methods(base) unless base.method_defined?(:execute_job)
  base.class_eval do
    alias_method :execute_job_orig, :execute_job
    alias_method :execute_job, :execute_job_ext
    alias_method :clear_orig, :clear
    alias_method :clear, :clear_ext
  end
end

def clear_ext

def clear_ext
  payload_hashes = jobs.map { |job| job['unique_hash'] }
  clear_orig
  return if payload_hashes.empty?
  Sidekiq.redis { |conn| conn.del(*payload_hashes) }
end

def execute_job_ext(worker, args)

def execute_job_ext(worker, args)
  execute_job_orig(worker, args)
  payload_hash = SidekiqUniqueJobs::PayloadHelper.get_payload(
    worker.class.name,
    get_sidekiq_options['queue'],
    args
  )
  Sidekiq.redis { |conn| conn.del(payload_hash) }
end

def override_methods(base)

rubocop:disable all
Disable rubocop because methods are lifted directly out of Sidekiq
def override_methods(base)
  base.class_eval do
    define_method(:drain) do
      while job = jobs.shift do
        worker = new
        worker.jid = job['jid']
        execute_job(worker, job['args'])
      end
    end
    define_method(:perform_one) do
      raise(EmptyQueueError, "perform_one called with empty job queue") if jobs.empty?
      job = jobs.shift
      worker = new
      worker.jid = job['jid']
      execute_job(worker, job['args'])
    end
    define_method(:execute_job) do |worker, args|
      worker.perform(*args)
    end
  end
end