From 41f2209d146ccf1ee39d3fa60ec2310a784206af Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 19 Jun 2025 10:14:42 -0700 Subject: [PATCH 1/4] Add static `Table.exists()` --- Sources/StructuredQueriesCore/Operators.swift | 9 +++++++++ Tests/StructuredQueriesTests/OperatorsTests.swift | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index a11aafb5..19bd94ce 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -921,6 +921,15 @@ extension Statement { } } +extension Table { + /// Returns a predicate expression indicating whether this table contains any element. + /// + /// - Returns: A predicate expression indicating whether this subquery contains any element. + public static func exists() -> some QueryExpression { + SQLQueryExpression("EXISTS \(all)") + } +} + private struct UnaryOperator: QueryExpression { let `operator`: QueryFragment let base: QueryFragment diff --git a/Tests/StructuredQueriesTests/OperatorsTests.swift b/Tests/StructuredQueriesTests/OperatorsTests.swift index e21840f0..cce1f873 100644 --- a/Tests/StructuredQueriesTests/OperatorsTests.swift +++ b/Tests/StructuredQueriesTests/OperatorsTests.swift @@ -568,6 +568,16 @@ extension SnapshotTests { } @Test func exists() { + assertQuery(Values(Reminder.exists())) { + """ + SELECT EXISTS SELECT "reminders"."id", "reminders"."assignedUserID", "reminders"."dueDate", "reminders"."isCompleted", "reminders"."isFlagged", "reminders"."notes", "reminders"."priority", "reminders"."remindersListID", "reminders"."title" + FROM "reminders" + """ + } results: { + """ + near "SELECT": syntax error + """ + } assertQuery(Values(Reminder.where { $0.id == 1 }.exists())) { """ SELECT EXISTS ( From 1c587dfc69c40f6931899b7fec4fd9bf3675c4bd Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 19 Jun 2025 10:15:41 -0700 Subject: [PATCH 2/4] wip --- Sources/StructuredQueriesCore/Operators.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index 19bd94ce..b0b34ecc 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -926,7 +926,7 @@ extension Table { /// /// - Returns: A predicate expression indicating whether this subquery contains any element. public static func exists() -> some QueryExpression { - SQLQueryExpression("EXISTS \(all)") + all.exists() } } From 98fec194b7fb3989da26376b2ade0f65d56540f0 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 19 Jun 2025 10:17:26 -0700 Subject: [PATCH 3/4] wip --- Sources/StructuredQueriesCore/Operators.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index b0b34ecc..2a37504b 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -912,7 +912,7 @@ extension Statement where QueryValue: QueryBindable { } } -extension Statement { +extension PartialSelectStatement { /// Returns a predicate expression indicating whether this subquery contains any element. /// /// - Returns: A predicate expression indicating whether this subquery contains any element. From 464ea7f51adb5b0a17f05efd0b8f458370b07113 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 19 Jun 2025 10:41:27 -0700 Subject: [PATCH 4/4] wip --- Sources/StructuredQueriesCore/Operators.swift | 2 +- Tests/StructuredQueriesTests/OperatorsTests.swift | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index 2a37504b..81eb721e 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -917,7 +917,7 @@ extension PartialSelectStatement { /// /// - Returns: A predicate expression indicating whether this subquery contains any element. public func exists() -> some QueryExpression { - SQLQueryExpression("EXISTS \(self)") + SQLQueryExpression("EXISTS \(self.queryFragment)") } } diff --git a/Tests/StructuredQueriesTests/OperatorsTests.swift b/Tests/StructuredQueriesTests/OperatorsTests.swift index cce1f873..856c0842 100644 --- a/Tests/StructuredQueriesTests/OperatorsTests.swift +++ b/Tests/StructuredQueriesTests/OperatorsTests.swift @@ -570,12 +570,16 @@ extension SnapshotTests { @Test func exists() { assertQuery(Values(Reminder.exists())) { """ - SELECT EXISTS SELECT "reminders"."id", "reminders"."assignedUserID", "reminders"."dueDate", "reminders"."isCompleted", "reminders"."isFlagged", "reminders"."notes", "reminders"."priority", "reminders"."remindersListID", "reminders"."title" - FROM "reminders" + SELECT EXISTS ( + SELECT "reminders"."id", "reminders"."assignedUserID", "reminders"."dueDate", "reminders"."isCompleted", "reminders"."isFlagged", "reminders"."notes", "reminders"."priority", "reminders"."remindersListID", "reminders"."title" + FROM "reminders" + ) """ } results: { """ - near "SELECT": syntax error + ┌──────┐ + │ true │ + └──────┘ """ } assertQuery(Values(Reminder.where { $0.id == 1 }.exists())) {