vortex_compute/comparison/
datum.rs1use 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}