@@ -72,56 +72,37 @@ function file_matches_filter({obj_info, filter_func = undefined}) {
72
72
/**
73
73
* get_lifecycle_rule_for_object determines the most specific matching lifecycle rule for the given object metadata
74
74
*
75
- * priority is based on:
76
- * - longest matching prefix
77
- * - most matching tags
78
- * - narrowest object size range
79
- *
80
75
* @param {Array<Object> } rules
81
76
* @param {Object } object_info
82
77
* @returns {Object|undefined }
83
78
*/
84
79
function get_lifecycle_rule_for_object ( rules , object_info ) {
80
+ if ( ! object_info ?. key || ! Array . isArray ( rules ) || rules . length < 1 ) return ;
81
+
85
82
let matched_rule ;
86
- let rule_priority = {
83
+ let curr_priority = {
87
84
prefix_len : - 1 ,
88
85
tag_count : - 1 ,
89
86
size_span : Infinity ,
90
87
} ;
91
- if ( object_info ?. key && rules ?. length > 0 ) {
92
- for ( const rule of rules ) {
93
- if ( rule ?. status !== 'Enabled' ) continue ;
94
-
95
- const filter = rule ?. filter || { } ;
96
88
97
- const filter_func = build_lifecycle_filter ( filter ) ;
89
+ for ( const rule of rules ) {
90
+ if ( rule ?. status !== 'Enabled' ) continue ;
98
91
99
- if ( ! filter_func ( object_info ) ) { continue ; }
92
+ const filter = rule ?. filter || { } ;
100
93
101
- const priority = {
102
- prefix_len : ( filter ?. prefix || '' ) . length ,
103
- tag_count : Array . isArray ( filter ?. tags ) ? filter ?. tags . length : 0 ,
104
- size_span : ( filter ?. object_size_less_than ?? Infinity ) - ( filter ?. object_size_greater_than ?? 0 )
105
- } ;
94
+ const filter_func = build_lifecycle_filter ( filter ) ;
106
95
107
- // compare prefix length
108
- const is_more_specific_prefix = priority . prefix_len > rule_priority . prefix_len ;
96
+ if ( ! filter_func ( object_info ) ) { continue ; }
109
97
110
- // compare tag count (if prefixes are equal)
111
- const is_more_specific_tags = priority . prefix_len === rule_priority . prefix_len &&
112
- priority . tag_count > rule_priority . tag_count ;
98
+ const new_priority = get_rule_priority ( filter ) ;
113
99
114
- // compare size span (if prefixes and tags are equal)
115
- const is_more_specific_size = priority . prefix_len === rule_priority . prefix_len &&
116
- priority . tag_count === rule_priority . tag_count &&
117
- priority . size_span < rule_priority . size_span ;
118
-
119
- if ( is_more_specific_prefix || is_more_specific_tags || is_more_specific_size ) {
120
- matched_rule = rule ;
121
- rule_priority = priority ;
122
- }
100
+ if ( compare_rule_priority ( curr_priority , new_priority ) ) {
101
+ matched_rule = rule ;
102
+ curr_priority = new_priority ;
123
103
}
124
104
}
105
+
125
106
return matched_rule ;
126
107
}
127
108
@@ -180,6 +161,49 @@ function build_lifecycle_filter(params) {
180
161
} ;
181
162
}
182
163
164
+ /**
165
+ * get_rule_priority calculates the priority of a lifecycle rule's filter
166
+ *
167
+ * @param {Object } filter
168
+ * @returns {Object } priority object
169
+ */
170
+ function get_rule_priority ( filter ) {
171
+ return {
172
+ prefix_len : ( filter ?. prefix || '' ) . length ,
173
+ tag_count : Array . isArray ( filter ?. tags ) ? filter . tags . length : 0 ,
174
+ size_span : ( filter ?. object_size_less_than ?? Infinity ) - ( filter ?. object_size_greater_than ?? 0 )
175
+ } ;
176
+ }
177
+
178
+ /**
179
+ * compare_rule_priority determines if a new rule has higher priority
180
+ *
181
+ * priority is based on:
182
+ * - longest matching prefix
183
+ * - most matching tags
184
+ * - narrowest object size range
185
+ *
186
+ * @param {Object } curr_priority
187
+ * @param {Object } new_priority
188
+ * @returns {boolean }
189
+ */
190
+ function compare_rule_priority ( curr_priority , new_priority ) {
191
+ // compare prefix length
192
+ if ( new_priority . prefix_len > curr_priority . prefix_len ) return true ;
193
+
194
+ if ( new_priority . prefix_len === curr_priority . prefix_len ) {
195
+ // compare tag count (if prefixes are equal)
196
+ if ( new_priority . tag_count > curr_priority . tag_count ) return true ;
197
+
198
+ if ( new_priority . tag_count === curr_priority . tag_count ) {
199
+ // compare size span (if prefixes and tags are equal)
200
+ if ( new_priority . size_span < curr_priority . size_span ) return true ;
201
+ }
202
+ }
203
+
204
+ return false ;
205
+ }
206
+
183
207
//////////////////
184
208
// TAGS HELPERS //
185
209
//////////////////
0 commit comments