class PactBroker::Matrix::QuickRow

rubocop: disable Metrics/ClassLength

Constants

ALL_COLUMNS
CONSUMER_VERSION_JOIN
LAST_ACTION_DATE
LP
LP_LV_JOIN

Joins

LV

Tables

PACT_COLUMNS
PROVIDER_VERSION_JOIN
SELECT_ALL_COLUMN_ARGS

cachable select arguments

SELECT_PACTICIPANT_IDS_ARGS
VERIFICATION_COLUMNS

Public Instance Methods

<=>(other) click to toggle source

Add logic for ignoring case

# File lib/pact_broker/matrix/quick_row.rb, line 299
def <=> other
  comparisons = [
    compare_name_asc(consumer_name, other.consumer_name),
    compare_number_desc(consumer_version_order, other.consumer_version_order),
    compare_number_desc(pact_revision_number, other.pact_revision_number),
    compare_name_asc(provider_name, other.provider_name),
    compare_number_desc(provider_version_order, other.provider_version_order),
    compare_number_desc(verification_id, other.verification_id)
  ]

  comparisons.find{|c| c != 0 } || 0
end
compare_name_asc(name1, name2) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 312
def compare_name_asc name1, name2
  name1 <=> name2
end
compare_number_desc(number1, number2) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 320
def compare_number_desc number1, number2
  if number1 && number2
    number2 <=> number1
  elsif number1
    1
  else
    -1
  end
end
consumer_name() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 352
def consumer_name
  consumer.name
end
consumer_version_branch_versions() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 360
def consumer_version_branch_versions
  consumer_version.branch_versions
end
consumer_version_number() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 356
def consumer_version_number
  consumer_version.number
end
consumer_version_order() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 364
def consumer_version_order
  consumer_version.order
end
default_scope() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 138
def default_scope
  select_all_columns.join_verifications.from_self
end
distinct_integrations(selectors, infer_integrations) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 83
def distinct_integrations selectors, infer_integrations
  query = if selectors.size == 1
            pacticipant_ids_matching_one_selector_optimised(selectors)
          else
            query = select_pacticipant_ids.distinct
            if infer_integrations
              query.matching_any_of_multiple_selectors(selectors)
            else
              if selectors.all?(&:only_pacticipant_name_specified?)
                query.matching_multiple_selectors_without_joining_verifications(selectors)
              else
                query.matching_multiple_selectors_joining_verifications(selectors)
              end
            end
          end

  query.from_self(alias: :pacticipant_ids)
    .select(
      :consumer_id,
      Sequel[:c][:name].as(:consumer_name),
      :provider_id,
      Sequel[:p][:name].as(:provider_name)
    )
    .join_consumers(:pacticipant_ids, :c)
    .join_providers(:pacticipant_ids, :p)
end
distinct_integrations_for_selector_as_consumer(selector) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 73
def distinct_integrations_for_selector_as_consumer(selector)
  select(:consumer_id, :provider_id)
    .distinct
    .where({ consumer_id: selector.pacticipant_id, consumer_version_id: selector.pacticipant_version_id }.compact)
    .from_self(alias: :integrations)
    .select(:consumer_id, :provider_id, Sequel[:consumers][:name].as(:consumer_name), Sequel[:providers][:name].as(:provider_name))
    .join_consumers(:integrations, :consumers)
    .join_providers(:integrations, :providers)
end
distinct_pacticipant_ids_where_consumer_or_consumer_version_matches(query_ids) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 159
def distinct_pacticipant_ids_where_consumer_or_consumer_version_matches(query_ids)
  select_pacticipant_ids
    .distinct
    .where {
      QueryBuilder.consumer_or_consumer_version_matches(query_ids, :p)
    }
end
distinct_pacticipant_ids_where_provider_or_provider_version_matches(query_ids) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 167
def distinct_pacticipant_ids_where_provider_or_provider_version_matches(query_ids)
  select_pacticipant_ids
    .distinct
    .inner_join_verifications
    .where {
      QueryBuilder.provider_or_provider_version_matches(query_ids, :v, :v)
    }
