@@ -26,10 +26,12 @@ use common_time::Timestamp;
26
26
use datatypes:: arrow;
27
27
use datatypes:: arrow:: array:: ArrayRef ;
28
28
use datatypes:: data_type:: { ConcreteDataType , DataType } ;
29
- use datatypes:: prelude:: { MutableVector , ScalarVectorBuilder , Vector , VectorRef } ;
29
+ use datatypes:: prelude:: { MutableVector , Vector , VectorRef } ;
30
+ use datatypes:: types:: TimestampType ;
30
31
use datatypes:: value:: { Value , ValueRef } ;
31
32
use datatypes:: vectors:: {
32
- Helper , UInt64Vector , UInt64VectorBuilder , UInt8Vector , UInt8VectorBuilder ,
33
+ Helper , TimestampMicrosecondVector , TimestampMillisecondVector , TimestampNanosecondVector ,
34
+ TimestampSecondVector , UInt64Vector , UInt8Vector ,
33
35
} ;
34
36
use snafu:: { ensure, ResultExt } ;
35
37
use store_api:: metadata:: RegionMetadataRef ;
@@ -691,22 +693,23 @@ impl Series {
691
693
692
694
/// `ValueBuilder` holds all the vector builders for field columns.
693
695
struct ValueBuilder {
694
- timestamp : Box < dyn MutableVector > ,
695
- sequence : UInt64VectorBuilder ,
696
- op_type : UInt8VectorBuilder ,
696
+ timestamp : Vec < i64 > ,
697
+ timestamp_type : ConcreteDataType ,
698
+ sequence : Vec < u64 > ,
699
+ op_type : Vec < u8 > ,
697
700
fields : Vec < Option < Box < dyn MutableVector > > > ,
698
701
field_types : Vec < ConcreteDataType > ,
699
702
}
700
703
701
704
impl ValueBuilder {
702
705
fn new ( region_metadata : & RegionMetadataRef , capacity : usize ) -> Self {
703
- let timestamp = region_metadata
706
+ let timestamp_type = region_metadata
704
707
. time_index_column ( )
705
708
. column_schema
706
709
. data_type
707
- . create_mutable_vector ( capacity ) ;
708
- let sequence = UInt64VectorBuilder :: with_capacity ( capacity) ;
709
- let op_type = UInt8VectorBuilder :: with_capacity ( capacity) ;
710
+ . clone ( ) ;
711
+ let sequence = Vec :: with_capacity ( capacity) ;
712
+ let op_type = Vec :: with_capacity ( capacity) ;
710
713
711
714
let field_types = region_metadata
712
715
. field_columns ( )
@@ -715,7 +718,8 @@ impl ValueBuilder {
715
718
let fields = ( 0 ..field_types. len ( ) ) . map ( |_| None ) . collect ( ) ;
716
719
717
720
Self {
718
- timestamp,
721
+ timestamp : Vec :: with_capacity ( capacity) ,
722
+ timestamp_type,
719
723
sequence,
720
724
op_type,
721
725
fields,
@@ -727,9 +731,10 @@ impl ValueBuilder {
727
731
/// We don't need primary keys since they've already be encoded.
728
732
fn push ( & mut self , ts : ValueRef , sequence : u64 , op_type : u8 , fields : Vec < ValueRef > ) {
729
733
debug_assert_eq ! ( fields. len( ) , self . fields. len( ) ) ;
730
- self . timestamp . push_value_ref ( ts) ;
731
- self . sequence . push_value_ref ( ValueRef :: UInt64 ( sequence) ) ;
732
- self . op_type . push_value_ref ( ValueRef :: UInt8 ( op_type) ) ;
734
+ self . timestamp
735
+ . push ( ts. as_timestamp ( ) . unwrap ( ) . unwrap ( ) . value ( ) ) ;
736
+ self . sequence . push ( sequence) ;
737
+ self . op_type . push ( op_type) ;
733
738
let num_rows = self . timestamp . len ( ) ;
734
739
for ( idx, field_value) in fields. into_iter ( ) . enumerate ( ) {
735
740
if !field_value. is_null ( ) || self . fields [ idx] . is_some ( ) {
@@ -844,9 +849,23 @@ impl From<ValueBuilder> for Values {
844
849
}
845
850
} )
846
851
. collect :: < Vec < _ > > ( ) ;
847
- let sequence = Arc :: new ( value. sequence . finish ( ) ) ;
848
- let op_type = Arc :: new ( value. op_type . finish ( ) ) ;
849
- let timestamp = value. timestamp . to_vector ( ) ;
852
+ let sequence = Arc :: new ( UInt64Vector :: from_vec ( value. sequence ) ) ;
853
+ let op_type = Arc :: new ( UInt8Vector :: from_vec ( value. op_type ) ) ;
854
+ let timestamp: VectorRef = match value. timestamp_type {
855
+ ConcreteDataType :: Timestamp ( TimestampType :: Second ( _) ) => {
856
+ Arc :: new ( TimestampSecondVector :: from_vec ( value. timestamp ) )
857
+ }
858
+ ConcreteDataType :: Timestamp ( TimestampType :: Millisecond ( _) ) => {
859
+ Arc :: new ( TimestampMillisecondVector :: from_vec ( value. timestamp ) )
860
+ }
861
+ ConcreteDataType :: Timestamp ( TimestampType :: Microsecond ( _) ) => {
862
+ Arc :: new ( TimestampMicrosecondVector :: from_vec ( value. timestamp ) )
863
+ }
864
+ ConcreteDataType :: Timestamp ( TimestampType :: Nanosecond ( _) ) => {
865
+ Arc :: new ( TimestampNanosecondVector :: from_vec ( value. timestamp ) )
866
+ }
867
+ _ => unreachable ! ( ) ,
868
+ } ;
850
869
851
870
if cfg ! ( debug_assertions) {
852
871
debug_assert_eq ! ( timestamp. len( ) , sequence. len( ) ) ;
0 commit comments