Skip to content

Commit 38e4509

Browse files
committed
feat: Support function extract_scalar_key_values and to_value
1 parent 4662a2c commit 38e4509

File tree

19 files changed

+2062
-393
lines changed

19 files changed

+2062
-393
lines changed

src/constants.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,22 @@ pub(crate) const TYPE_DATE: &str = "DATE";
4848
pub(crate) const TYPE_TIMESTAMP: &str = "TIMESTAMP";
4949
pub(crate) const TYPE_TIMESTAMP_TZ: &str = "TIMESTAMP_TZ";
5050
pub(crate) const TYPE_INTERVAL: &str = "INTERVAL";
51+
52+
pub(crate) const MAX_DECIMAL64_PRECISION: usize = 18;
53+
pub(crate) const MAX_DECIMAL128_PRECISION: usize = 38;
54+
pub(crate) const MAX_DECIMAL256_PRECISION: usize = 76;
55+
56+
pub(crate) const UINT64_MIN: i128 = 0i128;
57+
pub(crate) const UINT64_MAX: i128 = 18_446_744_073_709_551_615i128;
58+
pub(crate) const INT64_MIN: i128 = -9_223_372_036_854_775_808i128;
59+
pub(crate) const INT64_MAX: i128 = 9_223_372_036_854_775_807i128;
60+
pub(crate) const DECIMAL64_MIN: i128 = -999_999_999_999_999_999i128;
61+
pub(crate) const DECIMAL64_MAX: i128 = 999_999_999_999_999_999i128;
62+
pub(crate) const DECIMAL128_MIN: i128 = -99_999_999_999_999_999_999_999_999_999_999_999_999i128;
63+
pub(crate) const DECIMAL128_MAX: i128 = 99_999_999_999_999_999_999_999_999_999_999_999_999i128;
64+
65+
pub(crate) const NUMBER_STRUCT_TOKEN: &str = "$jsonb::private::Number";
66+
pub(crate) const NUMBER_STRUCT_FIELD_SCALE: &str = "$jsonb::private::Number::Scale";
67+
pub(crate) const NUMBER_STRUCT_FIELD_VALUE: &str = "$jsonb::private::Number::Value";
68+
pub(crate) const NUMBER_STRUCT_FIELD_HIGH_VALUE: &str = "$jsonb::private::Number::High_Value";
69+
pub(crate) const NUMBER_STRUCT_FIELD_LOW_VALUE: &str = "$jsonb::private::Number::Low_Value";

src/core/databend/builder.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ use byteorder::WriteBytesExt;
2020

2121
use super::constants::*;
2222
use super::jentry::JEntry;
23+
use crate::core::ExtensionItem;
2324
use crate::core::JsonbItem;
25+
use crate::core::NumberItem;
2426
use crate::error::Error;
2527
use crate::error::Result;
2628
use crate::OwnedJsonb;
@@ -189,21 +191,35 @@ fn append_jsonb_item(buf: &mut Vec<u8>, jentry_index: &mut usize, item: JsonbIte
189191
};
190192
replace_jentry(buf, jentry, jentry_index);
191193
}
192-
JsonbItem::Number(data) => {
193-
let jentry = JEntry::make_number_jentry(data.len());
194-
replace_jentry(buf, jentry, jentry_index);
195-
buf.extend_from_slice(data);
196-
}
194+
JsonbItem::Number(num) => match num {
195+
NumberItem::Raw(data) => {
196+
let jentry = JEntry::make_number_jentry(data.len());
197+
replace_jentry(buf, jentry, jentry_index);
198+
buf.extend_from_slice(data);
199+
}
200+
NumberItem::Number(num) => {
201+
let len = num.compact_encode(&mut *buf)?;
202+
let jentry = JEntry::make_number_jentry(len);
203+
replace_jentry(buf, jentry, jentry_index);
204+
}
205+
},
197206
JsonbItem::String(data) => {
198207
let jentry = JEntry::make_string_jentry(data.len());
199208
replace_jentry(buf, jentry, jentry_index);
200-
buf.extend_from_slice(data);
201-
}
202-
JsonbItem::Extension(data) => {
203-
let jentry = JEntry::make_extension_jentry(data.len());
204-
replace_jentry(buf, jentry, jentry_index);
205-
buf.extend_from_slice(data);
209+
buf.extend_from_slice(data.as_bytes());
206210
}
211+
JsonbItem::Extension(ext) => match ext {
212+
ExtensionItem::Raw(data) => {
213+
let jentry = JEntry::make_extension_jentry(data.len());
214+
replace_jentry(buf, jentry, jentry_index);
215+
buf.extend_from_slice(data);
216+
}
217+
ExtensionItem::Extension(ext) => {
218+
let len = ext.compact_encode(&mut *buf)?;
219+
let jentry = JEntry::make_extension_jentry(len);
220+
replace_jentry(buf, jentry, jentry_index);
221+
}
222+
},
207223
JsonbItem::Raw(raw_jsonb) => {
208224
append_raw_jsonb_data(buf, jentry_index, raw_jsonb)?;
209225
}

src/core/databend/de.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl<'de> Deserializer<'de> {
6767
self.index == self.raw.len()
6868
}
6969

