use super::*;
pub fn col<S>(name: S) -> Expr
where
S: Into<PlSmallStr>,
{
let name = name.into();
match name.as_str() {
"*" => all().as_expr(),
n if is_regex_projection(n) => Expr::Selector(Selector::Matches(name)),
_ => Expr::Column(name),
}
}
pub fn element() -> Expr {
Expr::Element
}
pub fn empty() -> Selector {
Selector::Empty
}
pub fn all() -> Selector {
Selector::Wildcard
}
pub fn cols<I, S>(names: I) -> Selector
where
I: IntoIterator<Item = S>,
S: Into<PlSmallStr>,
{
by_name(names, true, true)
}
pub fn dtype_col(dtype: &DataType) -> DataTypeSelector {
DataTypeSelector::AnyOf([dtype.clone()].into())
}
pub fn dtype_cols<DT: AsRef<[DataType]>>(dtype: DT) -> DataTypeSelector {
let dtypes = dtype.as_ref();
DataTypeSelector::AnyOf(dtypes.into())
}
pub fn by_name<S: Into<PlSmallStr>, I: IntoIterator<Item = S>>(
names: I,
strict: bool,
expand_patterns: bool,
) -> Selector {
if !expand_patterns {
let names = names.into_iter().map(Into::into).collect::<Arc<[_]>>();
return Selector::ByName { names, strict };
}
let mut selector = None;
let _s = &mut selector;
let names = names
.into_iter()
.map(Into::into)
.filter_map(|name| match name.as_str() {
"*" => {
*_s = Some(std::mem::take(_s).map_or(all(), |s| s | all()));
None
},
n if is_regex_projection(n) => {
let m = Selector::Matches(name);
*_s = Some(std::mem::take(_s).map_or_else(|| m.clone(), |s| s | m.clone()));
None
},
_ => Some(name),
})
.collect::<Arc<[_]>>();
let no_names = names.is_empty();
let names = Selector::ByName { names, strict };
if let Some(selector) = selector {
if no_names { selector } else { selector | names }
} else {
names
}
}
pub fn index_cols<N: AsRef<[i64]>>(indices: N) -> Selector {
let indices = indices.as_ref().into();
Selector::ByIndex {
indices,
strict: true,
}
}