Skip to content

Commit c0f670c

Browse files
committed
wip
1 parent 60d6b4f commit c0f670c

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

Sources/StructuredQueriesCore/AggregateFunctions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ extension QueryExpression where QueryValue: QueryBindable {
8484
/// - Returns: A maximum aggregate of this expression.
8585
public func max(
8686
filter: (some QueryExpression<Bool>)? = Bool?.none
87-
) -> some QueryExpression<Int?> {
87+
) -> some QueryExpression<QueryValue?> {
8888
AggregateFunction("max", self, filter: filter)
8989
}
9090

@@ -99,7 +99,7 @@ extension QueryExpression where QueryValue: QueryBindable {
9999
/// - Returns: A minimum aggregate of this expression.
100100
public func min(
101101
filter: (some QueryExpression<Bool>)? = Bool?.none
102-
) -> some QueryExpression<Int?> {
102+
) -> some QueryExpression<QueryValue?> {
103103
AggregateFunction("min", self, filter: filter)
104104
}
105105
}

Sources/StructuredQueriesCore/Optional.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,41 @@ where Wrapped.TableColumns: PrimaryKeyedTableDefinition {
135135
}
136136

137137
extension QueryExpression where QueryValue: _OptionalProtocol {
138+
/// Creates and optionalizes a new expression from this one by applying an unwrapped version of
139+
/// this expression to a given closure.
140+
///
141+
/// ```swift
142+
/// Reminder.where {
143+
/// $0.dueDate.map { $0 > Date() }
144+
/// }
145+
/// // SELECT … FROM "reminders"
146+
/// // WHERE "reminders"."dueDate" > '2018-01-29 00:08:00.000'
147+
/// ```
148+
///
149+
/// - Parameter transform: A closure that takes an unwrapped version of this expression.
150+
/// - Returns: The result of the transform function, optionalized.
138151
public func map<T>(
139152
_ transform: (SQLQueryExpression<QueryValue.Wrapped>) -> some QueryExpression<T>
140153
) -> some QueryExpression<T?> {
141154
SQLQueryExpression(transform(SQLQueryExpression(queryFragment)).queryFragment)
142155
}
156+
157+
/// Creates a new optional expression from this one by applying an unwrapped version of this
158+
/// expression to a given closure.
159+
///
160+
/// ```swift
161+
/// Reminder.select {
162+
/// $0.dueDate.flatMap { $0.max() }
163+
/// }
164+
/// // SELECT max("reminders"."dueDate") FROM "reminders"
165+
/// // => [Date?]
166+
/// ```
167+
///
168+
/// - Parameter transform: A closure that takes an unwrapped version of this expression.
169+
/// - Returns: The result of the transform function.
170+
public func flatMap<T>(
171+
_ transform: (SQLQueryExpression<QueryValue.Wrapped>) -> some QueryExpression<T?>
172+
) -> some QueryExpression<T?> {
173+
SQLQueryExpression(transform(SQLQueryExpression(queryFragment)).queryFragment)
174+
}
143175
}

0 commit comments

Comments
 (0)