Skip to content

Commit 9cf52d1

Browse files
authored
Don't require decodable fields in GROUP BY (pointfreeco#79)
This PR allows the following to work without qualifying the expression type: ```diff Reminder.group { - #sql("date(\($0.dueDate))", as: Date?.self) + #sql("date(\($0.dueDate))") } ```
1 parent ca340a7 commit 9cf52d1

File tree

4 files changed

+33
-31
lines changed

4 files changed

+33
-31
lines changed

Sources/StructuredQueries/Macros.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,10 @@ public macro sql<QueryValue>(
132132
as queryValueType: QueryValue.Type = QueryValue.self
133133
) -> SQLQueryExpression<QueryValue> =
134134
#externalMacro(module: "StructuredQueriesMacros", type: "SQLMacro")
135+
136+
@freestanding(expression)
137+
public macro sql(
138+
_ queryFragment: QueryFragment,
139+
as queryValueType: Any.Type = Any.self
140+
) -> SQLQueryExpression<Any> =
141+
#externalMacro(module: "StructuredQueriesMacros", type: "SQLMacro")

Sources/StructuredQueriesCore/Statements/Select.swift

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ extension Table {
212212
/// - Returns: A select statement that groups by the given column.
213213
public static func group<C: QueryExpression>(
214214
by grouping: (TableColumns) -> C
215-
) -> SelectOf<Self> where C.QueryValue: QueryDecodable {
215+
) -> SelectOf<Self> {
216216
Where().group(by: grouping)
217217
}
218218

@@ -226,12 +226,7 @@ extension Table {
226226
each C3: QueryExpression
227227
>(
228228
by grouping: (TableColumns) -> (C1, C2, repeat each C3)
229-
) -> SelectOf<Self>
230-
where
231-
C1.QueryValue: QueryDecodable,
232-
C2.QueryValue: QueryDecodable,
233-
repeat (each C3).QueryValue: QueryDecodable
234-
{
229+
) -> SelectOf<Self> {
235230
Where().group(by: grouping)
236231
}
237232

@@ -1182,8 +1177,7 @@ extension Select {
11821177
/// - Returns: A new select statement that groups by the given column.
11831178
public func group<C: QueryExpression, each J: Table>(
11841179
by grouping: (From.TableColumns, repeat (each J).TableColumns) -> C
1185-
) -> Self
1186-
where C.QueryValue: QueryDecodable, Joins == (repeat each J) {
1180+
) -> Self where Joins == (repeat each J) {
11871181
_group(by: grouping)
11881182
}
11891183

@@ -1199,13 +1193,7 @@ extension Select {
11991193
each J: Table
12001194
>(
12011195
by grouping: (From.TableColumns, repeat (each J).TableColumns) -> (C1, C2, repeat each C3)
1202-
) -> Self
1203-
where
1204-
C1.QueryValue: QueryDecodable,
1205-
C2.QueryValue: QueryDecodable,
1206-
repeat (each C3).QueryValue: QueryDecodable,
1207-
Joins == (repeat each J)
1208-
{
1196+
) -> Self where Joins == (repeat each J) {
12091197
_group(by: grouping)
12101198
}
12111199

@@ -1214,11 +1202,7 @@ extension Select {
12141202
each J: Table
12151203
>(
12161204
by grouping: (From.TableColumns, repeat (each J).TableColumns) -> (repeat each C)
1217-
) -> Self
1218-
where
1219-
repeat (each C).QueryValue: QueryDecodable,
1220-
Joins == (repeat each J)
1221-
{
1205+
) -> Self where Joins == (repeat each J) {
12221206
var select = self
12231207
select.group
12241208
.append(

Sources/StructuredQueriesCore/Statements/Where.swift

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -387,22 +387,16 @@ extension Where: SelectStatement {
387387
}
388388

389389
/// A select statement for the filtered table grouped by the given column.
390-
public func group<C: QueryExpression>(by grouping: (From.TableColumns) -> C) -> Select<
391-
(), From, ()
392-
>
393-
where C.QueryValue: QueryDecodable {
390+
public func group<C: QueryExpression>(
391+
by grouping: (From.TableColumns) -> C
392+
) -> Select<(), From, ()> {
394393
asSelect().group(by: grouping)
395394
}
396395

397396
/// A select statement for the filtered table grouped by the given columns.
398397
public func group<C1: QueryExpression, C2: QueryExpression, each C3: QueryExpression>(
399398
by grouping: (From.TableColumns) -> (C1, C2, repeat each C3)
400-
) -> SelectOf<From>
401-
where
402-
C1.QueryValue: QueryDecodable,
403-
C2.QueryValue: QueryDecodable,
404-
repeat (each C3).QueryValue: QueryDecodable
405-
{
399+
) -> SelectOf<From> {
406400
asSelect().group(by: grouping)
407401
}
408402

Tests/StructuredQueriesTests/SelectTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,23 @@ extension SnapshotTests {
644644
└───────┴───┘
645645
"""
646646
}
647+
648+
assertQuery(
649+
Reminder.select { ($0.isCompleted, $0.id.count()) }.group { #sql("\($0.isCompleted)") }
650+
) {
651+
"""
652+
SELECT "reminders"."isCompleted", count("reminders"."id")
653+
FROM "reminders"
654+
GROUP BY "reminders"."isCompleted"
655+
"""
656+
} results: {
657+
"""
658+
┌───────┬───┐
659+
│ false │ 7 │
660+
│ true │ 3 │
661+
└───────┴───┘
662+
"""
663+
}
647664
}
648665

649666
@Test func having() {

0 commit comments

Comments
 (0)