@@ -22,6 +22,9 @@ import XCTest
22
22
class QueryPerformanceTests : XCTestCase {
23
23
var app : Application !
24
24
25
+ // Set this to true when running locally to convert warnings to test failures for easier updating of values.
26
+ static let failOnWarning = false
27
+
25
28
override func setUp( ) async throws {
26
29
try await super. setUp ( )
27
30
@@ -46,67 +49,67 @@ class QueryPerformanceTests: XCTestCase {
46
49
47
50
func test_02_Search_keywordMatchQuery( ) async throws {
48
51
let query = Search . keywordMatchQueryBuilder ( on: app. db, terms: [ " a " ] )
49
- try await assertQueryPerformance ( query, expectedCost: 5800 , variation: 200 )
52
+ try await assertQueryPerformance ( query, expectedCost: 5900 , variation: 200 )
50
53
}
51
54
52
55
func test_03_Search_authorMatchQuery( ) async throws {
53
56
let query = Search . authorMatchQueryBuilder ( on: app. db, terms: [ " a " ] )
54
- try await assertQueryPerformance ( query, expectedCost: 1000 , variation: 50 )
57
+ try await assertQueryPerformance ( query, expectedCost: 1100 , variation: 50 )
55
58
}
56
59
57
60
func test_04_Search_query_noFilter( ) async throws {
58
61
let query = try Search . query ( app. db, [ " a " ] , page: 1 )
59
62
. unwrap ( )
60
- try await assertQueryPerformance ( query, expectedCost: 8000 , variation: 200 )
63
+ try await assertQueryPerformance ( query, expectedCost: 8100 , variation: 200 )
61
64
}
62
65
63
66
func test_05_Search_query_authorFilter( ) async throws {
64
67
let filter = try AuthorSearchFilter ( expression: . init( operator: . is, value: " apple " ) )
65
68
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
66
69
. unwrap ( )
67
- try await assertQueryPerformance ( query, expectedCost: 7600 , variation: 200 )
70
+ try await assertQueryPerformance ( query, expectedCost: 7700 , variation: 200 )
68
71
}
69
72
70
73
func test_06_Search_query_keywordFilter( ) async throws {
71
74
let filter = try KeywordSearchFilter ( expression: . init( operator: . is, value: " apple " ) )
72
75
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
73
76
. unwrap ( )
74
- try await assertQueryPerformance ( query, expectedCost: 7700 , variation: 200 )
77
+ try await assertQueryPerformance ( query, expectedCost: 7800 , variation: 200 )
75
78
}
76
79
77
80
func test_07_Search_query_lastActicityFilter( ) async throws {
78
81
let filter = try LastActivitySearchFilter ( expression: . init( operator: . greaterThan, value: " 2000-01-01 " ) )
79
82
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
80
83
. unwrap ( )
81
- try await assertQueryPerformance ( query, expectedCost: 8000 , variation: 200 )
84
+ try await assertQueryPerformance ( query, expectedCost: 8100 , variation: 200 )
82
85
}
83
86
84
87
func test_08_Search_query_licenseFilter( ) async throws {
85
88
let filter = try LicenseSearchFilter ( expression: . init( operator: . is, value: " mit " ) )
86
89
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
87
90
. unwrap ( )
88
- try await assertQueryPerformance ( query, expectedCost: 7900 , variation: 200 )
91
+ try await assertQueryPerformance ( query, expectedCost: 8000 , variation: 200 )
89
92
}
90
93
91
94
func test_09_Search_query_platformFilter( ) async throws {
92
95
let filter = try PlatformSearchFilter ( expression: . init( operator: . is, value: " macos,ios " ) )
93
96
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
94
97
. unwrap ( )
95
- try await assertQueryPerformance ( query, expectedCost: 7800 , variation: 200 )
98
+ try await assertQueryPerformance ( query, expectedCost: 7900 , variation: 200 )
96
99
}
97
100
98
101
func test_10_Search_query_productTypeFilter( ) async throws {
99
102
let filter = try ProductTypeSearchFilter ( expression: . init( operator: . is, value: " plugin " ) )
100
103
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
101
104
. unwrap ( )
102
- try await assertQueryPerformance ( query, expectedCost: 7600 , variation: 200 )
105
+ try await assertQueryPerformance ( query, expectedCost: 7700 , variation: 200 )
103
106
}
104
107
105
108
func test_11_Search_query_starsFilter( ) async throws {
106
109
let filter = try StarsSearchFilter ( expression: . init( operator: . greaterThan, value: " 5 " ) )
107
110
let query = try Search . query ( app. db, [ " a " ] , filters: [ filter] , page: 1 )
108
111
. unwrap ( )
109
- try await assertQueryPerformance ( query, expectedCost: 7800 , variation: 300 )
112
+ try await assertQueryPerformance ( query, expectedCost: 7900 , variation: 300 )
110
113
}
111
114
112
115
func test_12_Search_refresh( ) async throws {
@@ -152,7 +155,7 @@ class QueryPerformanceTests: XCTestCase {
152
155
JOIN versions v ON v.package_id = p.id
153
156
WHERE v.reference ->> 'branch' = r.default_branch
154
157
""" )
155
- try await assertQueryPerformance ( query, expectedCost: 87_000 , variation: 5000 )
158
+ try await assertQueryPerformance ( query, expectedCost: 91_000 , variation: 5000 )
156
159
}
157
160
158
161
}
@@ -205,7 +208,15 @@ private extension QueryPerformanceTests {
205
208
if parsedPlan. cost. total <= expectedCost {
206
209
print ( " ℹ️ COST: \( parsedPlan. cost. total) " )
207
210
} else {
208
- print ( " ⚠️ COST: \( parsedPlan. cost. total) " )
211
+ if Self . failOnWarning {
212
+ XCTFail ( """
213
+ Total cost of \( parsedPlan. cost. total) above the expected cost of \( expectedCost)
214
+ """ ,
215
+ file: filePath,
216
+ line: lineNumber)
217
+ } else {
218
+ print ( " ⚠️ COST: \( parsedPlan. cost. total) " )
219
+ }
209
220
}
210
221
print ( " ℹ️ EXPECTED: \( expectedCost) ± \( variation) " )
211
222
print ( " ℹ️ ACTUAL TIME: \( parsedPlan. actualTime. total) ms " )
0 commit comments