Skip to content

Commit 1807da7

Browse files
committed
Merge branch 'main' into temp-triggers
2 parents bcac786 + 519b7aa commit 1807da7

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

Sources/StructuredQueriesCore/Operators.swift

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -832,8 +832,9 @@ extension QueryExpression where QueryValue: QueryBindable {
832832
///
833833
/// - Parameter expression: A sequence of expressions.
834834
/// - Returns: A predicate expression indicating whether this expression is in the given sequence
835-
public func `in`(_ expression: [some QueryExpression<QueryValue>]) -> some QueryExpression<Bool> {
836-
BinaryOperator(lhs: self, operator: "IN", rhs: Array.Expression(elements: expression))
835+
public func `in`<S: Sequence>(_ expression: S) -> some QueryExpression<Bool>
836+
where S.Element: QueryExpression<QueryValue> {
837+
BinaryOperator(lhs: self, operator: "IN", rhs: S.Expression(elements: expression))
837838
}
838839

839840
/// Returns a predicate expression indicating whether the expression is in a subquery.
@@ -868,7 +869,7 @@ extension QueryExpression where QueryValue: QueryBindable {
868869
}
869870
}
870871

871-
extension Array where Element: QueryBindable {
872+
extension Sequence where Element: QueryBindable {
872873
/// Returns a predicate expression indicating whether the sequence contains the given expression.
873874
///
874875
/// An alias for ``QueryExpression/in(_:)``, flipped.
@@ -912,12 +913,21 @@ extension Statement where QueryValue: QueryBindable {
912913
}
913914
}
914915

915-
extension Statement {
916+
extension PartialSelectStatement {
916917
/// Returns a predicate expression indicating whether this subquery contains any element.
917918
///
918919
/// - Returns: A predicate expression indicating whether this subquery contains any element.
919920
public func exists() -> some QueryExpression<Bool> {
920-
SQLQueryExpression("EXISTS \(self)")
921+
SQLQueryExpression("EXISTS \(self.queryFragment)")
922+
}
923+
}
924+
925+
extension Table {
926+
/// Returns a predicate expression indicating whether this table contains any element.
927+
///
928+
/// - Returns: A predicate expression indicating whether this subquery contains any element.
929+
public static func exists() -> some QueryExpression<Bool> {
930+
all.exists()
921931
}
922932
}
923933

@@ -977,16 +987,15 @@ private struct LikeOperator<
977987
}
978988
}
979989

980-
extension Array where Element: QueryExpression, Element.QueryValue: QueryBindable {
981-
fileprivate struct Expression: QueryExpression {
982-
typealias QueryValue = Array
990+
extension Sequence where Element: QueryExpression, Element.QueryValue: QueryBindable {
991+
fileprivate typealias Expression = _SequenceExpression<Self>
992+
}
983993

984-
let elements: [Element]
985-
init(elements: [Element]) {
986-
self.elements = elements
987-
}
988-
var queryFragment: QueryFragment {
989-
"(\(elements.map(\.queryFragment).joined(separator: ", ")))"
990-
}
994+
private struct _SequenceExpression<S: Sequence>: QueryExpression
995+
where S.Element: QueryExpression, S.Element.QueryValue: QueryBindable {
996+
typealias QueryValue = S
997+
let queryFragment: QueryFragment
998+
init(elements: S) {
999+
queryFragment = "(\(elements.map(\.queryFragment).joined(separator: ", ")))"
9911000
}
9921001
}

Tests/StructuredQueriesTests/OperatorsTests.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,20 @@ extension SnapshotTests {
571571
}
572572

573573
@Test func exists() {
574+
assertQuery(Values(Reminder.exists())) {
575+
"""
576+
SELECT EXISTS (
577+
SELECT "reminders"."id", "reminders"."assignedUserID", "reminders"."dueDate", "reminders"."isCompleted", "reminders"."isFlagged", "reminders"."notes", "reminders"."priority", "reminders"."remindersListID", "reminders"."title"
578+
FROM "reminders"
579+
)
580+
"""
581+
} results: {
582+
"""
583+
┌──────┐
584+
│ true │
585+
└──────┘
586+
"""
587+
}
574588
assertQuery(Values(Reminder.where { $0.id == 1 }.exists())) {
575589
"""
576590
SELECT EXISTS (

0 commit comments

Comments
 (0)