From 807a9d31c631a6d61abf7d70f6482fc15decf56e Mon Sep 17 00:00:00 2001 From: phoebus-84 Date: Thu, 2 Apr 2026 15:57:56 +0200 Subject: [PATCH] fix: cast Decimal to float for Haversine geo search query PostgreSQL radians() expects float arguments. Convert Decimal filter values with Decimal.to_float/1 and cast decimal columns with ::float8 to prevent Postgrex EncodeError. --- src/zenflows/vf/economic_resource/query.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/zenflows/vf/economic_resource/query.ex b/src/zenflows/vf/economic_resource/query.ex index d1d779c..af5bf3e 100644 --- a/src/zenflows/vf/economic_resource/query.ex +++ b/src/zenflows/vf/economic_resource/query.ex @@ -83,12 +83,16 @@ defp all_f(q, {:or_repo, v}), @spec apply_geo_filter(Queryable.t(), map()) :: Queryable.t() defp apply_geo_filter(q, %{near_lat: lat, near_long: long, near_distance_km: dist}) do + lat = Decimal.to_float(lat) + long = Decimal.to_float(long) + dist = Decimal.to_float(dist) + from x in q, join: loc in SpatialThing, on: loc.id == x.current_location_id, where: not is_nil(loc.lat) and not is_nil(loc.long), where: fragment( - "(6371 * acos(LEAST(1.0, cos(radians(?)) * cos(radians(?)) * cos(radians(?) - radians(?)) + sin(radians(?)) * sin(radians(?))))) <= ?", + "(6371 * acos(LEAST(1.0, cos(radians(?)) * cos(radians(?::float8)) * cos(radians(?::float8) - radians(?)) + sin(radians(?)) * sin(radians(?::float8))))) <= ?", ^lat, loc.lat, loc.long, ^long, ^lat, loc.lat, ^dist ) end