Path: blob/main/crates/polars-plan/src/plans/aexpr/hash.rs
8424 views
use std::hash::{Hash, Hasher};12use polars_utils::arena::{Arena, Node};34use crate::prelude::AExpr;56impl Hash for AExpr {7// This hashes the variant, not the whole expression8// IMPORTANT: This is also used for equality in some cases with blake3.9// Make sure that all attributes that are important for equality are hashed. Nodes don't have10// to be hashed.11fn hash<H: Hasher>(&self, state: &mut H) {12std::mem::discriminant(self).hash(state);1314match self {15AExpr::Column(name) => name.hash(state),16AExpr::StructField(name) => name.hash(state),17AExpr::Literal(lv) => lv.hash(state),18AExpr::Function {19options,20function,21input: _,22} => {23options.hash(state);24function.hash(state)25},26AExpr::AnonymousFunction {27options,28fmt_str,29function,30input: _,31} => {32fmt_str.hash(state);33options.hash(state);34function.hash(state);35},36AExpr::Agg(agg) => agg.hash(state),37AExpr::SortBy { sort_options, .. } => sort_options.hash(state),38AExpr::Cast {39options,40dtype,41expr: _,42} => {43options.hash(state);44dtype.hash(state);45},46#[cfg(feature = "dynamic_group_by")]47AExpr::Rolling {48function: _,49index_column: _,50period,51offset,52closed_window,53} => {54period.hash(state);55offset.hash(state);56closed_window.hash(state);57},58AExpr::Over {59mapping,60order_by,61function: _,62partition_by: _,63} => {64mapping.hash(state);65if let Some(o) = order_by {66o.1.hash(state);67}68},69AExpr::BinaryExpr {70op,71left: _,72right: _,73} => op.hash(state),74AExpr::Element => {},75AExpr::Explode { expr: _, options } => options.hash(state),76AExpr::Sort { expr: _, options } => options.hash(state),77AExpr::Gather {78expr: _,79idx: _,80returns_scalar,81null_on_oob: _,82} => returns_scalar.hash(state),83AExpr::Filter { input: _, by: _ } => {},84AExpr::Ternary {85predicate: _,86truthy: _,87falsy: _,88} => {},89AExpr::AnonymousAgg {90input: _,91fmt_str,92function,93} => {94function.hash(state);95fmt_str.hash(state);96},97AExpr::Eval {98expr: _,99evaluation: _,100variant,101} => variant.hash(state),102AExpr::StructEval {103expr: _,104evaluation: _,105} => {},106AExpr::Slice {107input: _,108offset: _,109length: _,110} => {},111AExpr::Len => {},112}113}114}115116pub(crate) fn traverse_and_hash_aexpr<H: Hasher>(117node: Node,118expr_arena: &Arena<AExpr>,119state: &mut H,120) {121let mut scratch = vec![node];122123while let Some(node) = scratch.pop() {124let ae = expr_arena.get(node);125ae.hash(state);126ae.children_rev(&mut scratch);127}128}129130131