@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