pub struct KNNPredicate {
pub left: Arc<dyn PhysicalExpr>,
pub right: Arc<dyn PhysicalExpr>,
pub k: u32,
pub use_spheroid: bool,
pub probe_side: JoinSide,
}Expand description
K-Nearest Neighbors (KNN) spatial join predicate.
This predicate represents a spatial join that finds the k nearest neighbors from the right side (object) table for each geometry in the left side (query) table. It’s commonly used for proximity analysis and spatial recommendations.
§Example SQL
SELECT * FROM restaurants r
JOIN TABLE(ST_KNN(r.location, h.location, 5, false)) AS knn
ON r.id = knn.restaurant_id§Algorithm
For each geometry in the left (query) side:
- Find the k nearest geometries from the right (object) side
- Use spatial index for efficient nearest neighbor search
- Handle tie-breaking when multiple geometries have the same distance
§Performance Considerations
- Uses R-tree spatial index for efficient search
- Performance depends on k value and spatial distribution
- Tie-breaking may require additional distance calculations
§Limitations
- Currently only supports planar (Euclidean) distance calculations
- Spheroid distance (use_spheroid=true) is not yet implemented
Fields§
§left: Arc<dyn PhysicalExpr>The expression for evaluating the geometry value on the left side (queries side). The expression should be evaluated directly on the left side batches.
right: Arc<dyn PhysicalExpr>The expression for evaluating the geometry value on the right side (object side). The expression should be evaluated directly on the right side batches.
k: u32The number of nearest neighbors to find (literal value).
use_spheroid: boolWhether to use spheroid distance calculation or planar distance (literal value). Currently must be false as spheroid distance is not yet implemented.
probe_side: JoinSideWhich execution plan side (Left or Right) the probe expression belongs to. This is used to correctly assign build/probe plans in execution.
Implementations§
Source§impl KNNPredicate
impl KNNPredicate
Sourcepub fn new(
left: Arc<dyn PhysicalExpr>,
right: Arc<dyn PhysicalExpr>,
k: u32,
use_spheroid: bool,
probe_side: JoinSide,
) -> Self
pub fn new( left: Arc<dyn PhysicalExpr>, right: Arc<dyn PhysicalExpr>, k: u32, use_spheroid: bool, probe_side: JoinSide, ) -> Self
Creates a new K-Nearest Neighbors predicate.
§Arguments
left- Expression for the left side (query) geometryright- Expression for the right side (object) geometryk- Number of nearest neighbors to find (literal value)use_spheroid- Whether to use spheroid distance (literal value, currently must be false)probe_side- Which execution plan side the probe expression belongs to, cannot be None
Trait Implementations§
Source§impl Clone for KNNPredicate
impl Clone for KNNPredicate
Source§fn clone(&self) -> KNNPredicate
fn clone(&self) -> KNNPredicate
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for KNNPredicate
impl Debug for KNNPredicate
Source§impl Display for KNNPredicate
impl Display for KNNPredicate
Source§impl SpatialPredicateTrait for KNNPredicate
impl SpatialPredicateTrait for KNNPredicate
Source§fn swap_for_swapped_children(&self) -> Self
fn swap_for_swapped_children(&self) -> Self
Source§fn update_for_child_projections(
&self,
projected_left_exprs: &[ProjectionExpr],
projected_right_exprs: &[ProjectionExpr],
) -> Result<Option<Self>>
fn update_for_child_projections( &self, projected_left_exprs: &[ProjectionExpr], projected_right_exprs: &[ProjectionExpr], ) -> Result<Option<Self>>
Auto Trait Implementations§
impl Freeze for KNNPredicate
impl !RefUnwindSafe for KNNPredicate
impl Send for KNNPredicate
impl Sync for KNNPredicate
impl Unpin for KNNPredicate
impl UnsafeUnpin for KNNPredicate
impl !UnwindSafe for KNNPredicate
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more