Skip to content

Commit c76deda

Browse files
authored
Merge pull request #414 from tayloraswift/direct-link-articles
add a “latest” flag to article vertices
2 parents c542f97 + ab6584a commit c76deda

31 files changed

+372
-167
lines changed

Package.resolved

Lines changed: 21 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ let package:Package = .init(
8989
.package(url: "https://github.com/tayloraswift/swift-json", .upToNextMinor(
9090
from: "1.1.2")),
9191
.package(url: "https://github.com/tayloraswift/swift-mongodb", .upToNextMinor(
92-
from: "0.29.2")),
92+
from: "0.29.3")),
9393
.package(url: "https://github.com/tayloraswift/swift-png", .upToNextMinor(
9494
from: "4.4.9")),
9595
.package(url: "https://github.com/tayloraswift/swift-ucf", .upToNextMinor(

Sources/UnidocDB/Editions/Unidoc.EditionPlacementQuery.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ extension Unidoc
2020
}
2121
extension Unidoc.EditionPlacementQuery:Mongo.PipelineQuery
2222
{
23-
typealias CollectionOrigin = Unidoc.DB.Editions
2423
typealias Iteration = Mongo.Single<Unidoc.EditionPlacement>
2524

2625
var collation:Mongo.Collation { .simple }
26+
var from:Mongo.Collection? { Unidoc.DB.Editions.name }
2727
var hint:Mongo.CollectionIndex? { nil }
2828

2929
func build(pipeline:inout Mongo.PipelineEncoder)

Sources/UnidocDB/Packages/Unidoc.AliasQuery.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ extension Unidoc
2929
}
3030
extension Unidoc.AliasQuery:Mongo.PipelineQuery
3131
{
32-
typealias CollectionOrigin = Aliases
3332
typealias Iteration = Mongo.Single<Never>
3433

3534
var collation:Mongo.Collation { .simple }
35+
var from:Mongo.Collection? { Aliases.name }
3636
var hint:Mongo.CollectionIndex? { nil }
3737

3838
func build(pipeline:inout Mongo.PipelineEncoder)

Sources/UnidocDB/Packages/Unidoc.AutoincrementQuery.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ extension Unidoc
2121
}
2222
extension Unidoc.AutoincrementQuery:Mongo.PipelineQuery
2323
{
24-
typealias CollectionOrigin = Aliases
2524
typealias Iteration = Mongo.Single<Unidoc.Autoincrement<Targets.Element>>
2625

2726
var collation:Mongo.Collation { .simple }
27+
var from:Mongo.Collection? { Aliases.name }
2828
var hint:Mongo.CollectionIndex? { nil }
2929

3030
func build(pipeline:inout Mongo.PipelineEncoder)

Sources/UnidocDB/Sitemaps/Unidoc.SitemapIndexQuery.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ extension Unidoc
1010
}
1111
extension Unidoc.SitemapIndexQuery:Mongo.PipelineQuery
1212
{
13-
typealias CollectionOrigin = Unidoc.DB.Sitemaps
1413
typealias Iteration = Mongo.Cursor<Unidoc.SitemapIndexEntry>
1514

1615
var collation:Mongo.Collation { .simple }
16+
var from:Mongo.Collection? { Unidoc.DB.Sitemaps.name }
1717
var hint:Mongo.CollectionIndex? { nil }
1818

1919
func build(pipeline:inout Mongo.PipelineEncoder)

Sources/UnidocDB/Snapshots/Unidoc.PinDependenciesQuery.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ extension Unidoc.PinDependenciesQuery
4949
}
5050
extension Unidoc.PinDependenciesQuery:Mongo.PipelineQuery
5151
{
52-
typealias CollectionOrigin = Unidoc.DB.PackageAliases
5352
typealias Iteration = Mongo.SingleBatch<Symbol.PackageDependency<Unidoc.EditionMetadata>>
5453

5554
var collation:Mongo.Collation { .simple }
55+
var from:Mongo.Collection? { Unidoc.DB.PackageAliases.name }
5656
var hint:Mongo.CollectionIndex? { nil }
5757

5858
func build(pipeline:inout Mongo.PipelineEncoder)
@@ -75,6 +75,8 @@ extension Unidoc.PinDependenciesQuery:Mongo.PipelineQuery
7575

7676
// Map the coordinates back to the patch versions associated with the original
7777
// packages.
78+
//
79+
// https://www.mongodb.com/docs/manual/reference/operator/aggregation/documents/#use-a--documents-stage-in-a--lookup-stage
7880
pipeline[stage: .lookup]
7981
{
8082
$0[.foreignField] = Symbol.PackageDependency<PatchVersion>[.package]

Sources/UnidocDB/Unidoc.DB.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,8 @@ extension Unidoc.DB
599599
try await self.trees.insert(mesh.trees)
600600

601601
try await self.redirects.insert(mesh.redirects)
602-
try await self.vertices.insert(mesh.vertices)
602+
try await self.vertices.insert(mesh.vertices,
603+
trunk: mesh.metadata.latest ? mesh.metadata.symbol.package : nil)
603604
try await self.groups.insert(mesh.groups,
604605
realm: mesh.metadata.latest ? mesh.metadata.realm : nil)
605606

@@ -654,7 +655,8 @@ extension Unidoc.DB
654655
alignment:
655656
if let latest:Unidoc.Edition = mesh.latestRelease
656657
{
657-
try await self.update(with: Volumes.AlignLatest.init(to: latest))
658+
try await self.update(with: Vertices.VacuumLatest.init(around: latest))
659+
try await self.update(with: Volumes.VacuumLatest.init(around: latest))
658660

659661
guard
660662
let realm:Unidoc.Realm = mesh.metadata.realm
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import MongoDB
2+
import MongoQL
3+
import Unidoc
4+
import UnidocRecords
5+
6+
extension Unidoc.DB.Vertices
7+
{
8+
struct VacuumLatest
9+
{
10+
let latest:Unidoc.Edition
11+
12+
init(around latest:Unidoc.Edition)
13+
{
14+
self.latest = latest
15+
}
16+
}
17+
}
18+
extension Unidoc.DB.Vertices.VacuumLatest:Mongo.UpdateQuery
19+
{
20+
typealias Target = Unidoc.DB.Vertices
21+
typealias Effect = Mongo.Many
22+
23+
var ordered:Bool { true }
24+
25+
func build(updates:inout Mongo.UpdateListEncoder<Mongo.Many>)
26+
{
27+
let latest:ClosedRange<Unidoc.Scalar> = .edition(self.latest)
28+
let all:ClosedRange<Unidoc.Scalar> = .package(self.latest.package)
29+
30+
updates
31+
{
32+
$0[.multi] = true
33+
$0[.hint] = Unidoc.DB.Vertices.indexLinkableFlag.id
34+
$0[.q]
35+
{
36+
$0[.and]
37+
{
38+
$0 { $0[Unidoc.AnyVertex[.linkable]] = true }
39+
$0 { $0[Unidoc.AnyVertex[.id]] { $0[.gte] = all.lowerBound } }
40+
$0 { $0[Unidoc.AnyVertex[.id]] { $0[.lte] = all.upperBound } }
41+
$0
42+
{
43+
$0[.or]
44+
{
45+
$0 { $0[Unidoc.AnyVertex[.id]] { $0[.lt] = latest.lowerBound } }
46+
$0 { $0[Unidoc.AnyVertex[.id]] { $0[.gt] = latest.upperBound } }
47+
}
48+
}
49+
}
50+
}
51+
$0[.u]
52+
{
53+
$0[.unset] { $0[Unidoc.AnyVertex[.linkable]] = true }
54+
$0[.unset] { $0[Unidoc.AnyVertex[.trunk]] = true }
55+
}
56+
}
57+
}
58+
}

Sources/UnidocDB/Vertices/Unidoc.DB.Vertices.swift

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import MongoDB
22
import MongoQL
3+
import Symbols
34
import Unidoc
45
import UnidocRecords
56

@@ -23,8 +24,8 @@ extension Unidoc.DB
2324
}
2425
extension Unidoc.DB.Vertices
2526
{
26-
public static
27-
let indexStem:Mongo.CollectionIndex = .init("Stem",
27+
public
28+
static let indexStem:Mongo.CollectionIndex = .init("Stem",
2829
collation: .casefolding,
2930
unique: true)
3031
{
@@ -44,14 +45,34 @@ extension Unidoc.DB.Vertices
4445
$0[Unidoc.AnyVertex[.stem]] { $0[.exists] = true }
4546
}
4647

47-
public static
48-
let indexHash:Mongo.CollectionIndex = .init("Hash",
48+
public
49+
static let indexHash:Mongo.CollectionIndex = .init("Hash",
4950
collation: .casefolding,
5051
unique: true)
5152
{
5253
$0[Unidoc.AnyVertex[.hash]] = (+)
5354
$0[Unidoc.AnyVertex[.id]] = (+)
5455
}
56+
57+
public
58+
static let indexLinkableFlag:Mongo.CollectionIndex = .init("LinkableFlag",
59+
unique: true)
60+
{
61+
$0[Unidoc.AnyVertex[.linkable]] = (+)
62+
$0[Unidoc.AnyVertex[.id]] = (+)
63+
}
64+
65+
public
66+
static let indexLinkablePath:Mongo.CollectionIndex = .init("LinkablePath",
67+
collation: .casefolding)
68+
{
69+
$0[Unidoc.AnyVertex[.trunk]] = (+)
70+
$0[Unidoc.AnyVertex[.stem]] = (+)
71+
}
72+
where:
73+
{
74+
$0[Unidoc.AnyVertex[.linkable]] = true
75+
}
5576
}
5677
extension Unidoc.DB.Vertices:Mongo.CollectionModel
5778
{
@@ -62,15 +83,28 @@ extension Unidoc.DB.Vertices:Mongo.CollectionModel
6283
var name:Mongo.Collection { "VolumeVertices" }
6384

6485
@inlinable public static
65-
var indexes:[Mongo.CollectionIndex] { [ Self.indexStem, Self.indexHash ] }
86+
var indexes:[Mongo.CollectionIndex]
87+
{
88+
[
89+
Self.indexStem,
90+
Self.indexHash,
91+
Self.indexLinkableFlag,
92+
Self.indexLinkablePath,
93+
]
94+
}
6695
}
96+
@available(*, unavailable, message: """
97+
Vertices contain flags set by the database, which would be lost if they were decoded and \
98+
re-encoded.
99+
""")
67100
extension Unidoc.DB.Vertices:Mongo.RecodableModel
68101
{
69102
}
70103
extension Unidoc.DB.Vertices
71104
{
72105
@discardableResult
73-
func insert(_ vertices:Unidoc.Mesh.Vertices) async throws -> Mongo.Insertions
106+
func insert(_ vertices:Unidoc.Mesh.Vertices,
107+
trunk:Symbol.Package?) async throws -> Mongo.Insertions
74108
{
75109
let response:Mongo.InsertResponse = try await session.run(
76110
command: Mongo.Insert.init(Self.name,
@@ -80,7 +114,20 @@ extension Unidoc.DB.Vertices
80114
}
81115
documents:
82116
{
83-
$0 += vertices.articles.lazy.map(Unidoc.AnyVertex.article(_:))
117+
for article:Unidoc.ArticleVertex in vertices.articles
118+
{
119+
$0[Unidoc.AnyVertex.CodingKey.self]
120+
{
121+
Unidoc.AnyVertex.article(article).encode(to: &$0)
122+
123+
if let trunk:Symbol.Package
124+
{
125+
$0[.linkable] = true
126+
$0[.trunk] = trunk
127+
}
128+
}
129+
}
130+
84131
$0 += vertices.cultures.lazy.map(Unidoc.AnyVertex.culture(_:))
85132
$0 += vertices.decls.lazy.map(Unidoc.AnyVertex.decl(_:))
86133
$0 += vertices.files.lazy.map(Unidoc.AnyVertex.file(_:))

Sources/UnidocDB/Volumes/Unidoc.DB.Volumes.AlignLatest.swift

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

0 commit comments

Comments
 (0)