diff --git a/Sources/FluentPostGIS/Queries/QueryBuilder+Sort.swift b/Sources/FluentPostGIS/Queries/QueryBuilder+Sort.swift new file mode 100644 index 0000000..c1ef5f6 --- /dev/null +++ b/Sources/FluentPostGIS/Queries/QueryBuilder+Sort.swift @@ -0,0 +1,29 @@ +import FluentPostgreSQL + +extension QueryBuilder where + Database: QuerySupporting, + Database.QuerySort: SQLOrderBy, + Database.QueryFilter: SQLExpression, + Database.QueryFilterValue == Database.QueryFilter +{ + @discardableResult + public func sortByDistance(between key: KeyPath, _ filter: V) -> Self + where T: GeometryConvertible, V: GeometryConvertible { + return self.sort(Database.distanceSort(between: Database.queryField(.keyPath(key)), Database.queryFilterValueGeographic(filter))) + } + +} + +extension QuerySupporting where + QuerySort: SQLOrderBy +{ + public static func distanceSort(between field: QueryField, _ filter: QueryFilterValue) -> QuerySort { + let args: [QuerySort.Expression.Function.Argument] = [ + GenericSQLFunctionArgument.expression(PostgreSQLExpression.column(field as! PostgreSQLColumnIdentifier)), + GenericSQLFunctionArgument.expression(filter as! PostgreSQLExpression), + ] as! [QuerySort.Expression.Function.Argument] + return .orderBy(.function("ST_Distance", args), .ascending) + } +} + +