Path: blob/main/crates/polars-core/src/frame/projection.rs
8439 views
use polars_error::{PolarsResult, polars_err};1use polars_utils::aliases::PlHashMap;23use crate::frame::DataFrame;4use crate::prelude::Column;56pub(super) const LINEAR_SEARCH_LIMIT: usize = 4;78/// Selects columns by name.9pub(super) enum AmortizedColumnSelector<'a> {10Direct {11df: &'a DataFrame,12},13NameToIdxMapping {14df: &'a DataFrame,15name_to_idx: PlHashMap<&'a str, usize>,16},17}1819impl<'a> AmortizedColumnSelector<'a> {20pub(super) fn new(df: &'a DataFrame) -> Self {21if df.width() <= LINEAR_SEARCH_LIMIT || df.cached_schema().is_some() {22Self::Direct { df }23} else {24Self::NameToIdxMapping {25df,26name_to_idx: df27.columns()28.iter()29.enumerate()30.map(|(i, s)| (s.name().as_str(), i))31.collect(),32}33}34}3536fn select(&self, name: &str) -> PolarsResult<&'a Column> {37match self {38Self::Direct { df } => df.column(name),39Self::NameToIdxMapping { df, name_to_idx } => {40let i = *name_to_idx41.get(name)42.ok_or_else(|| polars_err!(col_not_found = name))?;4344Ok(df.select_at_idx(i).unwrap())45},46}47}4849/// Does not error on duplicate selections.50pub(super) fn select_multiple(51&self,52names: impl IntoIterator<Item = impl AsRef<str>>,53) -> PolarsResult<Vec<Column>> {54names55.into_iter()56.map(|name| self.select(name.as_ref()).cloned())57.collect()58}59}606162