66//! Converts AST expressions to DataFusion expressions
77
88use crate :: ast:: { BooleanExpression , PropertyValue , ValueExpression } ;
9+ use crate :: datafusion_planner:: udf;
910use datafusion:: logical_expr:: { col, lit, BinaryExpr , Expr , Operator } ;
1011use datafusion_functions_aggregate:: average:: avg;
1112use datafusion_functions_aggregate:: count:: count;
@@ -212,6 +213,48 @@ pub(crate) fn to_df_value_expr(expr: &ValueExpression) -> Expr {
212213 right : Box :: new ( r) ,
213214 } )
214215 }
216+ VE :: VectorDistance {
217+ left,
218+ right,
219+ metric,
220+ } => {
221+ // Create UDF for vector distance computation
222+ let udf = udf:: create_vector_distance_udf ( metric) ;
223+ let left_expr = to_df_value_expr ( left) ;
224+ let right_expr = to_df_value_expr ( right) ;
225+ Expr :: ScalarFunction ( datafusion:: logical_expr:: expr:: ScalarFunction :: new_udf (
226+ udf,
227+ vec ! [ left_expr, right_expr] ,
228+ ) )
229+ }
230+ VE :: VectorSimilarity {
231+ left,
232+ right,
233+ metric,
234+ } => {
235+ // Create UDF for vector similarity computation
236+ let udf = udf:: create_vector_similarity_udf ( metric) ;
237+ let left_expr = to_df_value_expr ( left) ;
238+ let right_expr = to_df_value_expr ( right) ;
239+ Expr :: ScalarFunction ( datafusion:: logical_expr:: expr:: ScalarFunction :: new_udf (
240+ udf,
241+ vec ! [ left_expr, right_expr] ,
242+ ) )
243+ }
244+ VE :: Parameter ( name) => {
245+ // TODO: Implement proper parameter resolution
246+ // Parameters ($param) should be resolved to literal values from the query's
247+ // parameter map (CypherQuery::parameters()) before or during planning.
248+ //
249+ // Current limitation: This creates a column reference as a placeholder,
250+ // which will fail at execution if the column doesn't exist.
251+ //
252+ // Proper fix requires one of:
253+ // 1. Resolve parameters during semantic analysis (substitute before planning)
254+ // 2. Pass parameter map to to_df_value_expr and resolve here
255+ // 3. Use DataFusion's parameter binding mechanism
256+ col ( format ! ( "${}" , name) )
257+ }
215258 }
216259}
217260
@@ -229,6 +272,12 @@ pub(crate) fn contains_aggregate(expr: &ValueExpression) -> bool {
229272 is_aggregate || args. iter ( ) . any ( contains_aggregate)
230273 }
231274 VE :: Arithmetic { left, right, .. } => contains_aggregate ( left) || contains_aggregate ( right) ,
275+ VE :: VectorDistance { left, right, .. } => {
276+ contains_aggregate ( left) || contains_aggregate ( right)
277+ }
278+ VE :: VectorSimilarity { left, right, .. } => {
279+ contains_aggregate ( left) || contains_aggregate ( right)
280+ }
232281 _ => false ,
233282 }
234283}
0 commit comments