@Selection macro uses positional, not named, field mapping #40
-
DescriptionWhen using the Example:SELECT
COUNT(CASE WHEN isArchived = 0 THEN 1 END) AS activeCount,
COUNT(CASE WHEN isArchived = 1 THEN 1 END) AS archivedCount
FROM jobApplications; @Selection
struct JobApplicationStatusCounts: QueryRepresentable {
var activeCount: Int
var archivedCount: Int
}
var jobApplicationStatusCounts = #sql("""
SELECT
COUNT(CASE WHEN isArchived = 0 THEN 1 END) AS activeCount,
COUNT(CASE WHEN isArchived = 1 THEN 1 END) AS archivedCount
FROM jobApplications
""", as: JobApplicationStatusCounts?.self) This works correctly. However, swapping the struct field order like this: struct JobApplicationStatusCounts: QueryRepresentable {
var archivedCount: Int
var activeCount: Int
} ...produces incorrect values (likely Expected
Checklist
Expected behaviorNo response Actual behaviorNo response Reproducing projectNo response Structured Queries version information0.1.1 Destination operating systemiOS 18 Xcode version informationXcode 16.3 Swift Compiler version informationswift-driver version: 1.120.5 Apple Swift version 6.1 (swiftlang-6.1.0.110.21 clang-1700.0.13.3)
Target: arm64-apple-macosx15.0 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 8 replies
-
Hi @Muhammed9991! This is actually working as expected, as all decoding in StructuredQueries is positional, and depends on you using the query builder to enforce this field ordering. If you want to still use SQL strings in the selection you can do so: @Selection
struct JobApplicationStatusCounts: QueryRepresentable {
var activeCount: Int
var archivedCount: Int
}
let jobApplicationStatusCounts = JobApplication
.select {
JobApplicationStatusCounts.Columns(
activeCount: #sql("COUNT(CASE WHEN \($0.isArchived) = 0 THEN 1 END)"),
archivedCount: #sql("COUNT(CASE WHEN \($0.isArchived) = 1 THEN 1 END)")
)
} Or you could use the let jobApplicationStatusCounts = JobApplication
.select {
JobApplicationStatusCounts.Columns(
activeCount: $0.count(filter: !$0.isArchived),
archivedCount: $0.count(filter: $0.isArchived)
)
} Since this isn't a bug in the library, I'm going to convert to a discussion. |
Beta Was this translation helpful? Give feedback.
@Muhammed9991 Added a callout here: #41