mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-31 22:53:04 +02:00
complete query utilities
This commit is contained in:
@@ -38,14 +38,14 @@ final class GroupByTests: BaseTestCase {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let groupBy = GroupBy()
|
let groupBy = GroupBy<NSManagedObject>()
|
||||||
XCTAssertEqual(groupBy, GroupBy([] as [String]))
|
XCTAssertEqual(groupBy, GroupBy([] as [String]))
|
||||||
XCTAssertNotEqual(groupBy, GroupBy("key"))
|
XCTAssertNotEqual(groupBy, GroupBy("key"))
|
||||||
XCTAssertTrue(groupBy.keyPaths.isEmpty)
|
XCTAssertTrue(groupBy.keyPaths.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let groupBy = GroupBy("key1")
|
let groupBy = GroupBy<NSManagedObject>("key1")
|
||||||
XCTAssertEqual(groupBy, GroupBy("key1"))
|
XCTAssertEqual(groupBy, GroupBy("key1"))
|
||||||
XCTAssertEqual(groupBy, GroupBy(["key1"]))
|
XCTAssertEqual(groupBy, GroupBy(["key1"]))
|
||||||
XCTAssertNotEqual(groupBy, GroupBy("key2"))
|
XCTAssertNotEqual(groupBy, GroupBy("key2"))
|
||||||
@@ -53,7 +53,7 @@ final class GroupByTests: BaseTestCase {
|
|||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let groupBy = GroupBy("key1", "key2")
|
let groupBy = GroupBy<NSManagedObject>("key1", "key2")
|
||||||
XCTAssertEqual(groupBy, GroupBy("key1", "key2"))
|
XCTAssertEqual(groupBy, GroupBy("key1", "key2"))
|
||||||
XCTAssertEqual(groupBy, GroupBy(["key1", "key2"]))
|
XCTAssertEqual(groupBy, GroupBy(["key1", "key2"]))
|
||||||
XCTAssertNotEqual(groupBy, GroupBy("key2", "key1"))
|
XCTAssertNotEqual(groupBy, GroupBy("key2", "key1"))
|
||||||
@@ -66,7 +66,7 @@ final class GroupByTests: BaseTestCase {
|
|||||||
|
|
||||||
self.prepareStack { (dataStack) in
|
self.prepareStack { (dataStack) in
|
||||||
|
|
||||||
let groupBy = GroupBy(#keyPath(TestEntity1.testString))
|
let groupBy = GroupBy<NSManagedObject>(#keyPath(TestEntity1.testString))
|
||||||
|
|
||||||
let request = CoreStoreFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
_ = From<TestEntity1>().applyToFetchRequest(request, context: dataStack.mainContext)
|
_ = From<TestEntity1>().applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ import CoreStore
|
|||||||
|
|
||||||
// MARK: - XCTAssertAllEqual
|
// MARK: - XCTAssertAllEqual
|
||||||
|
|
||||||
private func XCTAssertAllEqual<D: DynamicObject>(_ whereClauses: Where<D>...) {
|
private func XCTAssertAllEqual<D>(_ whereClauses: Where<D>...) {
|
||||||
|
|
||||||
XCTAssertAllEqual(whereClauses)
|
XCTAssertAllEqual(whereClauses)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func XCTAssertAllEqual<D: DynamicObject>(_ whereClauses: [Where<D>]) {
|
private func XCTAssertAllEqual<D>(_ whereClauses: [Where<D>]) {
|
||||||
|
|
||||||
for i in whereClauses.indices {
|
for i in whereClauses.indices {
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ internal protocol AttributeProtocol: class {
|
|||||||
|
|
||||||
static var attributeType: NSAttributeType { get }
|
static var attributeType: NSAttributeType { get }
|
||||||
|
|
||||||
var keyPath: RawKeyPath { get }
|
var keyPath: KeyPathString { get }
|
||||||
var isOptional: Bool { get }
|
var isOptional: Bool { get }
|
||||||
var isIndexed: Bool { get }
|
var isIndexed: Bool { get }
|
||||||
var isTransient: Bool { get }
|
var isTransient: Bool { get }
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import CoreData
|
|||||||
- SeeAlso: `GroupBy`
|
- SeeAlso: `GroupBy`
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
public final class CSGroupBy: NSObject, CSQueryClause {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The list of key path strings to group results with
|
The list of key path strings to group results with
|
||||||
@@ -102,11 +102,11 @@ public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
|||||||
|
|
||||||
// MARK: CoreStoreObjectiveCType
|
// MARK: CoreStoreObjectiveCType
|
||||||
|
|
||||||
public let bridgeToSwift: GroupBy
|
public let bridgeToSwift: GroupBy<NSManagedObject>
|
||||||
|
|
||||||
public init(_ swiftValue: GroupBy) {
|
public init<D: NSManagedObject>(_ swiftValue: GroupBy<D>) {
|
||||||
|
|
||||||
self.bridgeToSwift = swiftValue
|
self.bridgeToSwift = swiftValue.downcast()
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,7 +114,7 @@ public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
|||||||
|
|
||||||
// MARK: - GroupBy
|
// MARK: - GroupBy
|
||||||
|
|
||||||
extension GroupBy: CoreStoreSwiftType {
|
extension GroupBy where D: NSManagedObject {
|
||||||
|
|
||||||
// MARK: CoreStoreSwiftType
|
// MARK: CoreStoreSwiftType
|
||||||
|
|
||||||
@@ -122,4 +122,12 @@ extension GroupBy: CoreStoreSwiftType {
|
|||||||
|
|
||||||
return CSGroupBy(self)
|
return CSGroupBy(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: FilePrivate
|
||||||
|
|
||||||
|
fileprivate func downcast() -> GroupBy<NSManagedObject> {
|
||||||
|
|
||||||
|
return GroupBy<NSManagedObject>(self.keyPaths)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ public protocol QueryChainableBuilderType {
|
|||||||
|
|
||||||
var from: From<ObjectType> { get set }
|
var from: From<ObjectType> { get set }
|
||||||
var select: Select<ResultType> { get set }
|
var select: Select<ResultType> { get set }
|
||||||
var groupBy: GroupBy { get set }
|
|
||||||
var queryClauses: [QueryClause] { get set }
|
var queryClauses: [QueryClause] { get set }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +79,6 @@ public struct QueryChainBuilder<D: DynamicObject, R: SelectResultType>: QueryCha
|
|||||||
|
|
||||||
public var from: From<D>
|
public var from: From<D>
|
||||||
public var select: Select<R>
|
public var select: Select<R>
|
||||||
public var groupBy: GroupBy
|
|
||||||
public var queryClauses: [QueryClause] = []
|
public var queryClauses: [QueryClause] = []
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +109,6 @@ public extension From {
|
|||||||
return .init(
|
return .init(
|
||||||
from: self,
|
from: self,
|
||||||
select: .init(selectTerms),
|
select: .init(selectTerms),
|
||||||
groupBy: .init(),
|
|
||||||
queryClauses: []
|
queryClauses: []
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -215,19 +212,19 @@ public extension FetchChainBuilder {
|
|||||||
|
|
||||||
public extension QueryChainBuilder {
|
public extension QueryChainBuilder {
|
||||||
|
|
||||||
|
public func groupBy(_ clause: GroupBy<D>) -> QueryChainBuilder<D, R> {
|
||||||
|
|
||||||
|
return self.queryChain(appending: clause)
|
||||||
|
}
|
||||||
|
|
||||||
public func groupBy(_ keyPath: KeyPathString, _ keyPaths: KeyPathString...) -> QueryChainBuilder<D, R> {
|
public func groupBy(_ keyPath: KeyPathString, _ keyPaths: KeyPathString...) -> QueryChainBuilder<D, R> {
|
||||||
|
|
||||||
return self.groupBy([keyPath] + keyPaths)
|
return self.groupBy(GroupBy<D>([keyPath] + keyPaths))
|
||||||
}
|
}
|
||||||
|
|
||||||
public func groupBy(_ keyPaths: [KeyPathString]) -> QueryChainBuilder<D, R> {
|
public func groupBy(_ keyPaths: [KeyPathString]) -> QueryChainBuilder<D, R> {
|
||||||
|
|
||||||
return .init(
|
return self.queryChain(appending: GroupBy<D>(keyPaths))
|
||||||
from: self.from,
|
|
||||||
select: self.select,
|
|
||||||
groupBy: .init(keyPaths),
|
|
||||||
queryClauses: self.queryClauses
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func `where`(_ clause: Where<D>) -> QueryChainBuilder<D, R> {
|
public func `where`(_ clause: Where<D>) -> QueryChainBuilder<D, R> {
|
||||||
@@ -268,7 +265,6 @@ public extension QueryChainBuilder {
|
|||||||
return .init(
|
return .init(
|
||||||
from: self.from,
|
from: self.from,
|
||||||
select: self.select,
|
select: self.select,
|
||||||
groupBy: self.groupBy,
|
|
||||||
queryClauses: self.queryClauses + [clause]
|
queryClauses: self.queryClauses + [clause]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,58 +26,6 @@
|
|||||||
import CoreData
|
import CoreData
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
//public extension From where D: NSManagedObject {
|
|
||||||
//
|
|
||||||
//// public func select<R>(_ resultType: R.Type, _ selectTerm: SelectTerm, _ selectTerms: SelectTerm...) -> QueryChainBuilder<D, R> {
|
|
||||||
////
|
|
||||||
//// return self.select(resultType, [selectTerm] + selectTerms)
|
|
||||||
//// }
|
|
||||||
////
|
|
||||||
//// public func select<R>(_ resultType: R.Type, _ selectTerms: [SelectTerm]) -> QueryChainBuilder<D, R> {
|
|
||||||
////
|
|
||||||
//// return .init(
|
|
||||||
//// from: self,
|
|
||||||
//// select: .init(selectTerms),
|
|
||||||
//// groupBy: .init(),
|
|
||||||
//// fetchClauses: []
|
|
||||||
//// )
|
|
||||||
//// }
|
|
||||||
//
|
|
||||||
// public func sectionBy<T>(_ sectionKeyPath: KeyPath<D, T>) -> SectionMonitorChainBuilder<D> {
|
|
||||||
//
|
|
||||||
// return self.sectionBy(sectionKeyPath._kvcKeyPathString!, { $0 })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func sectionBy<T>(_ sectionKeyPath: KeyPath<D, T>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) -> SectionMonitorChainBuilder<D> {
|
|
||||||
//
|
|
||||||
// return self.sectionBy(sectionKeyPath._kvcKeyPathString!, sectionIndexTransformer)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func `where`<T>(_ keyPath: KeyPath<D, T>, isEqualTo value: Void?) -> FetchChainBuilder<D> {
|
|
||||||
//
|
|
||||||
// return self.where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func `where`<U: QueryableAttributeType>(_ keyPath: KeyPath<D, U>, isEqualTo value: U?) -> FetchChainBuilder<D> {
|
|
||||||
//
|
|
||||||
// return self.where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func `where`(_ keyPath: KeyPath<D, D>, isEqualTo object: D?) -> FetchChainBuilder<D> {
|
|
||||||
//
|
|
||||||
// return self.where(keyPath._kvcKeyPathString!, isEqualTo: object)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func `where`<S: Sequence>(_ keyPath: KeyPath<D, S.Iterator.Element>, isMemberOf list: S) -> FetchChainBuilder<D> where S.Iterator.Element: QueryableAttributeType {
|
|
||||||
//
|
|
||||||
// return self.where(keyPath._kvcKeyPathString!, isMemberOf: list)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public func `where`<S: Sequence>(_ keyPath: KeyPath<D, S.Iterator.Element>, isMemberOf list: S) -> FetchChainBuilder<D> where S.Iterator.Element == D {
|
|
||||||
//
|
|
||||||
// return self.where(keyPath._kvcKeyPathString!, isMemberOf: list)
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
// MARK: - DynamicObject
|
// MARK: - DynamicObject
|
||||||
|
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ extension DataStack: FetchableSource, QueryableSource {
|
|||||||
|
|
||||||
// TODO: docs
|
// TODO: docs
|
||||||
public func fetchAll<B: FetchChainableBuilderType>(_ clauseChain: B) -> [B.ObjectType]? {
|
public func fetchAll<B: FetchChainableBuilderType>(_ clauseChain: B) -> [B.ObjectType]? {
|
||||||
|
|
||||||
CoreStore.assert(
|
CoreStore.assert(
|
||||||
Thread.isMainThread,
|
Thread.isMainThread,
|
||||||
"Attempted to fetch from a \(cs_typeName(self)) outside the main thread."
|
"Attempted to fetch from a \(cs_typeName(self)) outside the main thread."
|
||||||
|
|||||||
@@ -32,12 +32,7 @@ import CoreData
|
|||||||
/**
|
/**
|
||||||
The `GroupBy` clause specifies that the result of a query be grouped accoording to the specified key path.
|
The `GroupBy` clause specifies that the result of a query be grouped accoording to the specified key path.
|
||||||
*/
|
*/
|
||||||
public struct GroupBy: QueryClause, Hashable {
|
public struct GroupBy<D: DynamicObject>: GroupByClause, QueryClause, Hashable {
|
||||||
|
|
||||||
/**
|
|
||||||
The list of key path strings to group results with
|
|
||||||
*/
|
|
||||||
public let keyPaths: [KeyPathString]
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes a `GroupBy` clause with an empty list of key path strings
|
Initializes a `GroupBy` clause with an empty list of key path strings
|
||||||
@@ -69,6 +64,13 @@ public struct GroupBy: QueryClause, Hashable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: WhereClause
|
||||||
|
|
||||||
|
public typealias ObjectType = D
|
||||||
|
|
||||||
|
public let keyPaths: [KeyPathString]
|
||||||
|
|
||||||
|
|
||||||
// MARK: QueryClause
|
// MARK: QueryClause
|
||||||
|
|
||||||
public func applyToFetchRequest<ResultType>(_ fetchRequest: NSFetchRequest<ResultType>) {
|
public func applyToFetchRequest<ResultType>(_ fetchRequest: NSFetchRequest<ResultType>) {
|
||||||
@@ -100,3 +102,22 @@ public struct GroupBy: QueryClause, Hashable {
|
|||||||
return (self.keyPaths as NSArray).hashValue
|
return (self.keyPaths as NSArray).hashValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - GroupByClause
|
||||||
|
|
||||||
|
/**
|
||||||
|
Abstracts the `GroupBy` clause for protocol utilities.
|
||||||
|
*/
|
||||||
|
public protocol GroupByClause {
|
||||||
|
|
||||||
|
/**
|
||||||
|
The `DynamicObject` type associated with the clause
|
||||||
|
*/
|
||||||
|
associatedtype ObjectType: DynamicObject
|
||||||
|
|
||||||
|
/**
|
||||||
|
The list of key path strings to group results with
|
||||||
|
*/
|
||||||
|
var keyPaths: [KeyPathString] { get }
|
||||||
|
}
|
||||||
|
|||||||
@@ -303,6 +303,12 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource {
|
|||||||
return self.queryValue(selectTerms, fetchRequest: fetchRequest)
|
return self.queryValue(selectTerms, fetchRequest: fetchRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@nonobjc
|
||||||
|
public func queryValue<B>(_ clauseChain: B) -> B.ResultType? where B : QueryChainableBuilderType, B.ResultType : QueryableAttributeType {
|
||||||
|
|
||||||
|
return self.queryValue(clauseChain.from, clauseChain.select, clauseChain.queryClauses)
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc
|
@nonobjc
|
||||||
public func queryAttributes<D>(_ from: From<D>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
|
public func queryAttributes<D>(_ from: From<D>, _ selectClause: Select<NSDictionary>, _ queryClauses: QueryClause...) -> [[String: Any]]? {
|
||||||
|
|
||||||
@@ -327,6 +333,11 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource {
|
|||||||
return self.queryAttributes(fetchRequest)
|
return self.queryAttributes(fetchRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func queryAttributes<B>(_ clauseChain: B) -> [[String : Any]]? where B : QueryChainableBuilderType, B.ResultType == NSDictionary {
|
||||||
|
|
||||||
|
return self.queryAttributes(clauseChain.from, clauseChain.select, clauseChain.queryClauses)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: FetchableSource, QueryableSource
|
// MARK: FetchableSource, QueryableSource
|
||||||
|
|
||||||
|
|||||||
@@ -31,11 +31,11 @@ import CoreData
|
|||||||
|
|
||||||
internal protocol RelationshipProtocol: class {
|
internal protocol RelationshipProtocol: class {
|
||||||
|
|
||||||
var keyPath: RawKeyPath { get }
|
var keyPath: KeyPathString { get }
|
||||||
var isToMany: Bool { get }
|
var isToMany: Bool { get }
|
||||||
var isOrdered: Bool { get }
|
var isOrdered: Bool { get }
|
||||||
var deleteRule: NSDeleteRule { get }
|
var deleteRule: NSDeleteRule { get }
|
||||||
var inverse: (type: CoreStoreObject.Type, keyPath: () -> RawKeyPath?) { get }
|
var inverse: (type: CoreStoreObject.Type, keyPath: () -> KeyPathString?) { get }
|
||||||
var affectedByKeyPaths: () -> Set<String> { get }
|
var affectedByKeyPaths: () -> Set<String> { get }
|
||||||
weak var parentObject: CoreStoreObject? { get set }
|
weak var parentObject: CoreStoreObject? { get set }
|
||||||
var versionHashModifier: () -> String? { get }
|
var versionHashModifier: () -> String? { get }
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||||
*/
|
*/
|
||||||
public init(
|
public init(
|
||||||
_ keyPath: RawKeyPath,
|
_ keyPath: KeyPathString,
|
||||||
initial: @autoclosure @escaping () -> V,
|
initial: @autoclosure @escaping () -> V,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -197,7 +197,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: RawKeyPath
|
public let keyPath: KeyPathString
|
||||||
|
|
||||||
internal let isOptional = false
|
internal let isOptional = false
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
@@ -261,7 +261,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
||||||
public convenience init(
|
public convenience init(
|
||||||
_ keyPath: RawKeyPath,
|
_ keyPath: KeyPathString,
|
||||||
`default`: @autoclosure @escaping () -> V,
|
`default`: @autoclosure @escaping () -> V,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -339,7 +339,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||||
*/
|
*/
|
||||||
public init(
|
public init(
|
||||||
_ keyPath: RawKeyPath,
|
_ keyPath: KeyPathString,
|
||||||
initial: @autoclosure @escaping () -> V? = nil,
|
initial: @autoclosure @escaping () -> V? = nil,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -420,7 +420,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: RawKeyPath
|
public let keyPath: KeyPathString
|
||||||
|
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
@@ -484,7 +484,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
||||||
public convenience init(
|
public convenience init(
|
||||||
_ keyPath: RawKeyPath,
|
_ keyPath: KeyPathString,
|
||||||
`default`: @autoclosure @escaping () -> V? = nil,
|
`default`: @autoclosure @escaping () -> V? = nil,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
@available(*, deprecated: 3.2, renamed: "init(_:initial:isIndexed:isTransient:versionHashModifier:renamingIdentifier:customGetter:customSetter:affectedByKeyPaths:)")
|
||||||
public convenience init(
|
public convenience init(
|
||||||
_ keyPath: RawKeyPath,
|
_ keyPath: KeyPathString,
|
||||||
`default`: @autoclosure @escaping () -> V,
|
`default`: @autoclosure @escaping () -> V,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
|
|||||||
@@ -29,192 +29,303 @@ import Foundation
|
|||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: QueryableAttributeType & Equatable
|
// MARK: - KeyPath where Root: NSManagedObject, Value: QueryableAttributeType & Equatable
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject, Value: QueryableAttributeType & Equatable {
|
public func == <O: NSManagedObject, V: QueryableAttributeType & Equatable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
public static func == (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: value)
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func != (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
|
||||||
|
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func ~= <S: Sequence>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where S.Iterator.Element == Value {
|
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func != <O: NSManagedObject, V: QueryableAttributeType & Equatable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O: NSManagedObject, V: QueryableAttributeType & Equatable, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, V>) -> Where<O> where S.Iterator.Element == V {
|
||||||
|
|
||||||
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<QueryableAttributeType & Equatable>
|
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<QueryableAttributeType & Equatable>
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject {
|
public func == <O: NSManagedObject, V: QueryableAttributeType & Equatable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
public static func == <V: QueryableAttributeType & Equatable> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: value)
|
||||||
|
}
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
}
|
public func != <O: NSManagedObject, V: QueryableAttributeType & Equatable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
public static func != <V: QueryableAttributeType & Equatable> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: value)
|
||||||
|
}
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: value)
|
|
||||||
}
|
public func ~= <O: NSManagedObject, V: QueryableAttributeType & Equatable, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, Optional<V>>) -> Where<O> where S.Iterator.Element == V {
|
||||||
|
|
||||||
public static func ~= <S: Sequence, V: QueryableAttributeType & Equatable>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where Value == Optional<V>, S.Iterator.Element == V {
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: QueryableAttributeType
|
// MARK: - KeyPath where Root: NSManagedObject, Value: QueryableAttributeType & Comparable
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject, Value: QueryableAttributeType {
|
public func < <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
public static func < (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
return Where<O>("%K < %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
}
|
||||||
return Where("%K < %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
public func > <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
public static func > (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
return Where<O>("%K > %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
}
|
||||||
return Where("%K > %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
public func <= <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
public static func <= (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
return Where<O>("%K <= %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
}
|
||||||
return Where("%K <= %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
public func >= <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, V>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
public static func >= (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> {
|
return Where<O>("%K >= %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
|
||||||
return Where("%K >= %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<QueryableAttributeType>
|
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<QueryableAttributeType & Comparable>
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject {
|
public func < <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
public static func < <V: QueryableAttributeType> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
if let value = value {
|
||||||
|
|
||||||
if let value = value {
|
return Where<O>("%K < %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
|
||||||
return Where("%K < %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
return Where("%K < nil", keyPath._kvcKeyPathString!)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
public static func > <V: QueryableAttributeType> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
|
||||||
|
|
||||||
if let value = value {
|
return Where<O>("%K < nil", keyPath._kvcKeyPathString!)
|
||||||
|
|
||||||
return Where("%K > %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
return Where("%K > nil", keyPath._kvcKeyPathString!)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func > <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
public static func <= <V: QueryableAttributeType> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
if let value = value {
|
||||||
|
|
||||||
if let value = value {
|
return Where<O>("%K > %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
|
||||||
return Where("%K <= %@", keyPath._kvcKeyPathString!, value)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
return Where("%K <= nil", keyPath._kvcKeyPathString!)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
public static func >= <V: QueryableAttributeType> (_ keyPath: KeyPath<Root, Value>, _ value: Value) -> Where<Root> where Value == Optional<V> {
|
|
||||||
|
|
||||||
if let value = value {
|
return Where<O>("%K > nil", keyPath._kvcKeyPathString!)
|
||||||
|
}
|
||||||
return Where("%K >= %@", keyPath._kvcKeyPathString!, value)
|
}
|
||||||
}
|
|
||||||
else {
|
public func <= <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
return Where("%K >= nil", keyPath._kvcKeyPathString!)
|
if let value = value {
|
||||||
}
|
|
||||||
|
return Where<O>("%K <= %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return Where<O>("%K <= nil", keyPath._kvcKeyPathString!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func >= <O: NSManagedObject, V: QueryableAttributeType & Comparable>(_ keyPath: KeyPath<O, Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
if let value = value {
|
||||||
|
|
||||||
|
return Where<O>("%K >= %@", keyPath._kvcKeyPathString!, value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return Where<O>("%K >= nil", keyPath._kvcKeyPathString!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: NSManagedObject
|
// MARK: - KeyPath where Root: NSManagedObject, Value: NSManagedObject
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject, Value: NSManagedObject {
|
public func == <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, D>, _ object: D) -> Where<O> {
|
||||||
|
|
||||||
public static func == (_ keyPath: KeyPath<Root, Value>, _ object: Value) -> Where<Root> {
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: object)
|
||||||
|
}
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: object)
|
|
||||||
}
|
public func != <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, D>, _ object: D) -> Where<O> {
|
||||||
|
|
||||||
public static func != (_ keyPath: KeyPath<Root, Value>, _ object: Value) -> Where<Root> {
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: object)
|
||||||
|
}
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: object)
|
|
||||||
}
|
public func ~= <O: NSManagedObject, D: NSManagedObject, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, D>) -> Where<O> where S.Iterator.Element == D {
|
||||||
|
|
||||||
public static func ~= <S: Sequence>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where S.Iterator.Element == Value {
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
}
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
public func == <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, D>, _ objectID: NSManagedObjectID?) -> Where<O> {
|
||||||
|
|
||||||
public static func == (_ keyPath: KeyPath<Root, Value>, _ objectID: NSManagedObjectID?) -> Where<Root> {
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
||||||
|
}
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
|
||||||
}
|
public func != <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, D>, _ objectID: NSManagedObjectID?) -> Where<O> {
|
||||||
|
|
||||||
public static func != (_ keyPath: KeyPath<Root, Value>, _ objectID: NSManagedObjectID?) -> Where<Root> {
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
||||||
|
}
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
|
||||||
}
|
public func ~= <O: NSManagedObject, D: NSManagedObject, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, D>) -> Where<O> where S.Iterator.Element == NSManagedObjectID {
|
||||||
|
|
||||||
public static func ~= <S: Sequence>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where S.Iterator.Element == NSManagedObjectID {
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<NSManagedObject>
|
// MARK: - KeyPath where Root: NSManagedObject, Value: Optional<NSManagedObject>
|
||||||
|
|
||||||
public extension KeyPath where Root: NSManagedObject {
|
public func == <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, Optional<D>>, _ object: D?) -> Where<O> {
|
||||||
|
|
||||||
public static func == <V: NSManagedObject> (_ keyPath: KeyPath<Root, Value>, _ object: Value) -> Where<Root> where Value == Optional<V> {
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: object)
|
||||||
|
}
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: object)
|
|
||||||
|
public func != <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, Optional<D>>, _ object: D?) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: object)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O: NSManagedObject, D: NSManagedObject, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, Optional<D>>) -> Where<O> where S.Iterator.Element == D {
|
||||||
|
|
||||||
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func == <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, Optional<D>>, _ objectID: NSManagedObjectID?) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func != <O: NSManagedObject, D: NSManagedObject>(_ keyPath: KeyPath<O, Optional<D>>, _ objectID: NSManagedObjectID?) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O: NSManagedObject, D: NSManagedObject, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, Optional<D>>) -> Where<O> where S.Iterator.Element == NSManagedObjectID {
|
||||||
|
|
||||||
|
return Where<O>(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - KeyPath where Root: CoreStoreObject, Value: ValueContainer<Root>.Required<QueryableAttributeType & Equatable>
|
||||||
|
|
||||||
|
public func == <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func != <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O, V, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>) -> Where<O> where S.Iterator.Element == V {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - KeyPath where Root: CoreStoreObject, Value: ValueContainer<Root>.Optional<QueryableAttributeType & Equatable>
|
||||||
|
|
||||||
|
public func == <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func != <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O, V, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>) -> Where<O> where S.Iterator.Element == V {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - KeyPath where Root: CoreStoreObject, Value: ValueContainer<Root>.Required<QueryableAttributeType & Comparable>
|
||||||
|
|
||||||
|
public func < <O, V: Comparable>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>("%K < %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func > <O, V: Comparable>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>("%K > %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func <= <O, V: Comparable>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>("%K <= %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func >= <O, V: Comparable>(_ keyPath: KeyPath<O, ValueContainer<O>.Required<V>>, _ value: V) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>("%K >= %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - KeyPath where Root: CoreStoreObject, Value: ValueContainer<Root>.Optional<QueryableAttributeType & Comparable>
|
||||||
|
|
||||||
|
public func < <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
if let value = value {
|
||||||
|
|
||||||
|
return Where<O>("%K < %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
public static func != <V: NSManagedObject> (_ keyPath: KeyPath<Root, Value>, _ object: Value) -> Where<Root> where Value == Optional<V> {
|
|
||||||
|
return Where<O>("%K < nil", O.meta[keyPath: keyPath].keyPath)
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: object)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func ~= <S: Sequence, V: NSManagedObject>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where Value == Optional<V>, S.Iterator.Element == V {
|
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func == <V: NSManagedObject> (_ keyPath: KeyPath<Root, Value>, _ objectID: NSManagedObjectID?) -> Where<Root> where Value == Optional<V> {
|
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func != <V: NSManagedObject> (_ keyPath: KeyPath<Root, Value>, _ objectID: NSManagedObjectID?) -> Where<Root> where Value == Optional<V> {
|
|
||||||
|
|
||||||
return !Where(keyPath._kvcKeyPathString!, isEqualTo: objectID)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func ~= <S: Sequence, V: NSManagedObject>(_ sequence: S, _ keyPath: KeyPath<Root, Value>) -> Where<Root> where Value == Optional<V>, S.Iterator.Element == NSManagedObjectID {
|
|
||||||
|
|
||||||
return Where(keyPath._kvcKeyPathString!, isMemberOf: sequence)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func > <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
if let value = value {
|
||||||
|
|
||||||
|
return Where<O>("%K > %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return Where<O>("%K > nil", O.meta[keyPath: keyPath].keyPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func <= <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
if let value = value {
|
||||||
|
|
||||||
|
return Where<O>("%K <= %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return Where<O>("%K <= nil", O.meta[keyPath: keyPath].keyPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func >= <O, V>(_ keyPath: KeyPath<O, ValueContainer<O>.Optional<V>>, _ value: V?) -> Where<O> {
|
||||||
|
|
||||||
|
if let value = value {
|
||||||
|
|
||||||
|
return Where<O>("%K >= %@", O.meta[keyPath: keyPath].keyPath, value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return Where<O>("%K >= nil", O.meta[keyPath: keyPath].keyPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: - KeyPath where Root: CoreStoreObject, Value: RelationshipContainer<Root>.ToOne<CoreStoreObject>
|
||||||
|
|
||||||
|
public func == <O, D>(_ keyPath: KeyPath<O, RelationshipContainer<O>.ToOne<D>>, _ object: D) -> Where<O> {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: object)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func != <O, D>(_ keyPath: KeyPath<O, RelationshipContainer<O>.ToOne<D>>, _ object: D) -> Where<O> {
|
||||||
|
|
||||||
|
return !Where<O>(O.meta[keyPath: keyPath].keyPath, isEqualTo: object)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func ~= <O, D, S: Sequence>(_ sequence: S, _ keyPath: KeyPath<O, RelationshipContainer<O>.ToOne<D>>) -> Where<O> where S.Iterator.Element == D {
|
||||||
|
|
||||||
|
return Where<O>(O.meta[keyPath: keyPath].keyPath, isMemberOf: sequence)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user