@@ -104,12 +104,11 @@ impl ValueType {
104104 DataTypePb :: UINT => Ok ( ValueType :: UInt ) ,
105105 DataTypePb :: ULONG => Ok ( ValueType :: ULong ) ,
106106 DataTypePb :: DATE32 => Ok ( ValueType :: Date32 ) ,
107+ DataTypePb :: TIME32_MS => Ok ( ValueType :: Time32 ) ,
107108 DataTypePb :: TIMESTAMP_MS => Ok ( ValueType :: Timestamp ) ,
108109 DataTypePb :: FIXED_CHAR => Ok ( ValueType :: FixedChar ( 1 ) ) , // todo: fixed_length
109110 DataTypePb :: VAR_CHAR => Ok ( ValueType :: VarChar ( 255 ) ) , // todo: max_length
110111 _ => {
111- let msg = format ! ( "unsupported data type {:?}" , pb) ;
112- let err = gen_graph_err ! ( ErrorCode :: INVALID_DATA , msg, from_proto, pb) ;
113112 let msg = format ! ( "unsupported data type {:?}" , pb) ;
114113 let err = gen_graph_err ! ( ErrorCode :: INVALID_DATA , msg, from_proto, pb) ;
115114 Err ( err)
@@ -138,8 +137,8 @@ impl ValueType {
138137 ValueType :: Date32 => Ok ( DataTypePb :: DATE32 ) ,
139138 ValueType :: Time32 => Ok ( DataTypePb :: TIME32_MS ) ,
140139 ValueType :: Timestamp => Ok ( DataTypePb :: TIMESTAMP_MS ) ,
141- ValueType :: FixedChar ( fixed_length ) => Ok ( DataTypePb :: FIXED_CHAR ) ,
142- ValueType :: VarChar ( max_length ) => Ok ( DataTypePb :: VAR_CHAR ) ,
140+ ValueType :: FixedChar ( _fixed_length ) => Ok ( DataTypePb :: FIXED_CHAR ) ,
141+ ValueType :: VarChar ( _max_length ) => Ok ( DataTypePb :: VAR_CHAR ) ,
143142 }
144143 }
145144
@@ -250,12 +249,44 @@ impl<'a> ValueRef<'a> {
250249 . map_err ( |e| gen_graph_err ! ( ErrorCode :: INVALID_DATA , e. to_string( ) , get_str) )
251250 }
252251
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) )
257+ }
258+
259+ pub fn get_var_char ( & self ) -> GraphResult < & str > {
260+ let res = self . check_type_match ( ValueType :: VarChar ( 255 ) ) ;
261+ 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) )
264+ }
265+
253266 pub fn get_bytes ( & self ) -> GraphResult < & [ u8 ] > {
254267 let res = self . check_type_match ( ValueType :: Bytes ) ;
255268 res_unwrap ! ( res, get_str) ?;
256269 Ok ( self . data )
257270 }
258271
272+ pub fn get_date32 ( & self ) -> GraphResult < i32 > {
273+ let res = self . check_type_match ( ValueType :: Date32 ) ;
274+ res_unwrap ! ( res, get_date32) ?;
275+ Ok ( get_int ( self . data ) )
276+ }
277+
278+ pub fn get_time32 ( & self ) -> GraphResult < i32 > {
279+ let res = self . check_type_match ( ValueType :: Time32 ) ;
280+ res_unwrap ! ( res, get_time32) ?;
281+ Ok ( get_int ( self . data ) )
282+ }
283+
284+ pub fn get_timestamp ( & self ) -> GraphResult < i64 > {
285+ let res = self . check_type_match ( ValueType :: Timestamp ) ;
286+ res_unwrap ! ( res, get_timestamp) ?;
287+ Ok ( get_long ( self . data ) )
288+ }
289+
259290 pub fn get_int_list ( & self ) -> GraphResult < NumericArray < i32 > > {
260291 let res = self
261292 . check_type_match ( ValueType :: IntList )
@@ -332,17 +363,9 @@ impl<'a> ValueRef<'a> {
332363
333364 pub fn check_type_match ( & self , value_type : ValueType ) -> GraphResult < ( ) > {
334365 if self . r#type != value_type {
335- if ( self . r#type . eq ( & ValueType :: Date32 ) || self . r#type . eq ( & ValueType :: Time32 ) )
336- && value_type. eq ( & ValueType :: Int )
337- {
338- return Ok ( ( ) ) ;
339- } else if self . r#type . eq ( & ValueType :: Timestamp ) && value_type. eq ( & ValueType :: Long ) {
340- return Ok ( ( ) ) ;
341- } else {
342- let msg = format ! ( "cannot transform {:?} to {:?}" , self . r#type, value_type) ;
343- let err = gen_graph_err ! ( ErrorCode :: VALUE_TYPE_MISMATCH , msg, check_type_match, value_type) ;
344- return Err ( err) ;
345- }
366+ let msg = format ! ( "cannot transform {:?} to {:?}" , self . r#type, value_type) ;
367+ let err = gen_graph_err ! ( ErrorCode :: VALUE_TYPE_MISMATCH , msg, check_type_match, value_type) ;
368+ return Err ( err) ;
346369 }
347370 Ok ( ( ) )
348371 }
@@ -698,11 +721,21 @@ impl Value {
698721 Value :: new ( ValueType :: Int , data)
699722 }
700723
724+ pub fn uint ( v : u32 ) -> Self {
725+ let data = transform:: u32_to_vec ( v. to_be ( ) ) ;
726+ Value :: new ( ValueType :: UInt , data)
727+ }
728+
701729 pub fn long ( v : i64 ) -> Self {
702730 let data = transform:: i64_to_vec ( v. to_be ( ) ) ;
703731 Value :: new ( ValueType :: Long , data)
704732 }
705733
734+ pub fn ulong ( v : u64 ) -> Self {
735+ let data = transform:: u64_to_vec ( v. to_be ( ) ) ;
736+ Value :: new ( ValueType :: ULong , data)
737+ }
738+
706739 pub fn float ( v : f32 ) -> Self {
707740 let data = transform:: u32_to_vec ( v. to_bits ( ) . to_be ( ) ) ;
708741 Value :: new ( ValueType :: Float , data)
@@ -718,11 +751,48 @@ impl Value {
718751 Value :: new ( ValueType :: String , data)
719752 }
720753
754+ pub fn fixed_char ( v : & str , len : usize ) -> Self {
755+ let str = if v. len ( ) > len {
756+ // truncate the string
757+ & v[ ..len]
758+ } else {
759+ v
760+ } ;
761+ let data = str. as_bytes ( ) . to_vec ( ) ;
762+ Value :: new ( ValueType :: FixedChar ( len) , data)
763+ }
764+
765+ pub fn var_char ( v : & str , max_len : usize ) -> Self {
766+ let str = if v. len ( ) > max_len {
767+ // truncate the string
768+ & v[ ..max_len]
769+ } else {
770+ v
771+ } ;
772+ let data = str. as_bytes ( ) . to_vec ( ) ;
773+ Value :: new ( ValueType :: VarChar ( max_len) , data)
774+ }
775+
721776 pub fn bytes ( v : & [ u8 ] ) -> Self {
722777 let data = v. to_vec ( ) ;
723778 Value :: new ( ValueType :: Bytes , data)
724779 }
725780
781+ pub fn date32 ( v : i32 ) -> Self {
782+ let data = transform:: i32_to_vec ( v. to_be ( ) ) ;
783+ Value :: new ( ValueType :: Date32 , data)
784+ }
785+
786+ pub fn time32 ( v : i32 ) -> Self {
787+ let data = transform:: i32_to_vec ( v. to_be ( ) ) ;
788+ Value :: new ( ValueType :: Time32 , data)
789+ }
790+
791+ pub fn timestamp ( v : i64 ) -> Self {
792+ let data = transform:: i64_to_vec ( v. to_be ( ) ) ;
793+ Value :: new ( ValueType :: Timestamp , data)
794+ }
795+
726796 pub fn int_list ( v : & [ i32 ] ) -> Self {
727797 let data = gen_array ! ( v, i32 , write_i32) ;
728798 Value :: new ( ValueType :: IntList , data)
0 commit comments