reifydb_core/value/column/buffer/
extend.rs1use std::mem;
5
6use reifydb_type::{Result, storage::DataBitVec, util::bitvec::BitVec};
7
8use crate::{
9 return_internal_error,
10 value::column::{ColumnBuffer, buffer::with_container},
11};
12
13impl ColumnBuffer {
14 pub fn extend(&mut self, other: ColumnBuffer) -> Result<()> {
15 match (&mut *self, other) {
16 (ColumnBuffer::Bool(l), ColumnBuffer::Bool(r)) => l.extend(&r)?,
18 (ColumnBuffer::Float4(l), ColumnBuffer::Float4(r)) => l.extend(&r)?,
19 (ColumnBuffer::Float8(l), ColumnBuffer::Float8(r)) => l.extend(&r)?,
20 (ColumnBuffer::Int1(l), ColumnBuffer::Int1(r)) => l.extend(&r)?,
21 (ColumnBuffer::Int2(l), ColumnBuffer::Int2(r)) => l.extend(&r)?,
22 (ColumnBuffer::Int4(l), ColumnBuffer::Int4(r)) => l.extend(&r)?,
23 (ColumnBuffer::Int8(l), ColumnBuffer::Int8(r)) => l.extend(&r)?,
24 (ColumnBuffer::Int16(l), ColumnBuffer::Int16(r)) => l.extend(&r)?,
25 (ColumnBuffer::Uint1(l), ColumnBuffer::Uint1(r)) => l.extend(&r)?,
26 (ColumnBuffer::Uint2(l), ColumnBuffer::Uint2(r)) => l.extend(&r)?,
27 (ColumnBuffer::Uint4(l), ColumnBuffer::Uint4(r)) => l.extend(&r)?,
28 (ColumnBuffer::Uint8(l), ColumnBuffer::Uint8(r)) => l.extend(&r)?,
29 (ColumnBuffer::Uint16(l), ColumnBuffer::Uint16(r)) => l.extend(&r)?,
30 (
31 ColumnBuffer::Utf8 {
32 container: l,
33 ..
34 },
35 ColumnBuffer::Utf8 {
36 container: r,
37 ..
38 },
39 ) => l.extend(&r)?,
40 (ColumnBuffer::Date(l), ColumnBuffer::Date(r)) => l.extend(&r)?,
41 (ColumnBuffer::DateTime(l), ColumnBuffer::DateTime(r)) => l.extend(&r)?,
42 (ColumnBuffer::Time(l), ColumnBuffer::Time(r)) => l.extend(&r)?,
43 (ColumnBuffer::Duration(l), ColumnBuffer::Duration(r)) => l.extend(&r)?,
44 (ColumnBuffer::IdentityId(l), ColumnBuffer::IdentityId(r)) => l.extend(&r)?,
45 (ColumnBuffer::Uuid4(l), ColumnBuffer::Uuid4(r)) => l.extend(&r)?,
46 (ColumnBuffer::Uuid7(l), ColumnBuffer::Uuid7(r)) => l.extend(&r)?,
47 (
48 ColumnBuffer::Blob {
49 container: l,
50 ..
51 },
52 ColumnBuffer::Blob {
53 container: r,
54 ..
55 },
56 ) => l.extend(&r)?,
57 (
58 ColumnBuffer::Int {
59 container: l,
60 ..
61 },
62 ColumnBuffer::Int {
63 container: r,
64 ..
65 },
66 ) => l.extend(&r)?,
67 (
68 ColumnBuffer::Uint {
69 container: l,
70 ..
71 },
72 ColumnBuffer::Uint {
73 container: r,
74 ..
75 },
76 ) => l.extend(&r)?,
77 (
78 ColumnBuffer::Decimal {
79 container: l,
80 ..
81 },
82 ColumnBuffer::Decimal {
83 container: r,
84 ..
85 },
86 ) => l.extend(&r)?,
87 (ColumnBuffer::DictionaryId(l), ColumnBuffer::DictionaryId(r)) => l.extend(&r)?,
88
89 (
91 ColumnBuffer::Option {
92 inner: l_inner,
93 bitvec: l_bitvec,
94 },
95 ColumnBuffer::Option {
96 inner: r_inner,
97 bitvec: r_bitvec,
98 },
99 ) => {
100 if l_inner.get_type() == r_inner.get_type() {
101 l_inner.extend(*r_inner)?;
103 } else if DataBitVec::count_ones(&r_bitvec) == 0 {
104 let r_len = r_inner.len();
106 with_container!(l_inner.as_mut(), |c| {
107 for _ in 0..r_len {
108 c.push_default();
109 }
110 });
111 } else if DataBitVec::count_ones(l_bitvec) == 0 {
112 let l_len = l_inner.len();
115 let r_type = r_inner.get_type();
116 let (mut new_inner, _) =
117 ColumnBuffer::none_typed(r_type, l_len).into_unwrap_option();
118 new_inner.extend(*r_inner)?;
119 **l_inner = new_inner;
120 } else {
121 return_internal_error!("column type mismatch in Option extend");
123 }
124 DataBitVec::extend_from(l_bitvec, &r_bitvec);
125 }
126
127 (
129 ColumnBuffer::Option {
130 inner,
131 bitvec,
132 },
133 other,
134 ) => {
135 let other_len = other.len();
136 if inner.get_type() != other.get_type() && DataBitVec::count_ones(bitvec) == 0 {
137 let l_len = inner.len();
139 let r_type = other.get_type();
140 let (mut new_inner, _) =
141 ColumnBuffer::none_typed(r_type, l_len).into_unwrap_option();
142 new_inner.extend(other)?;
143 **inner = new_inner;
144 } else {
145 inner.extend(other)?;
146 }
147 for _ in 0..other_len {
148 DataBitVec::push(bitvec, true);
149 }
150 }
151
152 (
154 _,
155 ColumnBuffer::Option {
156 inner: r_inner,
157 bitvec: r_bitvec,
158 },
159 ) => {
160 let l_len = self.len();
161 let r_len = r_inner.len();
162 let mut l_bitvec = BitVec::repeat(l_len, true);
163 DataBitVec::extend_from(&mut l_bitvec, &r_bitvec);
164 let inner = mem::replace(self, ColumnBuffer::bool(vec![]));
165 let mut boxed_inner = Box::new(inner);
166
167 if boxed_inner.get_type() != r_inner.get_type()
168 && DataBitVec::count_ones(&r_bitvec) == 0
169 {
170 with_container!(boxed_inner.as_mut(), |c| {
172 for _ in 0..r_len {
173 c.push_default();
174 }
175 });
176 } else {
177 boxed_inner.extend(*r_inner)?;
178 }
179
180 *self = ColumnBuffer::Option {
181 inner: boxed_inner,
182 bitvec: l_bitvec,
183 };
184 }
185
186 (_, _) => {
188 return_internal_error!("column type mismatch");
189 }
190 }
191
192 Ok(())
193 }
194}