From 1d021fd6a9b9a8bf356cefdeb879250305af579c Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Wed, 18 Jun 2025 14:18:37 -0700 Subject: [PATCH 1/2] Generalize `IN` for any sequence of expressions It was hard-coded to arrays. --- Sources/StructuredQueriesCore/Operators.swift | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index a11aafb5..e1cecf2b 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -832,8 +832,9 @@ extension QueryExpression where QueryValue: QueryBindable { /// /// - Parameter expression: A sequence of expressions. /// - Returns: A predicate expression indicating whether this expression is in the given sequence - public func `in`(_ expression: [some QueryExpression]) -> some QueryExpression { - BinaryOperator(lhs: self, operator: "IN", rhs: Array.Expression(elements: expression)) + public func `in`(_ expression: S) -> some QueryExpression + where S.Element: QueryExpression { + BinaryOperator(lhs: self, operator: "IN", rhs: S.Expression(elements: expression)) } /// Returns a predicate expression indicating whether the expression is in a subquery. @@ -868,7 +869,7 @@ extension QueryExpression where QueryValue: QueryBindable { } } -extension Array where Element: QueryBindable { +extension Sequence where Element: QueryBindable { /// Returns a predicate expression indicating whether the sequence contains the given expression. /// /// An alias for ``QueryExpression/in(_:)``, flipped. @@ -977,16 +978,15 @@ private struct LikeOperator< } } -extension Array where Element: QueryExpression, Element.QueryValue: QueryBindable { - fileprivate struct Expression: QueryExpression { - typealias QueryValue = Array +extension Sequence where Element: QueryExpression, Element.QueryValue: QueryBindable { + fileprivate typealias Expression = _SequenceExpression +} - let elements: [Element] - init(elements: [Element]) { - self.elements = elements - } - var queryFragment: QueryFragment { - "(\(elements.map(\.queryFragment).joined(separator: ", ")))" - } +fileprivate struct _SequenceExpression: QueryExpression +where S.Element: QueryExpression, S.Element.QueryValue: QueryBindable { + typealias QueryValue = S + let queryFragment: QueryFragment + init(elements: S) { + queryFragment = elements.map(\.queryFragment).joined(separator: ", ") } } From 5715a1ab379c80f1d789eba2923fcdb7ed5095d5 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Wed, 18 Jun 2025 14:29:32 -0700 Subject: [PATCH 2/2] wip --- Sources/StructuredQueriesCore/Operators.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/StructuredQueriesCore/Operators.swift b/Sources/StructuredQueriesCore/Operators.swift index e1cecf2b..f3f2dfb6 100644 --- a/Sources/StructuredQueriesCore/Operators.swift +++ b/Sources/StructuredQueriesCore/Operators.swift @@ -982,11 +982,11 @@ extension Sequence where Element: QueryExpression, Element.QueryValue: QueryBind fileprivate typealias Expression = _SequenceExpression } -fileprivate struct _SequenceExpression: QueryExpression +private struct _SequenceExpression: QueryExpression where S.Element: QueryExpression, S.Element.QueryValue: QueryBindable { typealias QueryValue = S let queryFragment: QueryFragment init(elements: S) { - queryFragment = elements.map(\.queryFragment).joined(separator: ", ") + queryFragment = "(\(elements.map(\.queryFragment).joined(separator: ", ")))" } }