@@ -60,6 +60,11 @@ cdef const bson_t* bson_reader_read_safe(bson_reader_t* stream_reader) except? N
6060 raise InvalidBSON(" Could not read BSON document stream" )
6161 return doc
6262
63+
64+ # Placeholder numbers for the date types.
65+ cdef uint8_t ARROW_TYPE_DATE32 = 100
66+ cdef uint8_t ARROW_TYPE_DATE64 = 101
67+
6368_builder_type_map = {
6469 BSON_TYPE_INT32: Int32Builder,
6570 BSON_TYPE_INT64: Int64Builder,
@@ -73,6 +78,8 @@ _builder_type_map = {
7378 BSON_TYPE_ARRAY: ListBuilder,
7479 BSON_TYPE_BINARY: BinaryBuilder,
7580 BSON_TYPE_CODE: CodeBuilder,
81+ ARROW_TYPE_DATE32: Date32Builder,
82+ ARROW_TYPE_DATE64: Date64Builder,
7683}
7784
7885_field_type_map = {
@@ -188,6 +195,8 @@ cdef void process_raw_bson_stream(const uint8_t * docstream, size_t length, obje
188195 cdef Decimal128Builder dec128_builder
189196 cdef ListBuilder list_builder
190197 cdef DocumentBuilder doc_builder
198+ cdef Date32Builder date32_builder
199+ cdef Date64Builder date64_builder
191200
192201 # Build up a map of the builders.
193202 for key, value in context.builder_map.items():
@@ -249,6 +258,10 @@ cdef void process_raw_bson_stream(const uint8_t * docstream, size_t length, obje
249258 bson_iter_binary (& doc_iter, & subtype,
250259 & val_buf_len, & val_buf)
251260 builder = BinaryBuilder(subtype)
261+ elif builder_type == Date32Builder:
262+ builder = Date32Builder()
263+ elif builder_type == Date64Builder:
264+ builder = Date64Builder()
252265 else :
253266 builder = builder_type()
254267 if arr_value_builder is None :
@@ -346,6 +359,18 @@ cdef void process_raw_bson_stream(const uint8_t * docstream, size_t length, obje
346359 double_builder.append_raw(bson_iter_as_double(& doc_iter))
347360 else :
348361 double_builder.append_null()
362+ elif ftype == ARROW_TYPE_DATE32:
363+ date32_builder = builder
364+ if value_t == BSON_TYPE_DATE_TIME:
365+ date32_builder.append_raw(bson_iter_date_time(& doc_iter))
366+ else :
367+ date32_builder.append_null()
368+ elif ftype == ARROW_TYPE_DATE64:
369+ date64_builder = builder
370+ if value_t == BSON_TYPE_DATE_TIME:
371+ date64_builder.append_raw(bson_iter_date_time(& doc_iter))
372+ else :
373+ date64_builder.append_null()
349374 elif ftype == BSON_TYPE_DATE_TIME:
350375 datetime_builder = builder
351376 if value_t == BSON_TYPE_DATE_TIME:
@@ -626,6 +651,78 @@ cdef class DatetimeBuilder(_ArrayBuilderBase):
626651 cdef shared_ptr[CTimestampBuilder] unwrap(self ):
627652 return self .builder
628653
654+ cdef class Date64Builder(_ArrayBuilderBase):
655+ cdef:
656+ shared_ptr[CDate64Builder] builder
657+ DataType dtype
658+
659+ def __cinit__ (self , MemoryPool memory_pool = None ):
660+ cdef CMemoryPool* pool = maybe_unbox_memory_pool(memory_pool)
661+ self .builder.reset(new CDate64Builder(pool))
662+ self .type_marker = ARROW_TYPE_DATE64
663+
664+ cdef append_raw(self , int64_t value):
665+ self .builder.get().Append(value)
666+
667+ cpdef append(self , value):
668+ self .builder.get().Append(value)
669+
670+ cpdef append_null(self ):
671+ self .builder.get().AppendNull()
672+
673+ def __len__ (self ):
674+ return self .builder.get().length()
675+
676+ @property
677+ def unit (self ):
678+ return self .dtype
679+
680+ cpdef finish(self ):
681+ cdef shared_ptr[CArray] out
682+ with nogil:
683+ self .builder.get().Finish(& out)
684+ return pyarrow_wrap_array(out)
685+
686+ cdef shared_ptr[CDate64Builder] unwrap(self ):
687+ return self .builder
688+
689+ cdef class Date32Builder(_ArrayBuilderBase):
690+ cdef:
691+ shared_ptr[CDate32Builder] builder
692+ DataType dtype
693+
694+ def __cinit__ (self , MemoryPool memory_pool = None ):
695+ cdef CMemoryPool* pool = maybe_unbox_memory_pool(memory_pool)
696+ self .builder.reset(new CDate32Builder(pool))
697+ self .type_marker = ARROW_TYPE_DATE32
698+
699+ cdef append_raw(self , int64_t value):
700+ # Convert from milliseconds to days (1000*60*60*24)
701+ cdef int32_t seconds_val = value // 86400000
702+ self .builder.get().Append(seconds_val)
703+
704+ cpdef append(self , value):
705+ self .builder.get().Append(value)
706+
707+ cpdef append_null(self ):
708+ self .builder.get().AppendNull()
709+
710+ def __len__ (self ):
711+ return self .builder.get().length()
712+
713+ @property
714+ def unit (self ):
715+ return self .dtype
716+
717+ cpdef finish(self ):
718+ cdef shared_ptr[CArray] out
719+ with nogil:
720+ self .builder.get().Finish(& out)
721+ return pyarrow_wrap_array(out)
722+
723+ cdef shared_ptr[CDate32Builder] unwrap(self ):
724+ return self .builder
725+
629726
630727cdef class BoolBuilder(_ArrayBuilderBase):
631728 cdef:
0 commit comments