@@ -21,26 +21,27 @@ module Matrix
21
21
LV = :latest_verification_id_for_pact_version_and_provider_version
22
22
LP = :latest_pact_publication_ids_for_consumer_versions
23
23
24
- CONSUMER_COLUMNS = [ Sequel [ :lp ] [ :consumer_id ] , Sequel [ :consumers ] [ :name ] . as ( :consumer_name ) , Sequel [ :lp ] [ :pact_publication_id ] , Sequel [ :lp ] [ :pact_version_id ] ]
25
- PROVIDER_COLUMNS = [ Sequel [ :lp ] [ :provider_id ] , Sequel [ :providers ] [ :name ] . as ( :provider_name ) , Sequel [ :lv ] [ :verification_id ] ]
26
- CONSUMER_VERSION_COLUMNS = [ Sequel [ :lp ] [ :consumer_version_id ] , Sequel [ :cv ] [ :number ] . as ( :consumer_version_number ) , Sequel [ :cv ] [ :order ] . as ( :consumer_version_order ) ]
24
+ CONSUMER_COLUMNS = [ Sequel [ LP ] [ :consumer_id ] , Sequel [ :consumers ] [ :name ] . as ( :consumer_name ) , Sequel [ LP ] [ :pact_publication_id ] , Sequel [ LP ] [ :pact_version_id ] ]
25
+ PROVIDER_COLUMNS = [ Sequel [ LP ] [ :provider_id ] , Sequel [ :providers ] [ :name ] . as ( :provider_name ) , Sequel [ :lv ] [ :verification_id ] ]
26
+ CONSUMER_VERSION_COLUMNS = [ Sequel [ LP ] [ :consumer_version_id ] , Sequel [ :cv ] [ :number ] . as ( :consumer_version_number ) , Sequel [ :cv ] [ :order ] . as ( :consumer_version_order ) ]
27
27
PROVIDER_VERSION_COLUMNS = [ Sequel [ :lv ] [ :provider_version_id ] , Sequel [ :pv ] [ :number ] . as ( :provider_version_number ) , Sequel [ :pv ] [ :order ] . as ( :provider_version_order ) ]
28
28
ALL_COLUMNS = CONSUMER_COLUMNS + CONSUMER_VERSION_COLUMNS + PROVIDER_COLUMNS + PROVIDER_VERSION_COLUMNS
29
29
30
- LP_LV_JOIN = { Sequel [ :lp ] [ :pact_version_id ] => Sequel [ :lv ] [ :pact_version_id ] }
31
- CONSUMER_JOIN = { Sequel [ :lp ] [ :consumer_id ] => Sequel [ :consumers ] [ :id ] }
32
- PROVIDER_JOIN = { Sequel [ :lp ] [ :provider_id ] => Sequel [ :providers ] [ :id ] }
33
- CONSUMER_VERSION_JOIN = { Sequel [ :lp ] [ :consumer_version_id ] => Sequel [ :cv ] [ :id ] }
30
+ LP_LV_JOIN = { Sequel [ LP ] [ :pact_version_id ] => Sequel [ :lv ] [ :pact_version_id ] }
31
+ CONSUMER_JOIN = { Sequel [ LP ] [ :consumer_id ] => Sequel [ :consumers ] [ :id ] }
32
+ PROVIDER_JOIN = { Sequel [ LP ] [ :provider_id ] => Sequel [ :providers ] [ :id ] }
33
+ CONSUMER_VERSION_JOIN = { Sequel [ LP ] [ :consumer_version_id ] => Sequel [ :cv ] [ :id ] }
34
34
PROVIDER_VERSION_JOIN = { Sequel [ :lv ] [ :provider_version_id ] => Sequel [ :pv ] [ :id ] }
35
35
36
- RAW_QUERY = Sequel ::Model . db [ Sequel . as ( LP , :lp ) ]
36
+ RAW_QUERY = Sequel ::Model . db [ LP ]
37
37
. select ( *ALL_COLUMNS )
38
38
. left_outer_join ( LV , LP_LV_JOIN , { table_alias : :lv } )
39
39
. join ( :pacticipants , CONSUMER_JOIN , { table_alias : :consumers } )
40
40
. join ( :pacticipants , PROVIDER_JOIN , { table_alias : :providers } )
41
41
. join ( :versions , CONSUMER_VERSION_JOIN , { table_alias : :cv } )
42
42
. left_outer_join ( :versions , PROVIDER_VERSION_JOIN , { table_alias : :pv } )
43
43
44
+
44
45
ALIASED_QUERY = Sequel . as ( RAW_QUERY , :quick_rows )
45
46
46
47
class QuickRow < Sequel ::Model ( ALIASED_QUERY )
@@ -101,36 +102,36 @@ class QueryHelper
101
102
def self . consumer_and_provider_in selectors
102
103
Sequel . &(
103
104
Sequel . |(
104
- *consumer_and_maybe_consumer_version_match_any_selector ( selectors )
105
+ *consumer_or_consumer_version_match_any_selector ( selectors )
105
106
) ,
106
107
Sequel . |(
107
- *provider_and_maybe_provider_version_match_any_selector_or_verification_is_missing ( selectors )
108
+ *provider_or_provider_version_match_any_selector_or_verification_is_missing ( selectors )
108
109
) ,
109
110
either_consumer_or_provider_was_specified_in_query ( selectors )
110
111
)
111
112
end
112
113
113
- def self . consumer_and_maybe_consumer_version_match_any_selector ( selectors )
114
- selectors . collect { |s | consumer_and_maybe_consumer_version_match_selector ( s ) }
114
+ def self . consumer_or_consumer_version_match_any_selector ( selectors )
115
+ selectors . collect { |s | most_specific_consumer_criterion ( s ) }
115
116
end
116
117
117
- def self . consumer_and_maybe_consumer_version_match_selector ( s )
118
+ def self . most_specific_consumer_criterion ( s , qualifier = :quick_rows )
118
119
if s [ :pact_publication_ids ]
119
- { PACT_PUBLICATION_ID => s [ :pact_publication_ids ] }
120
+ { Sequel [ qualifier ] [ :pact_publication_id ] => s [ :pact_publication_ids ] }
120
121
elsif s [ :pacticipant_version_id ]
121
- { CONSUMER_ID => s [ :pacticipant_id ] , CONSUMER_VERSION_ID => s [ :pacticipant_version_id ] }
122
+ { Sequel [ qualifier ] [ :consumer_version_id ] => s [ :pacticipant_version_id ] }
122
123
else
123
- { CONSUMER_ID => s [ :pacticipant_id ] }
124
+ { Sequel [ qualifier ] [ :consumer_id ] => s [ :pacticipant_id ] }
124
125
end
125
126
end
126
127
127
- def self . provider_and_maybe_provider_version_match_selector ( s )
128
- if s [ :verification_ids ]
129
- { VERIFICATION_ID => s [ :verification_ids ] }
130
- elsif s [ :pacticipant_version_id ]
131
- { PROVIDER_ID => s [ :pacticipant_id ] , PROVIDER_VERSION_ID => s [ :pacticipant_version_id ] }
128
+ def self . most_specific_provider_criterion ( selector , qualifier = :quick_rows )
129
+ if selector [ :verification_ids ]
130
+ { Sequel [ qualifier ] [ :verification_id ] => selector [ :verification_ids ] }
131
+ elsif selector [ :pacticipant_version_id ]
132
+ { Sequel [ qualifier ] [ :provider_version_id ] => selector [ :pacticipant_version_id ] }
132
133
else
133
- { PROVIDER_ID => s [ :pacticipant_id ] }
134
+ { Sequel [ qualifier ] [ :provider_id ] => selector [ :pacticipant_id ] }
134
135
end
135
136
end
136
137
@@ -140,9 +141,9 @@ def self.provider_verification_is_missing_for_matching_selector(s)
140
141
{ PROVIDER_ID => s [ :pacticipant_id ] , PROVIDER_VERSION_ID => nil }
141
142
end
142
143
143
- def self . provider_and_maybe_provider_version_match_any_selector_or_verification_is_missing ( selectors )
144
+ def self . provider_or_provider_version_match_any_selector_or_verification_is_missing ( selectors )
144
145
selectors . collect { |s |
145
- provider_and_maybe_provider_version_match_selector ( s )
146
+ most_specific_provider_criterion ( s )
146
147
} + selectors . collect { |s |
147
148
provider_verification_is_missing_for_matching_selector ( s )
148
149
}
@@ -155,16 +156,17 @@ def self.provider_and_maybe_provider_version_match_any_selector_or_verification_
155
156
# implied selectors as well.
156
157
# This extra filter makes sure that every row that is returned actually matches one of the specified
157
158
# selectors.
158
- def self . either_consumer_or_provider_was_specified_in_query ( selectors )
159
- specified_pacticipant_ids = selectors . select { |s | s [ :type ] == :specified } . collect { |s | s [ :pacticipant_id ] }
160
- Sequel . |( { CONSUMER_ID => specified_pacticipant_ids } , { PROVIDER_ID => specified_pacticipant_ids } )
159
+ def self . either_consumer_or_provider_was_specified_in_query ( selectors , qualifier = nil )
160
+ consumer_id_field = qualifier ? Sequel [ qualifier ] [ :consumer_id ] : CONSUMER_ID
161
+ provider_id_field = qualifier ? Sequel [ qualifier ] [ :provider_id ] : PROVIDER_ID
162
+ specified_pacticipant_ids = selectors . select ( &:specified? ) . collect ( &:pacticipant_id )
163
+ Sequel . |( { consumer_id_field => specified_pacticipant_ids } , { provider_id_field => specified_pacticipant_ids } )
161
164
end
162
165
163
166
def self . consumer_or_consumer_version_or_provider_or_provider_or_provider_version_match_selector ( s )
164
- Sequel . |(
165
- s [ :pacticipant_version_id ] ? { CONSUMER_VERSION_ID => s [ :pacticipant_version_id ] } : { CONSUMER_ID => s [ :pacticipant_id ] } ,
166
- s [ :pacticipant_version_id ] ? { PROVIDER_VERSION_ID => s [ :pacticipant_version_id ] } : { PROVIDER_ID => s [ :pacticipant_id ] }
167
- )
167
+ consumer_or_consumer_version_match = s [ :pacticipant_version_id ] ? { CONSUMER_VERSION_ID => s [ :pacticipant_version_id ] } : { CONSUMER_ID => s [ :pacticipant_id ] }
168
+ provider_or_provider_version_match = s [ :pacticipant_version_id ] ? { PROVIDER_VERSION_ID => s [ :pacticipant_version_id ] } : { PROVIDER_ID => s [ :pacticipant_id ] }
169
+ Sequel . |( consumer_or_consumer_version_match , provider_or_provider_version_match )
168
170
end
169
171
end
170
172
0 commit comments