end
eager_all_the_things() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 126
def eager_all_the_things
  eager(:consumer)
  .eager(:provider)
  .eager(consumer_version: [{ current_deployed_versions: :environment }, { current_supported_released_versions: :environment }, { branch_versions: :branch_head }])
  .eager(provider_version: [{ current_deployed_versions: :environment }, { current_supported_released_versions: :environment }, { branch_versions: :branch_head }])
  .eager(:verification)
  .eager(:pact_publication)
  .eager(:pact_version)
  .eager(:consumer_version_tags)
  .eager(:provider_version_tags)
end
eql?(obj) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 330
def eql?(obj)
  (obj.class == model) && (obj.values == values)
end
has_verification?() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 388
def has_verification?
  !!verification_id
end
inner_join_verifications() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 269
def inner_join_verifications
  join(LV, LP_LV_JOIN, { table_alias: :v } )
end
involves_pacticipant_with_name?(pacticipant_name) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 338
def involves_pacticipant_with_name?(pacticipant_name)
  pacticipant_name.include?(pacticipant_name)
end
join_consumer_versions() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 257
def join_consumer_versions
  join(:versions, CONSUMER_VERSION_JOIN, { table_alias: :cv })
end
join_consumers(qualifier = :p, table_alias = :consumers) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 241
def join_consumers qualifier = :p, table_alias = :consumers
  join(
    :pacticipants,
    { Sequel[qualifier][:consumer_id] => Sequel[table_alias][:id] },
    { table_alias: table_alias }
  )
end
join_provider_versions() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 261
def join_provider_versions
  left_outer_join(:versions, PROVIDER_VERSION_JOIN, { table_alias: :pv } )
end
join_providers(qualifier = :p, table_alias = :providers) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 249
def join_providers qualifier = :p, table_alias = :providers
  join(
    :pacticipants,
    { Sequel[qualifier][:provider_id] => Sequel[table_alias][:id] },
    { table_alias: table_alias }
  )
end
join_verifications() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 265
def join_verifications
  left_outer_join(LV, LP_LV_JOIN, { table_alias: :v } )
end
join_verifications_for(query_ids) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 226
def join_verifications_for(query_ids)
  left_outer_join(verifications_for(query_ids), LP_LV_JOIN, { table_alias: :v } )
end
last_action_date() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 384
def last_action_date
  return_or_raise_if_not_set(:last_action_date)
end
matching_any_of_multiple_selectors(selectors) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 212
def matching_any_of_multiple_selectors(selectors)
  query_ids = QueryIds.from_selectors(selectors)
  join_verifications_for(query_ids)
    .where {
      Sequel.&(
        Sequel.|(
          QueryBuilder.consumer_or_consumer_version_matches(query_ids, :p),
          QueryBuilder.provider_or_provider_version_matches_or_pact_unverified(query_ids, :v, :p),
        ),
        QueryBuilder.either_consumer_or_provider_was_specified_in_query(query_ids, :p)
      )
    }
end
matching_multiple_selectors_joining_verifications(selectors) click to toggle source

When the user has specified multiple selectors, we only want to join the verifications for the specified selectors. This is because of the behaviour of the left outer join. Imagine a pact has been verified by a provider version that was NOT specified in the selectors. If we join all the verifications and THEN filter the rows to only show the versions specified in the selectors, we won't get a row for that pact, and hence, we won't know that it hasn't been verified by the provider version we're interested in. Instead, we need to filter the verifications dataset down to only the ones specified in the selectors first, and THEN join them to the pacts, so that we get a row for the pact with null provider version and verification fields.

# File lib/pact_broker/matrix/quick_row.rb, line 186
def matching_multiple_selectors_joining_verifications(selectors)
  query_ids = QueryIds.from_selectors(selectors)
  join_verifications_for(query_ids)
    .where {
      Sequel.&(
        QueryBuilder.consumer_or_consumer_version_matches(query_ids, :p),
        QueryBuilder.provider_or_provider_version_matches_or_pact_unverified(query_ids, :v, :p),
        QueryBuilder.either_consumer_or_provider_was_specified_in_query(query_ids, :p)
      )
    }
