func comparator()

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
        }
    }