Skip to content

Commit 2c3255a

Browse files
committed
use Mongo.DatabaseModel to remove more repeated parameters
1 parent 2a703ae commit 2c3255a

16 files changed

+132
-148
lines changed

Sources/UnidocDB/Mongo.DatabaseModel.swift

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import BSON
12
import MongoDB
23
import MongoQL
4+
import UnixTime
35

46
extension Mongo
57
{
@@ -28,3 +30,78 @@ extension Mongo.DatabaseModel
2830
try await self.setup()
2931
}
3032
}
33+
extension Mongo.DatabaseModel
34+
{
35+
@inlinable public
36+
func query<Query>(with query:Query) async throws -> Query.Iteration.Batch
37+
where Query:Mongo.PipelineQuery, Query.Iteration.Stride == Never
38+
{
39+
try await self.session.run(command: query.command(stride: nil), against: self.id)
40+
}
41+
42+
@discardableResult
43+
@inlinable public
44+
func update<Update>(
45+
with update:Update) async throws -> Mongo.UpdateResponse<Update.Target.Element.ID>
46+
where Update:Mongo.UpdateQuery, Update.Effect.ExecutionPolicy:Mongo.ExecutionPolicy
47+
{
48+
try await self.session.run(command: update.command, against: self.id)
49+
}
50+
}
51+
extension Mongo.DatabaseModel
52+
{
53+
@inlinable public
54+
func observe<Source, Delta>(collection:Source,
55+
every interval:Milliseconds = .milliseconds(30_000),
56+
since start:inout BSON.Timestamp?,
57+
yield:(Mongo.ChangeEvent<Delta>) async throws -> ()) async throws where
58+
Source:Mongo.CollectionModel<Delta.Model>,
59+
Delta:Mongo.MasterCodingDelta,
60+
Delta:Sendable,
61+
Delta.Model.CodingKey:Sendable,
62+
Delta.Model:BSONDecodable
63+
{
64+
try await self.session.run(
65+
command: Mongo.Aggregate<Mongo.Cursor<Mongo.ChangeEvent<Delta>>>.init(Source.name,
66+
tailing: .init(timeout: interval, awaits: true))
67+
{
68+
$0[stage: .changeStream] { $0[.startAtOperationTime] = start }
69+
},
70+
against: collection.database)
71+
{
72+
for try await events:[Mongo.ChangeEvent<Delta>] in $0
73+
{
74+
for event:Mongo.ChangeEvent<Delta> in events
75+
{
76+
try await yield(event)
77+
start = event.clusterTime
78+
}
79+
}
80+
}
81+
}
82+
}
83+
extension Mongo.DatabaseModel
84+
{
85+
// This should be part of the swift-mongodb package. An incredibly interesting statement,
86+
// considering this method is private.
87+
@inlinable
88+
func explain<Command>(command:Command) async throws -> String
89+
where Command:Mongo.Command
90+
{
91+
try await self.session.run(
92+
command: Mongo.Explain<Command>.init(verbosity: .executionStats, command: command),
93+
against: self.id)
94+
}
95+
96+
@inlinable public
97+
func explain(query:some Mongo.PipelineQuery) async throws -> String
98+
{
99+
try await self.explain(command: query.command(stride: nil))
100+
}
101+
102+
@inlinable public
103+
func explain(update:some Mongo.UpdateQuery) async throws -> String
104+
{
105+
try await self.explain(command: update.command)
106+
}
107+
}

Sources/UnidocDB/Mongo.PipelineEndpoint.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,13 @@ extension Mongo.PipelineEndpoint
7373
}
7474
}
7575
}
76+
extension Mongo.PipelineEndpoint
77+
{
78+
/// A shorthand for calling ``pull(from:with:)`` with the ``DatabaseModel/id`` and
79+
/// ``DatabaseModel/session`` of the given `database`.
80+
@inlinable public mutating
81+
func pull(from database:some Mongo.DatabaseModel) async throws
82+
{
83+
try await self.pull(from: database.id, with: database.session)
84+
}
85+
}

Sources/UnidocDB/Mongo.Session (ext).swift

Lines changed: 0 additions & 80 deletions
This file was deleted.

