Skip to content

Commit b21a215

Browse files
committed
decompose many DB operations into CRUD primitives, and move those primitives to the _MongoDB module
1 parent 9f33e0f commit b21a215

30 files changed

+289
-314
lines changed

Package.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,11 @@ let package:Package = .init(
290290

291291
.target(name: "Media"),
292292

293+
.target(name: "_MongoDB",
294+
dependencies: [
295+
.product(name: "MongoDB", package: "swift-mongodb"),
296+
]),
297+
293298
.target(name: "Multiparts",
294299
dependencies: [
295300
.target(name: "Media"),
@@ -482,11 +487,11 @@ let package:Package = .init(
482487

483488
.target(name: "UnidocDB",
484489
dependencies: [
490+
.target(name: "_MongoDB"),
485491
.target(name: "UnidocRecords_LZ77"),
486492
.target(name: "UnidocLinker"),
487493
.target(name: "UnidocRecords"),
488494
.product(name: "UnixCalendar", package: "swift-unixtime"),
489-
.product(name: "MongoDB", package: "swift-mongodb"),
490495
]),
491496

492497
.target(name: "UnidocRecords_LZ77",

Sources/UnidocDB/Activity/Unidoc.DB.RepoFeed.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,17 @@ extension Unidoc.DB.RepoFeed:Mongo.CollectionModel
3636
}
3737
extension Unidoc.DB.RepoFeed
3838
{
39+
@available(*, deprecated, renamed: "find(last:)")
3940
public
4041
func last(_ count:Int) async throws -> [Activity]
4142
{
4243
try await self.find(last: count)
4344
}
4445

46+
@available(*, deprecated, renamed: "insert(_:)")
4547
public
4648
func push(_ activity:Activity) async throws
4749
{
48-
try await self.insert(some: activity)
50+
try await self.insert(activity)
4951
}
5052
}

Sources/UnidocDB/Crawling/Unidoc.DB.CrawlingWindows.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ extension Unidoc.DB.CrawlingWindows
9595
}
9696

9797
/// Updates the state of an existing crawling window.
98+
@available(*, deprecated, renamed: "replace(_:)")
9899
@discardableResult
99100
public
100101
func push(window:Unidoc.CrawlingWindow) async throws -> Bool?
101102
{
102-
try await self.update(some: window)
103+
try await self.replace(window)
103104
}
104105
}

Sources/UnidocDB/Editions/Unidoc.DB.Editions.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,4 @@ extension Unidoc.DB.Editions:Mongo.CollectionModel
105105
}
106106
extension Unidoc.DB.Editions:Mongo.RecodableModel
107107
{
108-
public
109-
func recode() async throws -> (modified:Int, of:Int)
110-
{
111-
try await self.recode(through: Unidoc.EditionMetadata.self,
112-
by: .now.advanced(by: .seconds(60)))
113-
}
114108
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import MongoDB
2+
3+
// TODO: we need to unify ``Unidoc.Scalar`` and ``Unidoc.Group`, most likely by introducing
4+
// a new type ``Unidoc.Vertex``.
5+
extension Mongo.CollectionModel // where Element.ID == Unidoc.Scalar
6+
{
7+
/// Deletes all records from the collection within the specified zone.
8+
func clear(range:Unidoc.Edition) async throws
9+
{
10+
let response:Mongo.DeleteResponse = try await session.run(
11+
command: Mongo.Delete<Mongo.Many>.init(Self.name)
12+
{
13+
$0
14+
{
15+
$0[.limit] = .unlimited
16+
$0[.q]
17+
{
18+
$0[.and]
19+
{
20+
$0 { $0["_id"] { $0[.gte] = range.min } }
21+
$0 { $0["_id"] { $0[.lte] = range.max } }
22+
}
23+
}
24+
}
25+
},
26+
against: self.database)
27+
28+
let _:Mongo.Deletions = try response.deletions()
29+
}
30+
}

Sources/UnidocDB/Mongo.RecodableModel.swift

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

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

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

Sources/UnidocDB/Packages/Unidoc.DB.PackageAliases.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,14 @@ extension Unidoc.DB.PackageAliases:Mongo.CollectionModel
4343
}
4444
extension Unidoc.DB.PackageAliases
4545
{
46-
public
47-
func upsert(alias:Symbol.Package,
48-
of coordinate:Unidoc.Package) async throws
46+
@inlinable public
47+
func upsert(alias:Symbol.Package, of coordinate:Unidoc.Package) async throws
4948
{
50-
try await self.upsert(some: Unidoc.PackageAlias.init(id: alias, coordinate: coordinate))
49+
try await self.upsert(.init(id: alias, coordinate: coordinate))
5150
}
5251

53-
func insert(alias:Symbol.Package,
54-
of coordinate:Unidoc.Package) async throws
52+
func insert(alias:Symbol.Package, of coordinate:Unidoc.Package) async throws
5553
{
56-
try await self.insert(some: Unidoc.PackageAlias.init(id: alias, coordinate: coordinate))
54+
try await self.insert(.init(id: alias, coordinate: coordinate))
5755
}
5856
}

Sources/UnidocDB/Packages/Unidoc.DB.PackageDependencies.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ extension Unidoc.DB.PackageDependencies:Mongo.CollectionModel
5656
}
5757
extension Unidoc.DB.PackageDependencies:Mongo.RecodableModel
5858
{
59-
public
60-
func recode() async throws -> (modified:Int, of:Int)
61-
{
62-
try await self.recode(through: Unidoc.PackageDependency.self,
63-
by: .now.advanced(by: .seconds(30)))
64-
}
6559
}
6660
extension Unidoc.DB.PackageDependencies
6761
{

Sources/UnidocDB/Packages/Unidoc.DB.Packages.swift

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,39 @@ extension Unidoc.DB.Packages:Mongo.CollectionModel
9595
}
9696
extension Unidoc.DB.Packages:Mongo.RecodableModel
9797
{
98-
public
99-
func recode() async throws -> (modified:Int, of:Int)
100-
{
101-
try await self.recode(through: Unidoc.PackageMetadata.self,
102-
by: .now.advanced(by: .seconds(30)))
103-
}
10498
}
10599
extension Unidoc.DB.Packages
106100
{
101+
private
102+
func reset<Value>(field:Element.CodingKey,
103+
of package:Element.ID,
104+
to value:Value?) async throws -> Element? where Value:BSONEncodable
105+
{
106+
try await self.modify(existing: package, returning: .new)
107+
{
108+
if let value:Value
109+
{
110+
$0[.set] { $0[Element[field]] = value }
111+
}
112+
else
113+
{
114+
$0[.unset] { $0[Element[field]] = () }
115+
}
116+
}
117+
}
118+
107119
public
108120
func reset(media:Unidoc.PackageMedia?,
109121
of package:Unidoc.Package) async throws -> Unidoc.PackageMetadata?
110122
{
111-
try await self.reset(field: .media,
112-
of: package,
113-
to: media)
123+
try await self.reset(field: .media, of: package, to: media)
114124
}
115125

116126
public
117127
func reset(platformPreference triple:Triple?,
118128
of package:Unidoc.Package) async throws -> Unidoc.PackageMetadata?
119129
{
120-
try await self.reset(field: .platformPreference,
121-
of: package,
122-
to: triple)
130+
try await self.reset(field: .platformPreference, of: package, to: triple)
123131
}
124132
}
125133
extension Unidoc.DB.Packages
@@ -151,17 +159,11 @@ extension Unidoc.DB.Packages
151159
}
152160
extension Unidoc.DB.Packages
153161
{
162+
@available(*, deprecated, renamed: "replace(_:)")
154163
public
155164
func update(metadata:Unidoc.PackageMetadata) async throws -> Bool?
156165
{
157-
try await self.update(some: metadata)
158-
}
159-
160-
public
161-
func update(package:Unidoc.Package,
162-
symbol:Symbol.Package) async throws -> Bool?
163-
{
164-
try await self.update(field: .symbol, of: package, to: symbol)
166+
try await self.replace(metadata)
165167
}
166168

167169
public

0 commit comments

Comments
 (0)