in AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Subscribe/Support/Model+Sort.swift [87:171]
func comparator(model1: Model,
model2: Model,
sortBy: QuerySortDescriptor) -> Bool? {
let fieldName = sortBy.fieldName
let sortOrder = sortBy.order
guard let modelField = field(withName: fieldName) else {
return false
}
let value1 = model1[fieldName] ?? nil
let value2 = model2[fieldName] ?? nil
switch modelField.type {
case .string:
guard let value1Optional = value1 as? String?, let value2Optional = value2 as? String? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .int, .timestamp:
guard let value1Optional = value1 as? Int?, let value2Optional = value2 as? Int? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .double:
guard let value1Optional = value1 as? Double?, let value2Optional = value2 as? Double? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .date:
guard let value1Optional = value1 as? Temporal.Date?, let value2Optional = value2 as? Temporal.Date? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .dateTime:
guard let value1Optional = value1 as? Temporal.DateTime?,
let value2Optional = value2 as? Temporal.DateTime? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .time:
guard let value1Optional = value1 as? Temporal.Time?, let value2Optional = value2 as? Temporal.Time? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional,
value2Optional: value2Optional)
.sortComparator(sortOrder: sortOrder)
case .bool:
guard let value1Optional = value1 as? Bool?, let value2Optional = value2 as? Bool? else {
return false
}
return ModelValueCompare(value1Optional: value1Optional?.intValue,
value2Optional: value2Optional?.intValue)
.sortComparator(sortOrder: sortOrder)
case .enum:
guard case .some(Optional<Any>.some(let value1Optional)) = value1,
case .some(Optional<Any>.some(let value2Optional)) = value2 else {
if value1 == nil && value2 != nil {
return sortOrder == .ascending
} else if value1 != nil && value2 == nil {
return sortOrder == .descending
}
return false
}
let enumValue1Optional = (value1Optional as? EnumPersistable)?.rawValue
let enumValue2Optional = (value2Optional as? EnumPersistable)?.rawValue
return ModelValueCompare(value1Optional: enumValue1Optional,
value2Optional: enumValue2Optional)
.sortComparator(sortOrder: sortOrder)
case .embedded, .embeddedCollection, .model, .collection:
// Behavior is undetermined
log.warn("Sorting on field type \(modelField.type) is unsupported")
return false
}
}