Sources/UnidocDB/Unidoc.DB.swift

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@ extension Unidoc.DB
205205
public
206206
func index(realm:String) async throws -> (realm:Unidoc.RealmMetadata, new:Bool)
207207
{
208-
let autoincrement:Unidoc.Autoincrement<Unidoc.RealmMetadata> = try await session.query(
209-
database: self.id,
208+
let autoincrement:Unidoc.Autoincrement<Unidoc.RealmMetadata> = try await self.query(
210209
with: Unidoc.AutoincrementQuery<RealmAliases, Realms>.init(symbol: realm))
211210
?? .first
212211

@@ -244,7 +243,7 @@ extension Unidoc.DB
244243
// Symbols are the same.
245244
return
246245
}
247-
let _:Never? = try await session.query(database: self.id, with: query)
246+
let _:Never? = try await self.query(with: query)
248247
}
249248

250249
public
@@ -296,8 +295,7 @@ extension Unidoc.DB
296295
}
297296

298297
// Placement involves autoincrement, which is why this cannot be done in an update.
299-
let placement:Unidoc.Autoincrement<Unidoc.PackageMetadata> = try await session.query(
300-
database: self.id,
298+
let placement:Unidoc.Autoincrement<Unidoc.PackageMetadata> = try await self.query(
301299
with: Unidoc.AutoincrementQuery<PackageAliases, Packages>.init(symbol: package))
302300
?? .first
303301

@@ -343,8 +341,7 @@ extension Unidoc.DB
343341
sha1:SHA1?) async throws -> (edition:Unidoc.EditionMetadata, new:Bool)
344342
{
345343
// Placement involves autoincrement, which is why this cannot be done in an update.
346-
let placement:Unidoc.EditionPlacement = try await session.query(
347-
database: self.id,
344+
let placement:Unidoc.EditionPlacement = try await self.query(
348345
with: Unidoc.EditionPlacementQuery.init(package: package, refname: name))
349346
?? .first
350347

@@ -705,8 +702,7 @@ extension Unidoc.DB
705702
alignment:
706703
if let latest:Unidoc.Edition = mesh.latestRelease
707704
{
708-
try await session.update(database: self.id,
709-
with: Volumes.AlignLatest.init(to: latest))
705+
try await self.update(with: Volumes.AlignLatest.init(to: latest))
710706

711707
guard
712708
let realm:Unidoc.Realm = mesh.metadata.realm
@@ -715,8 +711,7 @@ extension Unidoc.DB
715711
break alignment
716712
}
717713

718-
try await session.update(database: self.id,
719-
with: Groups.AlignLatest.init(to: latest, in: realm))
714+
try await self.update(with: Groups.AlignLatest.init(to: latest, in: realm))
720715
}
721716

722717
return surfaceDelta
@@ -750,8 +745,7 @@ extension Unidoc.DB
750745

751746
var pins:[Symbol.Package: Unidoc.Edition] = [:]
752747

753-
for dependency:Symbol.PackageDependency<Unidoc.Edition> in try await session.query(
754-
database: self.id,
748+
for dependency:Symbol.PackageDependency<Unidoc.Edition> in try await self.query(
755749
with: query)
756750
{
757751
pins[dependency.package] = dependency.version
@@ -895,8 +889,7 @@ extension Unidoc.DB
895889
public
896890
func align(package:Unidoc.Package, realm:Unidoc.Realm?) async throws
897891
{
898-
try await session.update(database: self.id,
899-
with: Unidoc.DB.Packages.AlignRealm.aligning(package))
892+
try await self.update(with: Unidoc.DB.Packages.AlignRealm.aligning(package))
900893

901894
groups:
902895
if let realm:Unidoc.Realm
@@ -908,19 +901,17 @@ extension Unidoc.DB
908901
break groups
909902
}
910903

911-
try await session.update(database: self.id,
912-
with: Groups.AlignLatest.init(to: latest.id, in: realm))
904+
try await self.update(with: Groups.AlignLatest.init(to: latest.id, in: realm))
913905
}
914906
else
915907
{
916-
try await session.update(database: self.id,
917-
with: Groups.ClearLatest.init(from: package))
908+
try await self.update(with: Groups.ClearLatest.init(from: package))
918909
}
919910

920-
try await session.update(database: self.id,
921-
with: Volumes.AlignRealm.init(range: .package(package), to: realm))
911+
try await self.update(with: Volumes.AlignRealm.init(
912+
range: .package(package),
913+
to: realm))
922914

923-
try await session.update(database: self.id,
924-
with: Unidoc.DB.Packages.AlignRealm.aligned(package, to: realm))
915+
try await self.update(with: Packages.AlignRealm.aligned(package, to: realm))
925916
}
926917
}

