vortex_compute/comparison/
datum.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::vortex_panic;
5use vortex_vector::BinaryViewDatum;
6use vortex_vector::BoolDatum;
7use vortex_vector::Datum;
8use vortex_vector::DecimalDatum;
9use vortex_vector::PrimitiveDatum;
10use vortex_vector::ScalarOps;
11use vortex_vector::TypedDatum;
12use vortex_vector::VectorMutOps;
13use vortex_vector::VectorOps;
14use vortex_vector::binaryview::BinaryType;
15use vortex_vector::binaryview::BinaryViewScalar;
16use vortex_vector::binaryview::BinaryViewType;
17use vortex_vector::binaryview::BinaryViewVector;
18use vortex_vector::binaryview::StringType;
19use vortex_vector::bool::BoolScalar;
20use vortex_vector::bool::BoolVector;
21use vortex_vector::decimal::DecimalScalar;
22use vortex_vector::decimal::DecimalVector;
23use vortex_vector::primitive::PrimitiveScalar;
24use vortex_vector::primitive::PrimitiveVector;
25
26use crate::comparison::Compare;
27
28impl<Op> Compare<Op> for Datum
29where
30    BoolDatum: Compare<Op, Output = BoolDatum>,
31    PrimitiveDatum: Compare<Op, Output = BoolDatum>,
32    DecimalDatum: Compare<Op, Output = BoolDatum>,
33    BinaryViewDatum<StringType>: Compare<Op, Output = BoolDatum>,
34    BinaryViewDatum<BinaryType>: Compare<Op, Output = BoolDatum>,
35{
36    type Output = BoolDatum;
37
38    fn compare(self, rhs: Self) -> Self::Output {
39        match (self.into_typed(), rhs.into_typed()) {
40            (TypedDatum::Bool(d1), TypedDatum::Bool(d2)) => d1.compare(d2),
41            (TypedDatum::Primitive(d1), TypedDatum::Primitive(d2)) => d1.compare(d2),
42            (TypedDatum::Decimal(d1), TypedDatum::Decimal(d2)) => d1.compare(d2),
43            (TypedDatum::String(d1), TypedDatum::String(d2)) => d1.compare(d2),
44            (TypedDatum::Binary(d1), TypedDatum::Binary(d2)) => d1.compare(d2),
45            _ => vortex_panic!("cannot compare different typed datums."),
46        }
47    }
48}
49
50impl<Op> Compare<Op> for BoolDatum
51where
52    BoolVector: Compare<Op, Output = BoolVector>,
53    BoolScalar: Compare<Op, Output = BoolScalar>,
54{
55    type Output = BoolDatum;
56
57    fn compare(self, rhs: Self) -> Self::Output {
58        match (self, rhs) {
59            (BoolDatum::Scalar(sc1), BoolDatum::Scalar(sc2)) => BoolDatum::Scalar(sc1.compare(sc2)),
60            (BoolDatum::Vector(vec), BoolDatum::Scalar(sc)) => {
61                let repeated: BoolVector = sc.repeat(vec.len()).into_bool().freeze();
62                BoolDatum::Vector(vec.compare(repeated))
63            }
64            (BoolDatum::Scalar(sc), BoolDatum::Vector(vec)) => {
65                let repeated: BoolVector = sc.repeat(vec.len()).into_bool().freeze();
66                BoolDatum::Vector(repeated.compare(vec))
67            }
68            (BoolDatum::Vector(vec1), BoolDatum::Vector(vec2)) => {
69                BoolDatum::Vector(vec1.compare(vec2))
70            }
71        }
72    }
73}
74
75impl<Op> Compare<Op> for PrimitiveDatum
76where
77    PrimitiveScalar: Compare<Op, Output = BoolScalar>,
78    PrimitiveVector: Compare<Op, Output = BoolVector>,
79{
80    type Output = BoolDatum;
81
82    fn compare(self, rhs: Self) -> Self::Output {
83        match (self, rhs) {
84            (PrimitiveDatum::Scalar(sc1), PrimitiveDatum::Scalar(sc2)) => {
85                BoolDatum::Scalar(sc1.compare(sc2))
86            }
87            (PrimitiveDatum::Vector(vec), PrimitiveDatum::Scalar(sc)) => {
88                let repeated: PrimitiveVector = sc.repeat(vec.len()).into_primitive().freeze();
89                BoolDatum::Vector(vec.compare(repeated))
90            }
91            (PrimitiveDatum::Scalar(sc), PrimitiveDatum::Vector(vec)) => {
92                let repeated: PrimitiveVector = sc.repeat(vec.len()).into_primitive().freeze();
93                BoolDatum::Vector(repeated.compare(vec))
94            }
95            (PrimitiveDatum::Vector(vec1), PrimitiveDatum::Vector(vec2)) => {
96                BoolDatum::Vector(vec1.compare(vec2))
97            }
98        }
99    }
100}
101
102impl<Op> Compare<Op> for DecimalDatum
103where
104    DecimalScalar: Compare<Op, Output = BoolScalar>,
105    DecimalVector: Compare<Op, Output = BoolVector>,
106{
107    type Output = BoolDatum;
108
109    fn compare(self, rhs: Self) -> Self::Output {
110        match (self, rhs) {
111            (DecimalDatum::Scalar(sc1), DecimalDatum::Scalar(sc2)) => {
112                BoolDatum::Scalar(sc1.compare(sc2))
113            }
114            (DecimalDatum::Vector(vec), DecimalDatum::Scalar(sc)) => {
115                let repeated = sc.repeat(vec.len()).into_decimal().freeze();
116                BoolDatum::Vector(vec.compare(repeated))
117            }
118            (DecimalDatum::Scalar(sc), DecimalDatum::Vector(vec)) => {
119                let repeated = sc.repeat(vec.len()).into_decimal().freeze();
120                BoolDatum::Vector(repeated.compare(vec))
121            }
122            (DecimalDatum::Vector(vec1), DecimalDatum::Vector(vec2)) => {
123                BoolDatum::Vector(vec1.compare(vec2))
124            }
125        }
126    }
127}
128
129impl<Op, T> Compare<Op> for BinaryViewDatum<T>
130where
131    T: BinaryViewType,
132    BinaryViewScalar<T>: Compare<Op, Output = BoolScalar>,
133    BinaryViewVector<T>: Compare<Op, Output = BoolVector>,
134{
135    type Output = BoolDatum;
136
137    fn compare(self, rhs: Self) -> Self::Output {
138        match (self, rhs) {
139            (BinaryViewDatum::Scalar(sc1), BinaryViewDatum::Scalar(sc2)) => {
140                BoolDatum::Scalar(sc1.compare(sc2))
141            }
142            (BinaryViewDatum::Vector(vec), BinaryViewDatum::Scalar(sc)) => {
143                let repeated = T::downcast(sc.repeat(vec.len())).freeze();
144                BoolDatum::Vector(vec.compare(repeated))
145            }
146            (BinaryViewDatum::Scalar(sc), BinaryViewDatum::Vector(vec)) => {
147                let repeated = T::downcast(sc.repeat(vec.len())).freeze();
148                BoolDatum::Vector(repeated.compare(vec))
149            }
150            (BinaryViewDatum::Vector(vec1), BinaryViewDatum::Vector(vec2)) => {
151                BoolDatum::Vector(vec1.compare(vec2))
152            }
153        }
154    }
155}