jiayuasu opened a new issue, #2971:
URL: https://github.com/apache/sedona/issues/2971

   Follow-up to the Box2D spatial-join work in #2939. That PR explicitly scoped 
out the distance-join case because `ST_DWithin` only accepted `(Geometry, 
Geometry, distance)` and `(Geography, Geography, distance)` overloads — so 
`ST_DWithin(box, box, d)` was rejected at analysis time.
   
   ## Scope
   
   Add a planar `(Box2D, Box2D, distance)` overload so distance joins on Box2D 
columns are accepted and route through Sedona's existing distance-join planner 
(`BroadcastIndexJoinExec` and `DistanceJoinExec`).
   
   ## Semantics
   
   - Closed-interval Euclidean distance between two AABBs: `sqrt(dx² + dy²)` 
where `dx = max(0, max(a.xmin - b.xmax, b.xmin - a.xmax))` and similarly for 
`dy`. Overlapping or edge/corner-touching boxes have distance `0` and therefore 
match any non-negative radius.
   - Inverted bounds (`xmin > xmax` / `ymin > ymax`) throw 
`IllegalArgumentException`, matching the contract of `ST_BoxIntersects` / 
`ST_BoxContains`. Inverted-bound values are reserved for the future 
antimeridian-wraparound semantics.
   - Negative radius never matches.
   
   ## Why a new overload
   
   `ST_DWithin` is already wired through `JoinQueryDetector` and 
`OptimizableJoinCondition`; both treat the 3-arg form generically based on 
shape expression dataType, and the `toExpandedEnvelopeRDD` path uses the Box2D 
→ polygon dispatch landed in #2939. The only thing blocking Box2D × Box2D 
distance joins is the absence of a scalar `Predicates.dWithin(Box2D, Box2D, 
double)` overload and a matching `inferrableFunction3` entry in the 
`ST_DWithin` InferredExpression. With those, the join planner accepts the 
predicate and the per-pair refine dispatches back to the new scalar.
   
   ## Deliverables
   
   - `Predicates.dWithin(Box2D, Box2D, double)` in `common`.
   - 4th `inferrableFunction3` entry on `ST_DWithin` in 
`spark/common/.../Predicates.scala`. The pre-existing 3-arg geometry entry 
needs an explicit lambda because two arity-3 overloads named 
`Predicates.dWithin` now exist on the Java side.
   - Scalar tests in `PredicatesTest` (overlap, edge/corner touching, 
separation on one axis, Pythagorean separation, negative radius, inverted-bound 
rejection).
   - Join tests in `Box2DJoinSuite` (broadcast-index path at multiple radii, 
non-broadcast `DistanceJoinExec` path, zero-radius edge-touching).
   - Docs: new `docs/api/sql/box2d/Box2D-Predicates/ST_DWithin.md` and a row in 
`Box2D-Functions.md`.
   
   ## Out of scope
   
   - A `(Box2D, Box2D, distance, useSpheroid)` 4-arg overload. `useSpheroid` is 
geography territory; Box2D is planar.
   - A specialised R-tree over Box2D (tracked separately in #2940 — only worth 
doing if profiling shows the JTS Envelope construction is a real cost).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to