Path: blob/main/crates/polars-plan/src/plans/functions/hint.rs
7887 views
use std::fmt;1use std::sync::Arc;23use polars_core::prelude::PlHashSet;4use polars_utils::pl_str::PlSmallStr;56#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]7#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]8#[derive(Debug, Clone, Hash)]9pub struct Sorted {10pub column: PlSmallStr,11/// None -> either way / unsure12/// Some(false) -> ascending13/// Some(true) -> descending14pub descending: Option<bool>,15/// None -> either way / unsure16/// Some(false) -> nulls (if any) at start17/// Some(true) -> nulls (if any) at end18pub nulls_last: Option<bool>,19}2021#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]22#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]23#[derive(Clone, Hash, strum_macros::IntoStaticStr)]24#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]25pub enum HintIR {26Sorted(Arc<[Sorted]>),27}2829impl HintIR {30pub fn project(&self, projected_names: &PlHashSet<PlSmallStr>) -> Option<HintIR> {31match self {32Self::Sorted(s) => {33let num_matches = s34.iter()35.filter(|i| projected_names.contains(&i.column))36.count();3738if num_matches == s.len() {39return Some(Self::Sorted(s.clone()));40} else if num_matches == 0 {41return None;42}4344let mut sorted = Vec::with_capacity(num_matches);45sorted.extend(46s.iter()47.filter(|i| projected_names.contains(&i.column))48.cloned(),49);50Some(Self::Sorted(sorted.into()))51},52}53}54}5556impl fmt::Display for Sorted {57fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {58let descending = match self.descending {59None => "?",60Some(false) => "false",61Some(true) => "true",62};63let nulls_last = match self.nulls_last {64None => "?",65Some(false) => "false",66Some(true) => "true",67};6869write!(70f,71"'{}': {{ descending: {descending}, nulls_last: {nulls_last} }}",72self.column,73)74}75}7677impl fmt::Debug for HintIR {78fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {79write!(f, "{self}")80}81}8283impl fmt::Display for HintIR {84fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {85match self {86HintIR::Sorted(s) => {87write!(f, "sorted(")?;88if let Some(fst) = s.first() {89fst.fmt(f)?;90for si in &s[1..] {91f.write_str(", ")?;92si.fmt(f)?;93}94}95write!(f, ")")96},97}98}99}100101102