Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Sources/StructuredQueries/Macros.swift
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,10 @@ public macro sql<QueryValue>(
as queryValueType: QueryValue.Type = QueryValue.self
) -> SQLQueryExpression<QueryValue> =
#externalMacro(module: "StructuredQueriesMacros", type: "SQLMacro")

@freestanding(expression)
public macro sql(
_ queryFragment: QueryFragment,
as queryValueType: Any.Type = Any.self
) -> SQLQueryExpression<Any> =
#externalMacro(module: "StructuredQueriesMacros", type: "SQLMacro")
26 changes: 5 additions & 21 deletions Sources/StructuredQueriesCore/Statements/Select.swift
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ extension Table {
/// - Returns: A select statement that groups by the given column.
public static func group<C: QueryExpression>(
by grouping: (TableColumns) -> C
) -> SelectOf<Self> where C.QueryValue: QueryDecodable {
) -> SelectOf<Self> {
Where().group(by: grouping)
}

Expand All @@ -226,12 +226,7 @@ extension Table {
each C3: QueryExpression
>(
by grouping: (TableColumns) -> (C1, C2, repeat each C3)
) -> SelectOf<Self>
where
C1.QueryValue: QueryDecodable,
C2.QueryValue: QueryDecodable,
repeat (each C3).QueryValue: QueryDecodable
{
) -> SelectOf<Self> {
Where().group(by: grouping)
}

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

Expand All @@ -1199,13 +1193,7 @@ extension Select {
each J: Table
>(
by grouping: (From.TableColumns, repeat (each J).TableColumns) -> (C1, C2, repeat each C3)
) -> Self
where
C1.QueryValue: QueryDecodable,
C2.QueryValue: QueryDecodable,
repeat (each C3).QueryValue: QueryDecodable,
Joins == (repeat each J)
{
) -> Self where Joins == (repeat each J) {
_group(by: grouping)
}

Expand All @@ -1214,11 +1202,7 @@ extension Select {
each J: Table
>(
by grouping: (From.TableColumns, repeat (each J).TableColumns) -> (repeat each C)
) -> Self
where
repeat (each C).QueryValue: QueryDecodable,
Joins == (repeat each J)
{
) -> Self where Joins == (repeat each J) {
var select = self
select.group
.append(
Expand Down
14 changes: 4 additions & 10 deletions Sources/StructuredQueriesCore/Statements/Where.swift
Original file line number Diff line number Diff line change
Expand Up @@ -387,22 +387,16 @@ extension Where: SelectStatement {
}

/// A select statement for the filtered table grouped by the given column.
public func group<C: QueryExpression>(by grouping: (From.TableColumns) -> C) -> Select<
(), From, ()
>
where C.QueryValue: QueryDecodable {
public func group<C: QueryExpression>(
by grouping: (From.TableColumns) -> C
) -> Select<(), From, ()> {
asSelect().group(by: grouping)
}

/// A select statement for the filtered table grouped by the given columns.
public func group<C1: QueryExpression, C2: QueryExpression, each C3: QueryExpression>(
by grouping: (From.TableColumns) -> (C1, C2, repeat each C3)
) -> SelectOf<From>
where
C1.QueryValue: QueryDecodable,
C2.QueryValue: QueryDecodable,
repeat (each C3).QueryValue: QueryDecodable
{
) -> SelectOf<From> {
asSelect().group(by: grouping)
}

Expand Down
17 changes: 17 additions & 0 deletions Tests/StructuredQueriesTests/SelectTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,23 @@ extension SnapshotTests {
└───────┴───┘
"""
}

assertQuery(
Reminder.select { ($0.isCompleted, $0.id.count()) }.group { #sql("\($0.isCompleted)") }
) {
"""
SELECT "reminders"."isCompleted", count("reminders"."id")
FROM "reminders"
GROUP BY "reminders"."isCompleted"
"""
} results: {
"""
┌───────┬───┐
│ false │ 7 │
│ true │ 3 │
└───────┴───┘
"""
}
}

@Test func having() {
Expand Down