end
matching_multiple_selectors_without_joining_verifications(selectors) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 198
def matching_multiple_selectors_without_joining_verifications(selectors)
  # There are no versions specified in these selectors, so we can do the whole
  # query based on the consumer/provider IDs, which we have in the pact_publication
  # table without having to do a join.
  query_ids = QueryIds.from_selectors(selectors)
  where {
    Sequel.&(
      QueryBuilder.consumer_or_consumer_version_matches(query_ids, :p),
      QueryBuilder.provider_matches(query_ids, :p),
      QueryBuilder.either_consumer_or_provider_was_specified_in_query(query_ids, :p)
    )
  }
end
matching_one_selector(selectors) click to toggle source

When we have one selector, we need to join ALL the verifications to find out what integrations exist

# File lib/pact_broker/matrix/quick_row.rb, line 146
def matching_one_selector(selectors)
  join_verifications
    .where {
      QueryBuilder.consumer_or_consumer_version_or_provider_or_provider_or_provider_version_match(QueryIds.from_selectors(selectors), :p, :v)
    }
end
matching_selectors(selectors) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 110
def matching_selectors selectors
  if selectors.size == 1
    matching_one_selector(selectors)
  else
    matching_multiple_selectors_joining_verifications(selectors)
  end
end
order_by_last_action_date() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 118
def order_by_last_action_date
  from_self(alias: :unordered_rows).select(LAST_ACTION_DATE, Sequel[:unordered_rows].* ).order(Sequel.desc(:last_action_date), Sequel.desc(:pact_order), Sequel.desc(:verification_id))
end
order_by_pact_publication_created_at() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 122
def order_by_pact_publication_created_at
  order(Sequel.desc(:consumer_version_created_at), Sequel.desc(:pact_order))
end
pact_created_at() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 290
def pact_created_at
  pact_publication.created_at
end
pact_revision_number() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 278
def pact_revision_number
  pact_publication.revision_number
end
pact_version_sha() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 274
def pact_version_sha
  pact_version.sha
end
pacticipant_ids_matching_one_selector_optimised(selectors) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 153
def pacticipant_ids_matching_one_selector_optimised(selectors)
  query_ids = QueryIds.from_selectors(selectors)
  distinct_pacticipant_ids_where_consumer_or_consumer_version_matches(query_ids)
    .union(distinct_pacticipant_ids_where_provider_or_provider_version_matches(query_ids), all: true)
end
pacticipant_names() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 334
def pacticipant_names
  [consumer_name, provider_name]
end
provider_name() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 368
def provider_name
  provider.name
end
provider_version_branch_versions() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 376
def provider_version_branch_versions
  provider_version&.branch_versions || []
end
provider_version_id() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 342
def provider_version_id
  # null when not verified
  values[:provider_version_id]
end
provider_version_number() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 372
def provider_version_number
  provider_version&.number
end
provider_version_order() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 380
def provider_version_order
  provider_version&.order
end
return_or_raise_if_not_set(key) click to toggle source

This model needs the verifications and pacticipants joined to it before it can be used, as it's not a “real” model.

# File lib/pact_broker/matrix/quick_row.rb, line 394
def return_or_raise_if_not_set(key)
  if values.key?(key)
    values[key]
  else
    raise "Required table not joined"
  end
end
success() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 286
def success
  verification&.success
end
to_s() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 316
def to_s
  "#{consumer_name} v#{consumer_version_number} #{provider_name} #{provider_version_number} #{success}"
end
verification_executed_at() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 294
def verification_executed_at
  verification&.execution_date
end
verification_id() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 347
def verification_id
  # null when not verified
  return_or_raise_if_not_set(:verification_id)
end
verification_number() click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 282
def verification_number
  verification&.number
end
verifications_for(query_ids) click to toggle source
# File lib/pact_broker/matrix/quick_row.rb, line 230
def verifications_for(query_ids)
  db[LV]
    .select(:verification_id, :provider_version_id, :pact_version_id, :provider_id, :created_at)
    .where {
      Sequel.&(
        QueryBuilder.consumer_in_pacticipant_ids(query_ids),
        QueryBuilder.provider_or_provider_version_matches(query_ids)
      )
    }
end