Skip to main content

akar_processor/processor/
projection_helper.rs

1use akar_common::vector::DataChunk;
2use akar_parser::ast::Expression;
3
4pub fn resolve_projection_column_index(expr: &Expression, chunk: &DataChunk) -> Option<usize> {
5    if let Expression::PropertyAccess(obj, prop) = expr {
6        let col_name = if let Expression::Variable(var) = &**obj {
7            format!("{}.{}", var, prop)
8        } else {
9            prop.clone()
10        };
11        if !chunk.field_names.is_empty() {
12            if let Some(idx) = chunk.field_names.iter().position(|n| n == &col_name || n == prop) {
13                return Some(idx);
14            }
15        }
16        if let Expression::Variable(var) = &**obj {
17            if let Ok(idx) = var.parse::<usize>() {
18                return Some(idx);
19            }
20        }
21        return None;
22    }
23    if let Expression::Variable(name) = expr {
24        if let Ok(idx) = name.parse::<usize>() {
25            return Some(idx);
26        }
27        if !chunk.field_names.is_empty() {
28            if let Some(idx) = chunk.field_names.iter().position(|n| n == name) {
29                return Some(idx);
30            }
31        }
32        return None;
33    }
34    None
35}