datafusion_functions_window/
planner.rs1use datafusion_common::Result;
21use datafusion_expr::{
22 expr::{WindowFunction, WindowFunctionParams},
23 expr_rewriter::NamePreserver,
24 planner::{ExprPlanner, PlannerResult, RawWindowExpr},
25 utils::COUNT_STAR_EXPANSION,
26 Expr,
27};
28
29#[derive(Debug)]
30pub struct WindowFunctionPlanner;
31
32impl ExprPlanner for WindowFunctionPlanner {
33 fn plan_window(
34 &self,
35 raw_expr: RawWindowExpr,
36 ) -> Result<PlannerResult<RawWindowExpr>> {
37 let RawWindowExpr {
38 func_def,
39 args,
40 partition_by,
41 order_by,
42 window_frame,
43 filter,
44 null_treatment,
45 distinct,
46 } = raw_expr;
47
48 let origin_expr = Expr::from(WindowFunction {
49 fun: func_def,
50 params: WindowFunctionParams {
51 args,
52 partition_by,
53 order_by,
54 window_frame,
55 filter,
56 null_treatment,
57 distinct,
58 },
59 });
60
61 let saved_name = NamePreserver::new_for_projection().save(&origin_expr);
62
63 let Expr::WindowFunction(window_fun) = origin_expr else {
64 unreachable!("")
65 };
66 let WindowFunction {
67 fun,
68 params:
69 WindowFunctionParams {
70 args,
71 partition_by,
72 order_by,
73 window_frame,
74 null_treatment,
75 distinct,
76 filter,
77 },
78 } = *window_fun;
79 let raw_expr = RawWindowExpr {
80 func_def: fun,
81 args,
82 partition_by,
83 order_by,
84 window_frame,
85 filter,
86 null_treatment,
87 distinct,
88 };
89
90 #[expect(deprecated)]
92 if raw_expr.func_def.name() == "count"
93 && (raw_expr.args.len() == 1
94 && matches!(raw_expr.args[0], Expr::Wildcard { .. })
95 || raw_expr.args.is_empty())
96 {
97 let RawWindowExpr {
98 func_def,
99 args: _,
100 partition_by,
101 order_by,
102 window_frame,
103 filter,
104 null_treatment,
105 distinct,
106 } = raw_expr;
107
108 let new_expr = Expr::from(WindowFunction {
109 fun: func_def,
110 params: WindowFunctionParams {
111 args: vec![Expr::Literal(COUNT_STAR_EXPANSION, None)],
112 partition_by,
113 order_by,
114 window_frame,
115 filter,
116 null_treatment,
117 distinct,
118 },
119 });
120 let new_expr = saved_name.restore(new_expr);
121
122 return Ok(PlannerResult::Planned(new_expr));
123 }
124
125 Ok(PlannerResult::Original(raw_expr))
126 }
127}