Path: blob/main/crates/polars-lazy/src/tests/projection_queries.rs
6939 views
use polars_ops::frame::JoinCoalesce;12use super::*;34#[test]5fn test_join_suffix_and_drop() -> PolarsResult<()> {6let weight = df![7"id" => [1, 2, 3, 4, 5, 0],8"wgt" => [4.32, 5.23, 2.33, 23.399, 392.2, 0.0]9]?10.lazy();1112let ped = df![13"id"=> [1, 2, 3, 4, 5],14"sireid"=> [0, 0, 1, 3, 3]15]?16.lazy();1718let sumry = weight19.clone()20.filter(col("id").eq(lit(2i32)))21.inner_join(ped, "id", "id");2223let out = sumry24.join_builder()25.with(weight)26.left_on([col("sireid")])27.right_on([col("id")])28.suffix("_sire")29.finish()30.drop(cols(["sireid"]))31.collect()?;3233assert_eq!(out.shape(), (1, 3));3435Ok(())36}3738#[test]39#[cfg(feature = "cross_join")]40fn test_cross_join_pd() -> PolarsResult<()> {41let food = df![42"name"=> ["Omelette", "Fried Egg"],43"price" => [8, 5]44]?;4546let drink = df![47"name" => ["Orange Juice", "Tea"],48"price" => [5, 4]49]?;5051let q = food.lazy().cross_join(drink.lazy(), None).select([52col("name").alias("food"),53col("name_right").alias("beverage"),54(col("price") + col("price_right")).alias("total"),55]);5657let out = q.collect()?;58let expected = df![59"food" => ["Omelette", "Omelette", "Fried Egg", "Fried Egg"],60"beverage" => ["Orange Juice", "Tea", "Orange Juice", "Tea"],61"total" => [13, 12, 10, 9]62]?;6364assert!(out.equals(&expected));65Ok(())66}6768#[test]69fn test_row_number_pd() -> PolarsResult<()> {70let df = df![71"x" => [1, 2, 3],72"y" => [3, 2, 1],73]?;7475let df = df76.lazy()77.with_row_index("index", None)78.select([col("index"), col("x") * lit(3i32)])79.collect()?;8081let expected = df![82"index" => [0 as IdxSize, 1, 2],83"x" => [3i32, 6, 9]84]?;8586assert!(df.equals(&expected));8788Ok(())89}9091#[test]92#[cfg(feature = "cse")]93fn scan_join_same_file() -> PolarsResult<()> {94let lf = LazyCsvReader::new(PlPath::new(FOODS_CSV)).finish()?;9596for cse in [true, false] {97let partial = lf.clone().select([col("category")]).limit(5);98let q = lf99.clone()100.join(101partial,102[col("category")],103[col("category")],104JoinType::Inner.into(),105)106.with_comm_subplan_elim(cse);107let out = q.collect()?;108assert_eq!(109out.get_column_names(),110&["category", "calories", "fats_g", "sugars_g"]111);112}113Ok(())114}115116#[test]117#[cfg(all(feature = "regex", feature = "concat_str"))]118fn concat_str_regex_expansion() -> PolarsResult<()> {119let df = df![120"a"=> [1, 1, 1],121"b_a_1"=> ["a--", "", ""],122"b_a_2"=> ["", "b--", ""],123"b_a_3"=> ["", "", "c--"]124]?125.lazy();126let out = df127.select([concat_str([col(r"^b_a_\d$")], ";", false).alias("concatenated")])128.collect()?;129let s = out.column("concatenated")?;130assert_eq!(131s,132&Column::new("concatenated".into(), ["a--;;", ";b--;", ";;c--"])133);134135Ok(())136}137138#[test]139fn test_coalesce_toggle_projection_pushdown() -> PolarsResult<()> {140// Test that the optimizer toggle coalesce to true if the non-coalesced column isn't used.141let q1 = df!["a" => [1],142"b" => [2]143]?144.lazy();145146let q2 = df!["a" => [1],147"c" => [2]148]?149.lazy();150151let plan = q1152.join(153q2,154[col("a")],155[col("a")],156JoinArgs {157how: JoinType::Left,158coalesce: JoinCoalesce::KeepColumns,159..Default::default()160},161)162.select([col("a"), col("b")])163.to_alp_optimized()?;164165let node = plan.lp_top;166let lp_arena = plan.lp_arena;167168assert!(lp_arena.iter(node).all(|(_, plan)| match plan {169IR::Join { options, .. } => options.args.should_coalesce(),170_ => true,171}));172173Ok(())174}175176177