class PactBroker::DB::Clean

Attributes

db[R]
options[R]

Public Class Methods

call(database_connection, options = {}) click to toggle source
# File lib/pact_broker/db/clean.rb, line 17
def self.call database_connection, options = {}
  new(database_connection, options).call
end
new(database_connection, options = {}) click to toggle source
# File lib/pact_broker/db/clean.rb, line 21
def initialize database_connection, options = {}
  @db = database_connection
  @options = options
end

Public Instance Methods

call() click to toggle source
# File lib/pact_broker/db/clean.rb, line 107
def call
  deleted_counts = {}
  kept_counts = {}

  deleted_counts[:pact_publications] = pact_publication_ids_to_delete.count
  kept_counts[:pact_publications] = pact_publication_ids_to_keep.count

  # Work out how to keep the head verifications for the provider tags.

  deleted_counts[:verification_results] = verification_ids_to_delete.count
  kept_counts[:verification_results] = verification_ids_to_keep.count

  delete_webhook_data(verification_triggered_webhook_ids_to_delete)
  delete_verifications

  delete_webhook_data(pact_publication_triggered_webhook_ids_to_delete)
  delete_pact_publications

  delete_orphan_pact_versions
  overwritten_delete_counts = delete_overwritten_verifications
  deleted_counts[:verification_results] = deleted_counts[:verification_results] + overwritten_delete_counts[:verification_results]
  kept_counts[:verification_results] = kept_counts[:verification_results] - overwritten_delete_counts[:verification_results]

  delete_orphan_tags
  delete_orphan_versions

  { kept: kept_counts, deleted: deleted_counts }
end
keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 26
def keep
  @keep ||= if options[:keep]
              # Could be a Matrix::UnresolvedSelector from the docker image, convert it
              options[:keep].collect { | unknown_thing | Selector.from_hash(unknown_thing.to_hash) }
            else
              [Selector.new(tag: true, latest: true), Selector.new(branch: true, latest: true), Selector.new(latest: true), Selector.new(deployed: true), Selector.new(released: true)]
            end
end
latest_pact_publication_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 57
def latest_pact_publication_ids_to_keep
  @latest_pact_publication_ids_to_keep ||= resolve_ids(db[:latest_pact_publications].select(:id))
end
latest_tagged_pact_publications_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 50
def latest_tagged_pact_publications_ids_to_keep
  @latest_tagged_pact_publications_ids_to_keep ||= resolve_ids(keep.select(&:tag).select(&:latest).collect do | selector |
    PactBroker::Pacts::PactPublication.select(:id).latest_by_consumer_tag_for_clean_selector(selector)
  end.reduce(&:union) || [])
end
pact_publication_ids_to_delete() click to toggle source
# File lib/pact_broker/db/clean.rb, line 61
def pact_publication_ids_to_delete
  @pact_publication_ids_to_delete ||= resolve_ids(db[:pact_publications].select(:id).where(id: pact_publication_ids_to_keep).invert)
end
pact_publication_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 40
def pact_publication_ids_to_keep
  @pact_publication_ids_to_keep ||= pact_publication_ids_to_keep_for_version_ids_to_keep
                                      .union(latest_pact_publication_ids_to_keep)
                                      .union(latest_tagged_pact_publications_ids_to_keep)
end
pact_publication_ids_to_keep_for_version_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 46
def pact_publication_ids_to_keep_for_version_ids_to_keep
  @pact_publication_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:pact_publications].select(:id).where(consumer_version_id: version_ids_to_keep))
end
resolve_ids(query, column_name = :id) click to toggle source
# File lib/pact_broker/db/clean.rb, line 35
def resolve_ids(query, column_name = :id)
  # query
  Unionable.new(query.collect { |h| h[column_name] })
end
verification_ids_to_delete() click to toggle source
# File lib/pact_broker/db/clean.rb, line 97
def verification_ids_to_delete
  @verification_ids_to_delete ||= db[:verifications].select(:id).where(id: verification_ids_to_keep).invert
end
verification_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 93
def verification_ids_to_keep
  @verification_ids_to_keep ||= verification_ids_to_keep_for_version_ids_to_keep.union(verification_ids_to_keep_because_latest_verification_for_latest_pact)
end
verification_ids_to_keep_because_latest_verification_for_latest_pact() click to toggle source
# File lib/pact_broker/db/clean.rb, line 70
def verification_ids_to_keep_because_latest_verification_for_latest_pact
  @verification_ids_to_keep_because_latest_verification ||= resolve_ids(
    db[:latest_verification_ids_for_pact_versions]
      .select(:latest_verification_id)
      .where(pact_version_id:
        db[:latest_pact_publications].select(:pact_version_id)
      ),
    :latest_verification_id
  )