Sources/UnidocQueries/Unidoc.DB (ext).swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,31 @@ extension Unidoc.DB
1212
public
1313
func package(named symbol:Symbol.Package) async throws -> Unidoc.PackageMetadata?
1414
{
15-
try await session.query(database: self.id,
15+
try await self.query(
1616
with: Unidoc.AliasResolutionQuery<PackageAliases, Packages>.init(symbol: symbol))
1717
}
1818
/// Load the metadata for a realm by name. The returned realm might have a different
1919
/// canonical name than the one provided.
2020
public
2121
func realm(named symbol:String) async throws -> Unidoc.RealmMetadata?
2222
{
23-
try await session.query(database: self.id,
23+
try await self.query(
2424
with: Unidoc.AliasResolutionQuery<RealmAliases, Realms>.init(symbol: symbol))
2525
}
2626

2727
public
2828
func edition(package:Symbol.Package,
2929
version:Unidoc.VersionPredicate) async throws -> Unidoc.EditionOutput?
3030
{
31-
try await session.query(database: self.id,
31+
try await self.query(
3232
with: Unidoc.EditionMetadataSymbolicQuery.init(package: package, version: version))
3333
}
3434

3535
public
3636
func editionState(package:Symbol.Package,
3737
version:Unidoc.VersionPredicate) async throws -> Unidoc.EditionState?
3838
{
39-
try await session.query(database: self.id,
39+
try await self.query(
4040
with: Unidoc.EditionStateSymbolicQuery.init(package: package, version: version))
4141
}
4242

@@ -50,15 +50,15 @@ extension Unidoc.DB
5050
var pipeline:Mongo.SingleOutputFromPrimary<Unidoc.EditionStateDirectQuery> = .init(
5151
query: .init(package: id.package, version: .exact(id.version)))
5252

53-
try await pipeline.pull(from: self.id, with: session)
53+
try await pipeline.pull(from: self)
5454

5555
return pipeline.value
5656

5757
case .latest(let series, of: let package):
5858
var pipeline:Mongo.SingleOutputFromPrimary<Unidoc.EditionStateDirectQuery> = .init(
5959
query: .init(package: package, version: .match(.latest(series))))
6060

61-
try await pipeline.pull(from: self.id, with: session)
61+
try await pipeline.pull(from: self)
6262

6363
return pipeline.value
6464
}

Sources/UnidocQueryTests/Tests/LinkResolution.TestCase.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ extension LinkResolution.TestCase
4545

4646
guard
4747
let output:Unidoc.VertexOutput = tests.expect(
48-
value: try await db.session.query(database: db.id, with: query)),
48+
value: try await db.query(with: query)),
4949
let vertex:Unidoc.AnyVertex = tests.expect(
5050
value: output.principal?.vertex)
5151
else

Sources/UnidocQueryTests/Tests/PackageQueries.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ struct PackageQueries:UnidocDatabaseTestBattery
9595
await tests.do
9696
{
9797
if let index:Unidoc.TextResourceOutput = tests.expect(
98-
value: try await db.session.query(database: db.id, with: query)),
98+
value: try await db.query(with: query)),
9999
let _:MD5 = tests.expect(value: index.hash)
100100
{
101101
switch index.text
@@ -130,7 +130,7 @@ struct PackageQueries:UnidocDatabaseTestBattery
130130
{
131131
guard
132132
let output:Unidoc.VersionsQuery.Output = tests.expect(
133-
value: try await db.session.query(database: db.id, with: query))
133+
value: try await db.query(with: query))
134134
else
135135
{
136136
return
@@ -150,7 +150,7 @@ struct PackageQueries:UnidocDatabaseTestBattery
150150
{
151151
guard
152152
let output:Unidoc.VersionsQuery.Output = tests.expect(
153-
value: try await db.session.query(database: db.id, with: query))
153+
value: try await db.query(with: query))
154154
else
155155
{
156156
return
@@ -178,7 +178,7 @@ struct PackageQueries:UnidocDatabaseTestBattery
178178
{
179179
guard
180180
let output:Unidoc.VersionsQuery.Output = tests.expect(
181-
value: try await db.session.query(database: db.id, with: query))
181+
value: try await db.query(with: query))
182182
else
183183
{
184184
return
@@ -205,7 +205,7 @@ struct PackageQueries:UnidocDatabaseTestBattery
205205
{
206206
guard
207207
let output:Unidoc.VersionsQuery.Output = tests.expect(
208-
value: try await db.session.query(database: db.id, with: query))
208+
value: try await db.query(with: query))
209209
else
210210
{
211211
return

0 commit comments

Comments
 (0)