Skip to content

Commit faf3bcd

Browse files
Merge pull request #3330 from SwiftPackageIndex/Convert-JoinedQueryBuilder-to-async-await
Convert joined query builder to async await
2 parents dcf0029 + 424ee92 commit faf3bcd

File tree

5 files changed

+85
-100
lines changed

5 files changed

+85
-100
lines changed

Sources/App/Core/Query+Support/JoinedQueryBuilder.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,21 +134,11 @@ struct JoinedQueryBuilder<J: ModelInitializable> {
134134
.map(J.init(model:))
135135
}
136136

137-
func all() -> EventLoopFuture<[J]> {
138-
queryBuilder.all()
139-
.mapEach(J.init(model:))
140-
}
141-
142137
func first() async throws -> J? {
143138
try await queryBuilder.first()
144139
.map(J.init(model:))
145140
}
146141

147-
func first() -> EventLoopFuture<J?> {
148-
queryBuilder.first()
149-
.optionalMap(J.init(model:))
150-
}
151-
152142
func page(_ page: Int, size pageSize: Int) async throws -> Page<J> {
153143
let page = try await queryBuilder.page(page, size: pageSize)
154144
return .init(results: page.results.map(J.init(model:)),

Tests/AppTests/BuildMonitorIndexModelTests.swift

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,25 @@ import XCTVapor
1919

2020
class BuildMonitorIndexModelTests: AppTestCase {
2121

22-
func test_init_from_Build() throws {
22+
func test_init_from_Build() async throws {
2323
do {
2424
let package = try savePackage(on: app.db, "https://github.com/daveverwer/LeftPad")
2525
let version = try Version(package: package,
2626
latest: .defaultBranch,
2727
packageName: "LeftPad from Version.packageName",
2828
reference: .branch("main"))
29-
try version.save(on: app.db).wait()
30-
try Build(id: .id0,
31-
version: version,
32-
platform: .macosXcodebuild,
33-
status: .ok,
34-
swiftVersion: .init(5, 6, 0)).save(on: app.db).wait()
35-
try Repository(package: package,
36-
ownerName: "Dave Verwer from Repository.ownerName").save(on: app.db).wait()
29+
try await version.save(on: app.db)
30+
try await Build(id: .id0,
31+
version: version,
32+
platform: .macosXcodebuild,
33+
status: .ok,
34+
swiftVersion: .init(5, 6, 0)).save(on: app.db)
35+
try await Repository(package: package,
36+
ownerName: "Dave Verwer from Repository.ownerName").save(on: app.db)
3737
}
3838

3939
// Query results back through the Joined4
40-
let buildResult = try BuildResult.query(on: app.db).first().wait().unwrap()
40+
let buildResult = try await BuildResult.query(on: app.db).first().unwrap()
4141

4242
// MUT
4343
let model = try XCTUnwrap(BuildMonitorIndex.Model(buildResult: buildResult))
@@ -52,70 +52,70 @@ class BuildMonitorIndexModelTests: AppTestCase {
5252
XCTAssertEqual(model.status, .ok)
5353
}
5454

55-
func test_init_from_Build_without_repository_name() throws {
55+
func test_init_from_Build_without_repository_name() async throws {
5656
do {
5757
let package = try savePackage(on: app.db, "https://github.com/daveverwer/LeftPad")
5858
let version = try Version(package: package,
5959
packageName: nil) // Deliberately missing a `packageName`
60-
try version.save(on: app.db).wait()
61-
try Build(version: version,
62-
platform: .macosXcodebuild,
63-
status: .ok,
64-
swiftVersion: .init(5, 6, 0)).save(on: app.db).wait()
65-
try Repository(package: package,
66-
name: "LeftPad from Repository.name").save(on: app.db).wait()
60+
try await version.save(on: app.db)
61+
try await Build(version: version,
62+
platform: .macosXcodebuild,
63+
status: .ok,
64+
swiftVersion: .init(5, 6, 0)).save(on: app.db)
65+
try await Repository(package: package,
66+
name: "LeftPad from Repository.name").save(on: app.db)
6767
}
6868

6969
// Query results back through the Joined4
70-
let buildResult = try BuildResult.query(on: app.db).first().wait().unwrap()
70+
let buildResult = try await BuildResult.query(on: app.db).first().unwrap()
7171

7272
// MUT
7373
let model = try XCTUnwrap(BuildMonitorIndex.Model(buildResult: buildResult))
7474

7575
XCTAssertEqual(model.packageName, "LeftPad from Repository.name")
7676
}
7777

78-
func test_init_from_Build_with_no_package_name() throws {
78+
func test_init_from_Build_with_no_package_name() async throws {
7979
do {
8080
let package = try savePackage(on: app.db, "https://github.com/daveverwer/LeftPad")
8181
let version = try Version(package: package,
8282
packageName: nil) // Deliberately missing a `packageName`
83-
try version.save(on: app.db).wait()
84-
try Build(version: version,
85-
platform: .macosXcodebuild,
86-
status: .ok,
87-
swiftVersion: .init(5, 6, 0)).save(on: app.db).wait()
88-
try Repository(package: package,
89-
name: nil) // Deliberately missing a `name`
90-
.save(on: app.db).wait()
83+
try await version.save(on: app.db)
84+
try await Build(version: version,
85+
platform: .macosXcodebuild,
86+
status: .ok,
87+
swiftVersion: .init(5, 6, 0)).save(on: app.db)
88+
try await Repository(package: package,
89+
name: nil) // Deliberately missing a `name`
90+
.save(on: app.db)
9191
}
9292

9393
// Query results back through the Joined4
94-
let buildResult = try BuildResult.query(on: app.db).first().wait().unwrap()
94+
let buildResult = try await BuildResult.query(on: app.db).first().unwrap()
9595

9696
// MUT
9797
let model = try XCTUnwrap(BuildMonitorIndex.Model(buildResult: buildResult))
9898

9999
XCTAssertEqual(model.packageName, "Unknown Package")
100100
}
101101

102-
func test_init_from_Build_without_ownerName() throws {
102+
func test_init_from_Build_without_ownerName() async throws {
103103
do {
104104
let package = try savePackage(on: app.db, "https://github.com/daveverwer/LeftPad")
105105
let version = try Version(package: package)
106-
try version.save(on: app.db).wait()
107-
try Build(version: version,
108-
platform: .macosXcodebuild,
109-
status: .ok,
110-
swiftVersion: .init(5, 6, 0)).save(on: app.db).wait()
111-
try Repository(package: package,
112-
owner: "daveverwer from Repository.owner",
113-
ownerName: nil) // Deliberately missing an `ownerName`
114-
.save(on: app.db).wait()
106+
try await version.save(on: app.db)
107+
try await Build(version: version,
108+
platform: .macosXcodebuild,
109+
status: .ok,
110+
swiftVersion: .init(5, 6, 0)).save(on: app.db)
111+
try await Repository(package: package,
112+
owner: "daveverwer from Repository.owner",
113+
ownerName: nil) // Deliberately missing an `ownerName`
114+
.save(on: app.db)
115115
}
116116

117117
// Query results back through the Joined4
118-
let buildResult = try BuildResult.query(on: app.db).first().wait().unwrap()
118+
let buildResult = try await BuildResult.query(on: app.db).first().unwrap()
119119

120120
// MUT
121121
let model = try XCTUnwrap(BuildMonitorIndex.Model(buildResult: buildResult))

Tests/AppTests/Joined3Tests.swift

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,84 +19,81 @@ import XCTest
1919

2020
class Joined3Tests: AppTestCase {
2121

22-
func test_query_no_version() throws {
22+
func test_query_no_version() async throws {
2323
// setup
2424
let p = try savePackage(on: app.db, "1")
25-
try Repository(package: p).save(on: app.db).wait()
25+
try await Repository(package: p).save(on: app.db)
2626

2727
// MUT
28-
let res = try Joined3<Package, Repository, Version>.query(on: app.db)
29-
.all()
30-
.wait()
28+
let res = try await Joined3<Package, Repository, Version>.query(on: app.db).all()
3129

3230
// validate
3331
XCTAssertEqual(res.map(\.model.id), [])
3432
}
3533

36-
func test_query_multiple_versions() throws {
34+
func test_query_multiple_versions() async throws {
3735
// Ensure multiple versions don't multiply the package selection
3836
// setup
3937
let p = try savePackage(on: app.db, "1")
40-
try Repository(package: p).save(on: app.db).wait()
41-
try Version(package: p, latest: .defaultBranch).save(on: app.db).wait()
42-
try Version(package: p, latest: .release).save(on: app.db).wait()
38+
try await Repository(package: p).save(on: app.db)
39+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
40+
try await Version(package: p, latest: .release).save(on: app.db)
4341

4442
// MUT
45-
let res = try Joined3<Package, Repository, Version>
43+
let res = try await Joined3<Package, Repository, Version>
4644
.query(on: app.db, version: .defaultBranch)
4745
.all()
48-
.wait()
4946

5047
// validate
5148
XCTAssertEqual(res.map(\.model.id), [p.id])
5249
}
5350

5451

55-
func test_query_relationship_properties() throws {
52+
func test_query_relationship_properties() async throws {
5653
// Ensure relationship properties are populated by query
5754
// setup
5855
let p = try savePackage(on: app.db, "1")
59-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
60-
try Version(package: p,
56+
try await Repository(package: p, owner: "owner").save(on: app.db)
57+
try await Version(package: p,
6158
latest: .defaultBranch,
62-
packageName: "package name").save(on: app.db).wait()
59+
packageName: "package name").save(on: app.db)
6360

6461
// MUT
65-
let res = try Joined3<Package, Repository, Version>
62+
let res = try await Joined3<Package, Repository, Version>
6663
.query(on: app.db, version: .defaultBranch)
67-
.all().wait()
64+
.all()
6865

6966
// validate
7067
XCTAssertEqual(res.map { $0.repository.owner }, ["owner"])
7168
XCTAssertEqual(res.map { $0.version.packageName }, ["package name"])
7269
}
7370

74-
func test_query_missing_relations() throws {
71+
func test_query_missing_relations() async throws {
7572
// Neither should be possible in practice, this is just ensuring we cannot
7673
// force unwrap the `repository` or `version` properties in the pathological
7774
// event, because there are no results to access the properties on.
7875
do { // no repository
7976
let p = try savePackage(on: app.db, "1")
80-
try Version(package: p,
77+
try await Version(package: p,
8178
latest: .defaultBranch,
82-
packageName: "package name").save(on: app.db).wait()
79+
packageName: "package name").save(on: app.db)
8380

8481
// MUT
85-
let res = try Joined3<Package, Repository, Version>
82+
let res = try await Joined3<Package, Repository, Version>
8683
.query(on: app.db, version: .defaultBranch)
87-
.all().wait()
84+
.all()
8885

8986
// validate - result is empty, `res[0].repository` cannot be called
9087
XCTAssertTrue(res.isEmpty)
9188
}
9289
do { // no version
9390
let p = try savePackage(on: app.db, "2")
94-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
91+
try await Repository(package: p, owner: "owner").save(on: app.db)
9592

9693
// MUT
97-
let res = try Joined3<Package, Repository, Version>
94+
let res = try await Joined3<Package, Repository, Version>
9895
.query(on: app.db, version: .defaultBranch)
99-
.all().wait()
96+
.all()
10097

10198
// validate - result is empty, `res[0].repository` cannot be called
10299
XCTAssertTrue(res.isEmpty)

Tests/AppTests/JoinedQueryBuilderTests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import XCTest
2424
/// and essentially compiler checked.
2525
class JoinedQueryBuilderTests: AppTestCase {
2626

27-
func test_sort() throws {
27+
func test_sort() async throws {
2828
// setup
2929
try (0..<3).shuffled().forEach { idx in
3030
try Package(url: "\(idx)".url).save(on: app.db).wait()
@@ -38,29 +38,29 @@ class JoinedQueryBuilderTests: AppTestCase {
3838

3939
do { // test sort(_ sort: DatabaseQuery.Sort)
4040
// MUT
41-
let res = try query()
41+
let res = try await query()
4242
.sort(DatabaseQuery.Sort.sort(.sql(unsafeRaw: "url"), .descending))
43-
.all().wait()
43+
.all()
4444

4545
// validate
4646
XCTAssertEqual(res.map(\.url), ["2", "1", "0"])
4747
}
4848

4949
do { // test sort<Field>(_ field: KeyPath<...>, _ direction:)
5050
// MUT
51-
let res = try query()
51+
let res = try await query()
5252
.sort(\.$url, .descending)
53-
.all().wait()
53+
.all()
5454

5555
// validate
5656
XCTAssertEqual(res.map(\.url), ["2", "1", "0"])
5757
}
5858

5959
do { // test sort(_ field: DatabaseQuery.Field, _ direction:)
6060
// MUT
61-
let res = try query()
61+
let res = try await query()
6262
.sort(DatabaseQuery.Field.sql(unsafeRaw: "url"), .descending)
63-
.all().wait()
63+
.all()
6464

6565
// validate
6666
XCTAssertEqual(res.map(\.url), ["2", "1", "0"])

Tests/AppTests/PackageInfoTests.swift

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,17 @@ import XCTest
1919

2020
class PackageInfoTests: AppTestCase {
2121

22-
func test_title_package_name() throws {
22+
func test_title_package_name() async throws {
2323
// Ensure title is populated from package.name()
2424
// setup
2525
let p = try savePackage(on: app.db, "1")
26-
try Repository(package: p, name: "repo name", owner: "owner")
27-
.save(on: app.db).wait()
28-
try Version(package: p, latest: .defaultBranch, packageName: "package name")
29-
.save(on: app.db).wait()
30-
let joined = try XCTUnwrap(Joined3<Package, Repository, Version>
31-
.query(on: app.db, version: .defaultBranch)
32-
.first()
33-
.wait())
26+
try await Repository(package: p, name: "repo name", owner: "owner")
27+
.save(on: app.db)
28+
try await Version(package: p, latest: .defaultBranch, packageName: "package name")
29+
.save(on: app.db)
30+
let joined = try await XCTUnwrapAsync(try await Joined3<Package, Repository, Version>
31+
.query(on: app.db, version: .defaultBranch)
32+
.first())
3433

3534
// MUT
3635
let pkgInfo = PackageInfo(package: joined)
@@ -39,18 +38,17 @@ class PackageInfoTests: AppTestCase {
3938
XCTAssertEqual(pkgInfo?.title, "package name")
4039
}
4140

42-
func test_title_repo_name() throws {
41+
func test_title_repo_name() async throws {
4342
// Ensure title is populated from repoName if package.name() is nil
4443
// setup
4544
let p = try savePackage(on: app.db, "1")
46-
try Repository(package: p, name: "repo name", owner: "owner")
47-
.save(on: app.db).wait()
48-
try Version(package: p, latest: .defaultBranch, packageName: nil)
49-
.save(on: app.db).wait()
50-
let joined = try XCTUnwrap(Joined3<Package, Repository, Version>
51-
.query(on: app.db, version: .defaultBranch)
52-
.first()
53-
.wait())
45+
try await Repository(package: p, name: "repo name", owner: "owner")
46+
.save(on: app.db)
47+
try await Version(package: p, latest: .defaultBranch, packageName: nil)
48+
.save(on: app.db)
49+
let joined = try await XCTUnwrapAsync(try await Joined3<Package, Repository, Version>
50+
.query(on: app.db, version: .defaultBranch)
51+
.first())
5452

5553
// MUT
5654
let pkgInfo = PackageInfo(package: joined)

0 commit comments

Comments
 (0)