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
8 changes: 4 additions & 4 deletions Sources/StructuredQueriesCore/Operators.swift
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ public func == <QueryValue: _OptionalProtocol>(
lhs: any QueryExpression<QueryValue>,
rhs: some QueryExpression<QueryValue.Wrapped>
) -> some QueryExpression<Bool> {
BinaryOperator(lhs: lhs, operator: isNull(lhs) ? "IS" : "=", rhs: rhs)
BinaryOperator(lhs: lhs, operator: "IS", rhs: rhs)
}

// NB: This overload is required due to an overload resolution bug of 'Updates[dynamicMember:]'.
Expand All @@ -202,7 +202,7 @@ public func != <QueryValue: _OptionalProtocol>(
lhs: any QueryExpression<QueryValue>,
rhs: some QueryExpression<QueryValue.Wrapped>
) -> some QueryExpression<Bool> {
BinaryOperator(lhs: lhs, operator: isNull(lhs) ? "IS NOT" : "<>", rhs: rhs)
BinaryOperator(lhs: lhs, operator: "IS NOT", rhs: rhs)
}

// NB: This overload is required due to an overload resolution bug of 'Updates[dynamicMember:]'.
Expand All @@ -211,7 +211,7 @@ public func == <QueryValue: _OptionalProtocol>(
lhs: any QueryExpression<QueryValue>,
rhs: some QueryExpression<QueryValue>
) -> some QueryExpression<Bool> {
BinaryOperator(lhs: lhs, operator: isNull(lhs) || isNull(rhs) ? "IS" : "=", rhs: rhs)
BinaryOperator(lhs: lhs, operator: "IS", rhs: rhs)
}

// NB: This overload is required due to an overload resolution bug of 'Updates[dynamicMember:]'.
Expand All @@ -220,7 +220,7 @@ public func != <QueryValue: _OptionalProtocol>(
lhs: any QueryExpression<QueryValue>,
rhs: some QueryExpression<QueryValue>
) -> some QueryExpression<Bool> {
BinaryOperator(lhs: lhs, operator: isNull(lhs) || isNull(rhs) ? "IS NOT" : "<>", rhs: rhs)
BinaryOperator(lhs: lhs, operator: "IS NOT", rhs: rhs)
}

// NB: This overload is required due to an overload resolution bug of 'Updates[dynamicMember:]'.
Expand Down
104 changes: 99 additions & 5 deletions Sources/StructuredQueriesCore/PrimaryKeyed.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,24 @@ public protocol TableDraft: Table {
init(_ primaryTable: PrimaryTable)
}

extension TableDraft {
public static subscript(
dynamicMember keyPath: KeyPath<PrimaryTable.Type, some Statement<PrimaryTable>>
) -> some Statement<Self> {
SQLQueryExpression("\(PrimaryTable.self[keyPath: keyPath])")
}

public static subscript(
dynamicMember keyPath: KeyPath<PrimaryTable.Type, some SelectStatementOf<PrimaryTable>>
) -> SelectOf<Self> {
unsafeBitCast(PrimaryTable.self[keyPath: keyPath].asSelect(), to: SelectOf<Self>.self)
}

public static var all: SelectOf<Self> {
unsafeBitCast(PrimaryTable.all.asSelect(), to: SelectOf<Self>.self)
}
}

/// A type representing a database table's columns.
///
/// Don't conform to this protocol directly. Instead, use the `@Table` and `@Column` macros to
Expand All @@ -38,6 +56,14 @@ where QueryValue: PrimaryKeyedTable {
var primaryKey: TableColumn<QueryValue, PrimaryKey> { get }
}

extension TableDefinition where QueryValue: TableDraft {
public subscript<Member>(
dynamicMember keyPath: KeyPath<QueryValue.PrimaryTable.TableColumns, Member>
) -> Member {
QueryValue.PrimaryTable.columns[keyPath: keyPath]
}
}

extension PrimaryKeyedTableDefinition {
/// A query expression representing the number of rows in this table.
///
Expand All @@ -60,6 +86,22 @@ extension PrimaryKeyedTable {
}
}

extension TableDraft {
/// A where clause filtered by a primary key.
///
/// - Parameter primaryKey: A primary key identifying a table row.
/// - Returns: A `WHERE` clause.
public static func find(
_ primaryKey: PrimaryTable.TableColumns.PrimaryKey.QueryOutput
) -> Where<Self> {
Self.where { _ in
PrimaryTable.columns.primaryKey.eq(
PrimaryTable.TableColumns.PrimaryKey(queryOutput: primaryKey)
)
}
}
}

extension Where where From: PrimaryKeyedTable {
/// Adds a primary key condition to a where clause.
///
Expand All @@ -70,6 +112,40 @@ extension Where where From: PrimaryKeyedTable {
}
}

extension Where where From: TableDraft {
/// Adds a primary key condition to a where clause.
///
/// - Parameter primaryKey: A primary key.
/// - Returns: A where clause with the added primary key.
public func find(_ primaryKey: From.PrimaryTable.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.where { _ in
From.PrimaryTable.columns.primaryKey.eq(
From.PrimaryTable.TableColumns.PrimaryKey(queryOutput: primaryKey)
)
}
}
}

extension Select where From: PrimaryKeyedTable {
/// A select statement filtered by a primary key.
///
/// - Parameter primaryKey: A primary key identifying a table row.
/// - Returns: A select statement filtered by the given key.
public func find(_ primaryKey: From.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.and(From.find(primaryKey))
}
}

extension Select where From: TableDraft {
/// A select statement filtered by a primary key.
///
/// - Parameter primaryKey: A primary key identifying a table row.
/// - Returns: A select statement filtered by the given key.
public func find(_ primaryKey: From.PrimaryTable.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.and(From.find(primaryKey))
}
}

extension Update where From: PrimaryKeyedTable {
/// An update statement filtered by a primary key.
///
Expand All @@ -80,6 +156,20 @@ extension Update where From: PrimaryKeyedTable {
}
}

extension Update where From: TableDraft {
/// An update statement filtered by a primary key.
///
/// - Parameter primaryKey: A primary key identifying a table row.
/// - Returns: An update statement filtered by the given key.
public func find(_ primaryKey: From.PrimaryTable.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.where { _ in
From.PrimaryTable.columns.primaryKey.eq(
From.PrimaryTable.TableColumns.PrimaryKey(queryOutput: primaryKey)
)
}
}
}

extension Delete where From: PrimaryKeyedTable {
/// A delete statement filtered by a primary key.
///
Expand All @@ -90,12 +180,16 @@ extension Delete where From: PrimaryKeyedTable {
}
}

extension Select where From: PrimaryKeyedTable {
/// A select statement filtered by a primary key.
extension Delete where From: TableDraft {
/// A delete statement filtered by a primary key.
///
/// - Parameter primaryKey: A primary key identifying a table row.
/// - Returns: A select statement filtered by the given key.
public func find(_ primaryKey: From.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.and(From.find(primaryKey))
/// - Returns: A delete statement filtered by the given key.
public func find(_ primaryKey: From.PrimaryTable.TableColumns.PrimaryKey.QueryOutput) -> Self {
self.where { _ in
From.PrimaryTable.columns.primaryKey.eq(
From.PrimaryTable.TableColumns.PrimaryKey(queryOutput: primaryKey)
)
}
}
}
Loading