MCPcopy Create free account
hub / github.com/PRQL/prql / resolve_special_func

Method resolve_special_func

prqlc/prqlc/src/semantic/resolver/transforms.rs:21–513  ·  view source on GitHub ↗
(&mut self, func: Box<Func>, needs_window: bool)

Source from the content-addressed store, hash-verified

19 /// try to convert function call with enough args into transform
20 #[allow(clippy::boxed_local)]
21 pub fn resolve_special_func(&mut self, func: Box<Func>, needs_window: bool) -> Result<Expr> {
22 let internal_name = func.body.kind.into_internal().unwrap();
23
24 let (kind, input) = match internal_name.as_str() {
25 "select" => {
26 let [assigns, tbl] = unpack::<2>(func.args);
27
28 let assigns = Box::new(self.coerce_into_tuple(assigns)?);
29 (TransformKind::Select { assigns }, tbl)
30 }
31 "filter" => {
32 let [filter, tbl] = unpack::<2>(func.args);
33
34 let filter = Box::new(filter);
35 (TransformKind::Filter { filter }, tbl)
36 }
37 "derive" => {
38 let [assigns, tbl] = unpack::<2>(func.args);
39
40 let assigns = Box::new(self.coerce_into_tuple(assigns)?);
41 (TransformKind::Derive { assigns }, tbl)
42 }
43 "aggregate" => {
44 let [assigns, tbl] = unpack::<2>(func.args);
45
46 let assigns = Box::new(self.coerce_into_tuple(assigns)?);
47 (TransformKind::Aggregate { assigns }, tbl)
48 }
49 "sort" => {
50 let [by, tbl] = unpack::<2>(func.args);
51
52 let by = self
53 .coerce_into_tuple(by)?
54 .try_cast(|x| x.into_tuple(), Some("sort"), "tuple")?
55 .into_iter()
56 .map(|expr| {
57 let (column, direction) = match expr.kind {
58 ExprKind::RqOperator { name, mut args } if name == "std.neg" => {
59 (args.remove(0), SortDirection::Desc)
60 }
61 _ => (expr, SortDirection::default()),
62 };
63 let column = Box::new(column);
64
65 ColumnSort { direction, column }
66 })
67 .collect();
68
69 (TransformKind::Sort { by }, tbl)
70 }
71 "take" => {
72 let [expr, tbl] = unpack::<2>(func.args);
73
74 let range = if let ExprKind::Literal(Literal::Integer(n)) = expr.kind {
75 range_from_ints(None, Some(n))
76 } else {
77 match try_restrict_range(expr) {
78 Ok((start, end)) => Range {

Callers 1

fold_functionMethod · 0.80

Calls 15

range_from_intsFunction · 0.85
try_restrict_rangeFunction · 0.85
restrict_null_literalFunction · 0.85
write_plFunction · 0.85
into_literal_rangeFunction · 0.85
range_is_emptyFunction · 0.85
LiteralEnum · 0.85
parse_csvFunction · 0.85
parse_jsonFunction · 0.85
compiler_versionFunction · 0.85
TransformCallClass · 0.85
as_strMethod · 0.80

Tested by

no test coverage detected