Skip to content

Commit 914b66c

Browse files
committed
refine var_char and fixed_char
Committed-by: bingqing.lbq from Dev container
1 parent 0d36376 commit 914b66c

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

interactive_engine/executor/store/groot/src/db/api/property.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ impl ValueType {
106106
DataTypePb::DATE32 => Ok(ValueType::Date32),
107107
DataTypePb::TIME32_MS => Ok(ValueType::Time32),
108108
DataTypePb::TIMESTAMP_MS => Ok(ValueType::Timestamp),
109-
DataTypePb::FIXED_CHAR => Ok(ValueType::FixedChar(1)), // todo: fixed_length
110-
DataTypePb::VAR_CHAR => Ok(ValueType::VarChar(255)), // todo: max_length
109+
DataTypePb::FIXED_CHAR => Ok(ValueType::FixedChar(1)), // todo: add fixed_length in pb
110+
DataTypePb::VAR_CHAR => Ok(ValueType::VarChar(255)), // todo: add max_length in pb
111111
_ => {
112112
let msg = format!("unsupported data type {:?}", pb);
113113
let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, from_proto, pb);
@@ -249,18 +249,36 @@ impl<'a> ValueRef<'a> {
249249
.map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_str))
250250
}
251251

252-
pub fn get_fixed_char(&self) -> GraphResult<&str> {
253-
let res = self.check_type_match(ValueType::FixedChar(1));
254-
res_unwrap!(res, get_fixed_char)?;
255-
::std::str::from_utf8(self.data)
256-
.map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_fixed_char))
252+
pub fn get_fixed_char(&self, fixed_length: usize) -> GraphResult<String> {
253+
let res = self.check_type_match(ValueType::FixedChar(fixed_length));
254+
res_unwrap!(res, get_var_char)?;
255+
let str = ::std::str::from_utf8(self.data)
256+
.map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_fixed_char))?;
257+
// confirm the length
258+
if str.len() > fixed_length {
259+
// truncate
260+
Ok(str[..fixed_length].to_string())
261+
} else if str.len() < fixed_length {
262+
// pad with space
263+
let mut buf = vec![b' '; fixed_length];
264+
buf[..str.len()].copy_from_slice(str.as_bytes());
265+
Ok(::std::str::from_utf8(&buf).unwrap().to_string())
266+
} else {
267+
Ok(str.to_string())
268+
}
257269
}
258270

259-
pub fn get_var_char(&self) -> GraphResult<&str> {
260-
let res = self.check_type_match(ValueType::VarChar(255));
271+
pub fn get_var_char(&self, max_length: usize) -> GraphResult<&str> {
272+
let res = self.check_type_match(ValueType::VarChar(max_length));
261273
res_unwrap!(res, get_var_char)?;
262-
::std::str::from_utf8(self.data)
263-
.map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_var_char))
274+
let str = ::std::str::from_utf8(self.data)
275+
.map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_var_char))?;
276+
if str.len() > max_length {
277+
// truncate
278+
Ok(&str[..max_length])
279+
} else {
280+
Ok(str)
281+
}
264282
}
265283

266284
pub fn get_bytes(&self) -> GraphResult<&[u8]> {

interactive_engine/executor/store/groot/src/db/api/types.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ pub enum PropertyValue {
6464

6565
#[derive(Clone, Debug, PartialEq)]
6666
pub struct FixedCharValue {
67-
value: Vec<char>,
67+
value: String,
6868
fixed_length: usize,
6969
}
7070

7171
#[derive(Clone, Debug, PartialEq)]
7272
pub struct VarCharValue {
73-
value: Vec<char>,
73+
value: String,
7474
max_length: usize,
7575
}
7676

@@ -128,19 +128,11 @@ impl From<ValueRef<'_>> for PropertyValue {
128128
ValueType::Time32 => PropertyValue::Time32(value_ref.get_time32().unwrap()),
129129
ValueType::Timestamp => PropertyValue::Timestamp(value_ref.get_timestamp().unwrap()),
130130
ValueType::FixedChar(fixed) => PropertyValue::FixedChar(FixedCharValue {
131-
value: value_ref
132-
.get_fixed_char()
133-
.unwrap()
134-
.chars()
135-
.collect(),
131+
value: value_ref.get_fixed_char(*fixed).unwrap(),
136132
fixed_length: *fixed,
137133
}),
138134
ValueType::VarChar(max) => PropertyValue::VarChar(VarCharValue {
139-
value: value_ref
140-
.get_var_char()
141-
.unwrap()
142-
.chars()
143-
.collect(),
135+
value: String::from(value_ref.get_var_char(*max).unwrap()),
144136
max_length: *max,
145137
}),
146138
}

0 commit comments

Comments
 (0)