Skip to content

Commit 61eb967

Browse files
committed
Add BSONDocument.init(predicate:)
1 parent f2ac23c commit 61eb967

3 files changed

Lines changed: 63 additions & 12 deletions

File tree

Sources/MongoDBModel/FetchRequest.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,8 @@
77

88
import Foundation
99
import CoreModel
10-
import Predicate
1110
import MongoSwift
1211

13-
public extension BSONDocument {
14-
15-
init(filter predicate: Predicate) {
16-
self.init()
17-
// TODO:
18-
assertionFailure("Not implemented")
19-
}
20-
}
21-
2212
public extension BSONDocument {
2313

2414
init(sort sortDescriptors: [FetchRequest.SortDescriptor]) {

Sources/MongoDBModel/MongoDatabase.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ internal extension MongoDatabase {
108108
) async throws -> UInt {
109109
let entityName = fetchRequest.entity
110110
let collection = self.collection(entityName, options: options)
111-
let filter = fetchRequest.predicate.map { BSONDocument(filter: $0) } ?? [:]
111+
let filter = fetchRequest.predicate.flatMap { BSONDocument(predicate: $0) } ?? [:]
112112
let options = CountDocumentsOptions(fetchRequest: fetchRequest)
113113
let count = try await collection.countDocuments(filter, options: options)
114114
return UInt(count)
@@ -173,7 +173,7 @@ internal extension MongoDatabase {
173173
) async throws -> [BSONDocument] {
174174
let entityName = fetchRequest.entity
175175
let collection = self.collection(entityName, options: options)
176-
let filter = fetchRequest.predicate.map { BSONDocument(filter: $0) } ?? [:]
176+
let filter = fetchRequest.predicate.flatMap { BSONDocument(predicate: $0) } ?? [:]
177177
let options = FindOptions(fetchRequest: fetchRequest)
178178
let stream = try await collection.find(filter, options: options)
179179
var results = [BSONDocument]()
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// Predicate.swift
3+
//
4+
//
5+
// Created by Alsey Coleman Miller on 8/21/23.
6+
//
7+
8+
import Foundation
9+
import CoreModel
10+
import Predicate
11+
import MongoSwift
12+
13+
public extension BSONDocument {
14+
15+
init?(predicate: Predicate) {
16+
switch predicate {
17+
case .comparison(let comparison):
18+
self.init(predicate: comparison)
19+
case .compound(let compound):
20+
self.init(predicate: compound)
21+
case .value:
22+
return nil
23+
}
24+
}
25+
}
26+
27+
public extension BSONDocument {
28+
29+
init?(predicate: Compound) {
30+
guard predicate.type != .not else {
31+
// { field: { $not: { <operator-expression> } } }
32+
return nil
33+
}
34+
var array = [BSONDocument]()
35+
array.reserveCapacity(predicate.subpredicates.count)
36+
for subpredicate in predicate.subpredicates {
37+
guard let document = BSONDocument(predicate: subpredicate) else {
38+
return nil
39+
}
40+
array.append(document)
41+
}
42+
// { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
43+
// { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
44+
self = [LogicalQueryOperator(predicate: predicate.type).rawValue: .array(array.map { .document($0) })]
45+
}
46+
}
47+
48+
public extension BSONDocument {
49+
50+
init?(predicate: Comparison) {
51+
// { <field>: { $eq: <value> } }
52+
return nil
53+
}
54+
}
55+
56+
public extension BSON {
57+
58+
init?(predicate: Expression) {
59+
return nil
60+
}
61+
}

0 commit comments

Comments
 (0)