diff --git a/Sources/FluentPostGIS/Queries/QueryBuilder+DistanceWithin.swift b/Sources/FluentPostGIS/Queries/QueryBuilder+DistanceWithin.swift index b18b459..6f12c5f 100644 --- a/Sources/FluentPostGIS/Queries/QueryBuilder+DistanceWithin.swift +++ b/Sources/FluentPostGIS/Queries/QueryBuilder+DistanceWithin.swift @@ -47,11 +47,23 @@ extension QueryBuilder where return filterGeographyDistanceWithin(Database.queryField(.keyPath(key)), Database.queryFilterValueGeographic(filter), Database.queryFilterValue([value])) } + @discardableResult + public func filterGeographyDistanceWithin(_ key: KeyPath, _ filter: V, _ valueKey: KeyPath) -> Self + where T: GeometryConvertible, V: GeometryConvertible, OtherResult: Model, OtherResult.Database == Database + { + return filterGeographyDistanceWithin(Database.queryField(.keyPath(key)), Database.queryFilterValueGeographic(filter), Database.queryField(.keyPath(valueKey))) + } + @discardableResult private func filterGeographyDistanceWithin(_ field: Database.QueryField, _ filter: Database.QueryFilterValue, _ value: Database.QueryFilterValue) -> Self { return self.filter(custom: Database.filterGeographyDistanceWithin(field, filter, value)) } + @discardableResult + private func filterGeographyDistanceWithin(_ field: Database.QueryField, _ filter: Database.QueryFilterValue, _ value: Database.QueryField) -> Self { + return self.filter(custom: Database.filterGeographyDistanceWithin(field, filter, value)) + } + } extension QuerySupporting where @@ -91,4 +103,13 @@ extension QuerySupporting where ] as! [QueryFilter.Function.Argument] return .function("ST_DWithin", args) } + + public static func filterGeographyDistanceWithin(_ field: QueryField, _ filter: QueryFilterValue, _ valueField: QueryField) -> QueryFilter { + let args: [QueryFilter.Function.Argument] = [ + GenericSQLFunctionArgument.expression(PostgreSQLExpression.column(field as! PostgreSQLColumnIdentifier)), + GenericSQLFunctionArgument.expression(filter as! PostgreSQLExpression), + GenericSQLFunctionArgument.expression(PostgreSQLExpression.column(valueField as! PostgreSQLColumnIdentifier)), + ] as! [QueryFilter.Function.Argument] + return .function("ST_DWithin", args) + } }