end
verification_ids_to_keep_for_pact_publication_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 81
def verification_ids_to_keep_for_pact_publication_ids_to_keep
  @verification_ids_to_keep_for_pact_publication_ids_to_keep ||= resolve_ids(
    db[:latest_verification_id_for_pact_version_and_provider_version]
      .select(:verification_id)
      .where(pact_version_id:
        db[:pact_publications]
          .select(:pact_version_id)
          .where(id: pact_publication_ids_to_keep_for_version_ids_to_keep)
    )
  )
end
verification_ids_to_keep_for_version_ids_to_keep() click to toggle source

because they belong to the versions to keep

# File lib/pact_broker/db/clean.rb, line 66
def verification_ids_to_keep_for_version_ids_to_keep
  @verification_ids_to_keep_for_version_ids_to_keep ||= resolve_ids(db[:verifications].select(:id).where(provider_version_id: version_ids_to_keep))
end
version_ids_to_keep() click to toggle source
# File lib/pact_broker/db/clean.rb, line 101
def version_ids_to_keep
  @version_ids_to_keep ||= keep.collect do | selector |
    PactBroker::Domain::Version.select(:id).for_selector(selector)
  end.reduce(&:union)
end

Private Instance Methods

delete_orphan_pact_versions() click to toggle source
# File lib/pact_broker/db/clean.rb, line 170
def delete_orphan_pact_versions
  referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).union(db[:verifications].select(:pact_version_id))
  db[:pact_versions].where(id: referenced_pact_version_ids).invert.delete
end
delete_orphan_tags() click to toggle source
# File lib/pact_broker/db/clean.rb, line 175
def delete_orphan_tags
  db[:tags].where(version_id: referenced_version_ids).invert.delete
end
delete_orphan_versions() click to toggle source
# File lib/pact_broker/db/clean.rb, line 179
def delete_orphan_versions
  db[:versions].where(id: referenced_version_ids).invert.delete
end
delete_overwritten_verifications() click to toggle source
# File lib/pact_broker/db/clean.rb, line 183
def delete_overwritten_verifications
  verification_ids = db[:verifications].select(:id).where(id: db[:latest_verification_id_for_pact_version_and_provider_version].select(:verification_id)).invert
  deleted_counts = { verification_results: verification_ids.count }
  delete_webhook_data(db[:triggered_webhooks].where(verification_id: verification_ids).select(:id))
  verification_ids.delete
  deleted_counts
end
delete_pact_publications() click to toggle source
# File lib/pact_broker/db/clean.rb, line 162
def delete_pact_publications
  db[:pact_publications].where(id: pact_publication_ids_to_delete).delete
end
delete_verifications() click to toggle source
# File lib/pact_broker/db/clean.rb, line 166
def delete_verifications
  db[:verifications].where(id: verification_ids_to_delete).delete
end
delete_webhook_data(triggered_webhook_ids) click to toggle source
# File lib/pact_broker/db/clean.rb, line 157
def delete_webhook_data(triggered_webhook_ids)
  db[:webhook_executions].where(triggered_webhook_id: triggered_webhook_ids).delete
  db[:triggered_webhooks].where(id: triggered_webhook_ids).delete
end
pact_publication_triggered_webhook_ids_to_delete() click to toggle source
# File lib/pact_broker/db/clean.rb, line 144
def pact_publication_triggered_webhook_ids_to_delete
  db[:triggered_webhooks].select(:id).where(pact_publication_id: pact_publication_ids_to_delete)
end
referenced_version_ids() click to toggle source
# File lib/pact_broker/db/clean.rb, line 148
def referenced_version_ids
  db[:pact_publications].select(:consumer_version_id).union(db[:verifications].select(:provider_version_id))
end
verification_ids_for_pact_publication_ids_to_delete() click to toggle source
# File lib/pact_broker/db/clean.rb, line 152
def verification_ids_for_pact_publication_ids_to_delete
  @verification_ids_for_pact_publication_ids_to_delete ||=
    db[:verifications].select(:id).where(pact_version_id: db[:pact_publications].select(:pact_version_id).where(id: pact_publication_ids_to_delete))
end
verification_triggered_webhook_ids_to_delete() click to toggle source
# File lib/pact_broker/db/clean.rb, line 140
def verification_triggered_webhook_ids_to_delete
  db[:triggered_webhooks].select(:id).where(verification_id: verification_ids_to_delete)
end