datafusion_ffi/
placement.rs1use datafusion_expr::ExpressionPlacement;
19
20#[expect(non_camel_case_types)]
21#[repr(u8)]
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub enum FFI_ExpressionPlacement {
24 Literal,
25 Column,
26 MoveTowardsLeafNodes,
27 KeepInPlace,
28}
29
30impl From<ExpressionPlacement> for FFI_ExpressionPlacement {
31 fn from(value: ExpressionPlacement) -> Self {
32 match value {
33 ExpressionPlacement::Literal => Self::Literal,
34 ExpressionPlacement::Column => Self::Column,
35 ExpressionPlacement::MoveTowardsLeafNodes => Self::MoveTowardsLeafNodes,
36 ExpressionPlacement::KeepInPlace => Self::KeepInPlace,
37 }
38 }
39}
40
41impl From<FFI_ExpressionPlacement> for ExpressionPlacement {
42 fn from(value: FFI_ExpressionPlacement) -> Self {
43 match value {
44 FFI_ExpressionPlacement::Literal => Self::Literal,
45 FFI_ExpressionPlacement::Column => Self::Column,
46 FFI_ExpressionPlacement::MoveTowardsLeafNodes => Self::MoveTowardsLeafNodes,
47 FFI_ExpressionPlacement::KeepInPlace => Self::KeepInPlace,
48 }
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use datafusion::logical_expr::ExpressionPlacement;
55
56 use super::FFI_ExpressionPlacement;
57
58 fn test_round_trip_placement(placement: ExpressionPlacement) {
59 let ffi_placement: FFI_ExpressionPlacement = placement.into();
60 let round_trip: ExpressionPlacement = ffi_placement.into();
61
62 assert_eq!(placement, round_trip);
63 }
64
65 #[test]
66 fn test_all_round_trip_placement() {
67 test_round_trip_placement(ExpressionPlacement::Literal);
68 test_round_trip_placement(ExpressionPlacement::Column);
69 test_round_trip_placement(ExpressionPlacement::MoveTowardsLeafNodes);
70 test_round_trip_placement(ExpressionPlacement::KeepInPlace);
71 }
72}