Class: PactBroker::DB::CleanIncremental

Inherits:
Object
  • Object
show all
Defined in:
lib/pact_broker/db/clean_incremental.rb

Constant Summary collapse

DEFAULT_KEEP_SELECTORS =
[
  PactBroker::DB::Clean::Selector.new(tag: true, latest: true),
  PactBroker::DB::Clean::Selector.new(branch: true, latest: true),
  PactBroker::DB::Clean::Selector.new(latest: true),
  PactBroker::DB::Clean::Selector.new(deployed: true),
  PactBroker::DB::Clean::Selector.new(released: true),
  PactBroker::DB::Clean::Selector.new(max_age: 90)
]
TABLES =
[:versions, :pact_publications, :pact_versions, :verifications, :triggered_webhooks, :webhook_executions]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(database_connection, options = {}) ⇒ CleanIncremental

Returns a new instance of CleanIncremental.



23
24
25
26
# File 'lib/pact_broker/db/clean_incremental.rb', line 23

def initialize database_connection, options = {}
  @db = database_connection
  @options = options
end

Class Method Details

.call(database_connection, options = {}) ⇒ Object



19
20
21
# File 'lib/pact_broker/db/clean_incremental.rb', line 19

def self.call database_connection, options = {}
  new(database_connection, options).call
end

Instance Method Details

#callObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/pact_broker/db/clean_incremental.rb', line 63

def call
  require "pact_broker/db/models"

  if dry_run?
    dry_run_results
  else
    db.transaction do
      before_counts = current_counts
      PactBroker::Domain::Version.where(id: resolve_ids(version_ids_to_delete)).delete
      delete_orphan_pact_versions
      after_counts = current_counts

      TABLES.each_with_object({}) do | table_name, comparison_counts |
        comparison_counts[table_name.to_s] = { "deleted" => before_counts[table_name] - after_counts[table_name], "kept" => after_counts[table_name] }
      end
    end
  end
end

#keepObject



32
33
34
35
36
37
38
39
# File 'lib/pact_broker/db/clean_incremental.rb', line 32

def keep
  @keep ||= if options[:keep]
              # Could be a Matrix::UnresolvedSelector from the docker image, convert it
              options[:keep].collect { | unknown_thing | PactBroker::DB::Clean::Selector.from_hash(unknown_thing.to_hash) }
            else
              DEFAULT_KEEP_SELECTORS
            end
end

#limitObject



41
42
43
# File 'lib/pact_broker/db/clean_incremental.rb', line 41

def limit
  options[:limit] || 1000
end

#loggerObject



28
29
30
# File 'lib/pact_broker/db/clean_incremental.rb', line 28

def logger
  options[:logger] || PactBroker.logger
end

#resolve_ids(query, column_name = :id) ⇒ Object



45
46
47
# File 'lib/pact_broker/db/clean_incremental.rb', line 45

def resolve_ids(query, column_name = :id)
  query.collect { |h| h[column_name] }
end

#selected_versions_to_keepObject



57
58
59
60
61
# File 'lib/pact_broker/db/clean_incremental.rb', line 57

def selected_versions_to_keep
  keep.collect do | selector |
    PactBroker::Domain::Version.select(:id).for_selector(selector)
  end
end

#version_ids_to_deleteObject



49
50
51
# File 'lib/pact_broker/db/clean_incremental.rb', line 49

def version_ids_to_delete
  db[:versions].where(id: version_ids_to_keep).invert.limit(limit).order(Sequel.asc(:id))
end

#version_ids_to_keepObject



53
54
55
# File 'lib/pact_broker/db/clean_incremental.rb', line 53

def version_ids_to_keep
  @version_ids_to_keep ||= selected_versions_to_keep.reduce(&:union)
end