diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index cd4304e..d2c7b42 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -1392,9 +1392,9 @@ B5E84F061AFF847B0064E85B /* DataStack+Querying.swift */, B5E84F071AFF847B0064E85B /* CoreStore+Querying.swift */, B596BBB51DD5BC67001DCDD9 /* FetchableSource.swift */, - B55514E91EED8BF900BAB888 /* ChainedClauseBuilder.swift */, B596BBBA1DD5C39F001DCDD9 /* QueryableSource.swift */, B549F65D1E569C7400FBAB2D /* QueryableAttributeType.swift */, + B55514E91EED8BF900BAB888 /* ChainedClauseBuilder.swift */, B5A1DAC61F111BBE003CF369 /* KeyPath Utilities */, B5E84F0A1AFF847B0064E85B /* Protocol Clauses */, B5E84EFF1AFF847B0064E85B /* Concrete Clauses */, diff --git a/Sources/BaseDataTransaction+Querying.swift b/Sources/BaseDataTransaction+Querying.swift index 8cc55b1..a5f0b11 100644 --- a/Sources/BaseDataTransaction+Querying.swift +++ b/Sources/BaseDataTransaction+Querying.swift @@ -382,6 +382,16 @@ extension BaseDataTransaction: FetchableSource, QueryableSource { return self.context.queryValue(from, selectClause, queryClauses) } + // TODO: docs + public func queryValue(_ clauseChain: B) -> B.ResultType? where B.ResultType: QueryableAttributeType { + + CoreStore.assert( + self.isRunningInAllowedQueue(), + "Attempted to query from a \(cs_typeName(self)) outside its designated queue." + ) + return self.context.queryValue(clauseChain.from, clauseChain.select, clauseChain.queryClauses) + } + /** Queries a dictionary of attribute values as specified by the `QueryClause`s. Requires at least a `Select` clause, and optional `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. @@ -420,6 +430,16 @@ extension BaseDataTransaction: FetchableSource, QueryableSource { return self.context.queryAttributes(from, selectClause, queryClauses) } + // TODO: docs + public func queryAttributes(_ clauseChain: B) -> [[String: Any]]? where B.ResultType == NSDictionary { + + CoreStore.assert( + self.isRunningInAllowedQueue(), + "Attempted to query from a \(cs_typeName(self)) outside its designated queue." + ) + return self.context.queryAttributes(clauseChain.from, clauseChain.select, clauseChain.queryClauses) + } + // MARK: FetchableSource, QueryableSource diff --git a/Sources/ChainedClauseBuilder.swift b/Sources/ChainedClauseBuilder.swift index df13948..24f0584 100644 --- a/Sources/ChainedClauseBuilder.swift +++ b/Sources/ChainedClauseBuilder.swift @@ -43,7 +43,7 @@ public protocol QueryChainableBuilderType { var from: From { get set } var select: Select { get set } var groupBy: GroupBy { get set } - var fetchClauses: [FetchClause] { get set } + var queryClauses: [QueryClause] { get set } } public protocol SectionMonitorBuilderType { @@ -81,7 +81,7 @@ public struct QueryChainBuilder: QueryCha public var from: From public var select: Select public var groupBy: GroupBy - public var fetchClauses: [FetchClause] = [] + public var queryClauses: [QueryClause] = [] } @@ -112,7 +112,7 @@ public extension From { from: self, select: .init(selectTerms), groupBy: .init(), - fetchClauses: [] + queryClauses: [] ) } @@ -226,7 +226,7 @@ public extension QueryChainBuilder { from: self.from, select: self.select, groupBy: .init(keyPaths), - fetchClauses: self.fetchClauses + queryClauses: self.queryClauses ) } @@ -255,7 +255,7 @@ public extension QueryChainBuilder { return self.queryChain(appending: Tweak(fetchRequest)) } - public func appending(_ clause: FetchClause) -> QueryChainBuilder { + public func appending(_ clause: QueryClause) -> QueryChainBuilder { return self.queryChain(appending: clause) } @@ -263,13 +263,13 @@ public extension QueryChainBuilder { // MARK: Private - private func queryChain(appending clause: FetchClause) -> QueryChainBuilder { + private func queryChain(appending clause: QueryClause) -> QueryChainBuilder { return .init( from: self.from, select: self.select, groupBy: self.groupBy, - fetchClauses: self.fetchClauses + [clause] + queryClauses: self.queryClauses + [clause] ) } } diff --git a/Sources/DataStack+Querying.swift b/Sources/DataStack+Querying.swift index e600784..a0f527c 100644 --- a/Sources/DataStack+Querying.swift +++ b/Sources/DataStack+Querying.swift @@ -328,6 +328,16 @@ extension DataStack: FetchableSource, QueryableSource { return self.mainContext.queryValue(from, selectClause, queryClauses) } + // TODO: docs + public func queryValue(_ clauseChain: B) -> B.ResultType? where B.ResultType: QueryableAttributeType { + + CoreStore.assert( + Thread.isMainThread, + "Attempted to query from a \(cs_typeName(self)) outside the main thread." + ) + return self.mainContext.queryValue(clauseChain.from, clauseChain.select, clauseChain.queryClauses) + } + /** Queries a dictionary of attribute values as specified by the `QueryClause`s. Requires at least a `Select` clause, and optional `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. @@ -366,6 +376,16 @@ extension DataStack: FetchableSource, QueryableSource { return self.mainContext.queryAttributes(from, selectClause, queryClauses) } + // TODO: docs + public func queryAttributes(_ clauseChain: B) -> [[String: Any]]? where B.ResultType == NSDictionary { + + CoreStore.assert( + Thread.isMainThread, + "Attempted to query from a \(cs_typeName(self)) outside the main thread." + ) + return self.mainContext.queryAttributes(clauseChain.from, clauseChain.select, clauseChain.queryClauses) + } + // MARK: FetchableSource, QueryableSource diff --git a/Sources/QueryableSource.swift b/Sources/QueryableSource.swift index a844827..cf3da07 100644 --- a/Sources/QueryableSource.swift +++ b/Sources/QueryableSource.swift @@ -57,6 +57,9 @@ public protocol QueryableSource: class { - returns: the result of the the query. The type of the return value is specified by the generic type of the `Select` parameter. */ func queryValue(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> U? + + // TODO: docs + func queryValue(_ clauseChain: B) -> B.ResultType? where B.ResultType: QueryableAttributeType /** Queries a dictionary of attribute values as specified by the `QueryClause`s. Requires at least a `Select` clause, and optional `Where`, `OrderBy`, `GroupBy`, and `Tweak` clauses. @@ -82,6 +85,9 @@ public protocol QueryableSource: class { */ func queryAttributes(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> [[String: Any]]? + // TODO: docs + func queryAttributes(_ clauseChain: B) -> [[String: Any]]? where B.ResultType == NSDictionary + /** The internal `NSManagedObjectContext` managed by this `QueryableSource`. Using this context directly should typically be avoided, and is provided by CoreStore only for extremely specialized cases. */