@@ -1153,16 +1153,38 @@ pub(crate) fn rewrite_expr_for_vlp(
11531153 } )
11541154 }
11551155
1156- RenderExpr :: AggregateFnCall ( agg) => RenderExpr :: AggregateFnCall ( AggregateFnCall {
1157- name : agg. name . clone ( ) ,
1158- args : agg
1159- . args
1160- . iter ( )
1161- . map ( |a| {
1162- rewrite_expr_for_vlp ( a, start_alias, end_alias, path_variable, skip_start_alias)
1163- } )
1164- . collect ( ) ,
1165- } ) ,
1156+ RenderExpr :: AggregateFnCall ( agg) => {
1157+ // COUNT(path_variable) → COUNT(*) since each row represents a path
1158+ if let Some ( path_var) = path_variable {
1159+ if agg. args . len ( ) == 1 && agg. name . to_lowercase ( ) == "count" {
1160+ if let RenderExpr :: TableAlias ( alias) = & agg. args [ 0 ] {
1161+ if & alias. 0 == path_var {
1162+ log:: info!( "🔧 VLP path aggregate: count({}) → count(*)" , path_var) ;
1163+ return RenderExpr :: AggregateFnCall ( AggregateFnCall {
1164+ name : agg. name . clone ( ) ,
1165+ args : vec ! [ RenderExpr :: Star ] ,
1166+ } ) ;
1167+ }
1168+ }
1169+ }
1170+ }
1171+ RenderExpr :: AggregateFnCall ( AggregateFnCall {
1172+ name : agg. name . clone ( ) ,
1173+ args : agg
1174+ . args
1175+ . iter ( )
1176+ . map ( |a| {
1177+ rewrite_expr_for_vlp (
1178+ a,
1179+ start_alias,
1180+ end_alias,
1181+ path_variable,
1182+ skip_start_alias,
1183+ )
1184+ } )
1185+ . collect ( ) ,
1186+ } )
1187+ }
11661188
11671189 RenderExpr :: ColumnAlias ( ColumnAlias ( alias_str) )
11681190 if path_variable. as_ref ( ) == Some ( alias_str) =>
@@ -1563,14 +1585,31 @@ fn rewrite_expr_for_fixed_path(
15631585 } )
15641586 }
15651587
1566- RenderExpr :: AggregateFnCall ( agg) => RenderExpr :: AggregateFnCall ( AggregateFnCall {
1567- name : agg. name . clone ( ) ,
1568- args : agg
1569- . args
1570- . iter ( )
1571- . map ( |a| rewrite_expr_for_fixed_path ( a, path_variable, hop_count) )
1572- . collect ( ) ,
1573- } ) ,
1588+ RenderExpr :: AggregateFnCall ( agg) => {
1589+ // COUNT(path_variable) → COUNT(*) since each row represents a path
1590+ if agg. args . len ( ) == 1 {
1591+ if let RenderExpr :: TableAlias ( alias) = & agg. args [ 0 ] {
1592+ if alias. 0 == * path_variable && agg. name . to_lowercase ( ) == "count" {
1593+ log:: info!(
1594+ "🔧 Fixed path aggregate: count({}) → count(*)" ,
1595+ path_variable
1596+ ) ;
1597+ return RenderExpr :: AggregateFnCall ( AggregateFnCall {
1598+ name : agg. name . clone ( ) ,
1599+ args : vec ! [ RenderExpr :: Star ] ,
1600+ } ) ;
1601+ }
1602+ }
1603+ }
1604+ RenderExpr :: AggregateFnCall ( AggregateFnCall {
1605+ name : agg. name . clone ( ) ,
1606+ args : agg
1607+ . args
1608+ . iter ( )
1609+ . map ( |a| rewrite_expr_for_fixed_path ( a, path_variable, hop_count) )
1610+ . collect ( ) ,
1611+ } )
1612+ }
15741613
15751614 // Leave other expressions unchanged
15761615 other => other. clone ( ) ,
0 commit comments