70-
fn read_header(&mut self) -> Result<(u32, u32)> {
70+
fn read_header(&mut self) -> Result<(u32, usize)> {
7171
let header = self.raw.read_header(self.index)?;
7272
self.index += 4;
7373
Ok(header)
@@ -377,12 +377,11 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
377377
}
378378
}
379379
ARRAY_CONTAINER_TAG => {
380-
let jentries = self.read_array_jentries(header_len as usize)?;
380+
let jentries = self.read_array_jentries(header_len)?;
381381
visitor.visit_seq(ArrayDeserializer::new(self, jentries))
382382
}
383383
OBJECT_CONTAINER_TAG => {
384-
let (key_jentries, value_jentries) =
385-
self.read_object_jentries(header_len as usize)?;
384+
let (key_jentries, value_jentries) = self.read_object_jentries(header_len)?;
386385

387386
let origin_index = self.index;
388387
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
@@ -564,7 +563,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
564563
let (header_type, header_len) = self.read_header()?;
565564
match header_type {
566565
ARRAY_CONTAINER_TAG => {
567-
let jentries = self.read_array_jentries(header_len as usize)?;
566+
let jentries = self.read_array_jentries(header_len)?;
568567
visitor.visit_seq(ArrayDeserializer::new(self, jentries))
569568
}
570569
SCALAR_CONTAINER_TAG | OBJECT_CONTAINER_TAG => Err(Error::UnexpectedType),
@@ -598,8 +597,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
598597
let (header_type, header_len) = self.read_header()?;
599598
match header_type {
600599
OBJECT_CONTAINER_TAG => {
601-
let (key_jentries, value_jentries) =
602-
self.read_object_jentries(header_len as usize)?;
600+
let (key_jentries, value_jentries) = self.read_object_jentries(header_len)?;
603601

604602
let origin_index = self.index;
605603
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
@@ -861,7 +859,7 @@ impl<'de> de::VariantAccess<'de> for EnumDeserializer<'_, 'de> {
861859
let (header_type, header_len) = self.de.read_header()?;
862860
match header_type {
863861
ARRAY_CONTAINER_TAG => {
864-
let jentries = self.de.read_array_jentries(header_len as usize)?;
862+
let jentries = self.de.read_array_jentries(header_len)?;
865863
visitor.visit_seq(ArrayDeserializer::new(self.de, jentries))
866864
}
867865
SCALAR_CONTAINER_TAG | OBJECT_CONTAINER_TAG => Err(Error::UnexpectedType),
@@ -883,7 +881,7 @@ impl<'de> de::VariantAccess<'de> for EnumDeserializer<'_, 'de> {
883881
match header_type {
884882
OBJECT_CONTAINER_TAG => {
885883
let (key_jentries, value_jentries) =
886-
self.de.read_object_jentries(header_len as usize)?;
884+
self.de.read_object_jentries(header_len)?;
887885

888886
let origin_index = self.de.index;
889887
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();

src/core/databend/iterator.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ impl<'a> ArrayIterator<'a> {
3535
let (header_type, header_len) = raw_jsonb.read_header(0)?;
3636
if header_type == ARRAY_CONTAINER_TAG {
3737
let jentry_offset = 4;
38-
let item_offset = 4 + 4 * header_len as usize;
38+
let item_offset = 4 + 4 * header_len;
3939
Ok(Some(Self {
4040
raw_jsonb,
4141
jentry_offset,
4242
item_offset,
43-
length: header_len as usize,
43+
length: header_len,
4444
index: 0,
4545
}))
4646
} else {
@@ -97,12 +97,12 @@ impl<'a> ObjectKeyIterator<'a> {
9797
let (header_type, header_len) = raw_jsonb.read_header(0)?;
9898
if header_type == OBJECT_CONTAINER_TAG {
9999
let jentry_offset = 4;
100-
let item_offset = 4 + 8 * header_len as usize;
100+
let item_offset = 4 + 8 * header_len;
101101
Ok(Some(Self {
102102
raw_jsonb,
103103
jentry_offset,
104104
item_offset,
105-
length: header_len as usize,
105+
length: header_len,
106106
index: 0,
107107
}))
108108
} else {
@@ -159,7 +159,7 @@ impl<'a> ObjectValueIterator<'a> {
159159
let (header_type, header_len) = raw_jsonb.read_header(0)?;
160160
if header_type == OBJECT_CONTAINER_TAG {
161161
let mut jentry_offset = 4;
162-
let mut item_offset = 4 + 8 * header_len as usize;
162+
let mut item_offset = 4 + 8 * header_len;
163163
for _ in 0..header_len {
164164
let key_jentry = raw_jsonb.read_jentry(jentry_offset)?;
165165
jentry_offset += 4;
@@ -170,7 +170,7 @@ impl<'a> ObjectValueIterator<'a> {
170170
raw_jsonb,
171171
jentry_offset,
172172
item_offset,
173-
length: header_len as usize,
173+
length: header_len,
174174
index: 0,
175175
}))
176176
} else {
@@ -229,14 +229,14 @@ impl<'a> ObjectIterator<'a> {
229229
let (header_type, header_len) = raw_jsonb.read_header(0)?;
230230
if header_type == OBJECT_CONTAINER_TAG {
231231
let mut jentry_offset = 4;
232-
let mut key_jentries = VecDeque::with_capacity(header_len as usize);
232+
let mut key_jentries = VecDeque::with_capacity(header_len);
233233
for _ in 0..header_len {
234234
let key_jentry = raw_jsonb.read_jentry(jentry_offset)?;
235235
jentry_offset += 4;
236236
key_jentries.push_back(key_jentry);
237237
}
238238
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
239-
let key_offset = 4 + 8 * header_len as usize;
239+
let key_offset = 4 + 8 * header_len;
240240
let val_offset = key_offset + key_length;
241241

242242
Ok(Some(Self {
@@ -245,7 +245,7 @@ impl<'a> ObjectIterator<'a> {
245245
jentry_offset,
246246
key_offset,
247247
val_offset,
248-
length: header_len as usize,
248+
length: header_len,
249249
}))
250250
} else {
251251
Ok(None)

0 commit comments

Comments
 (0)