@@ -60,6 +60,11 @@ cdef const bson_t* bson_reader_read_safe(bson_reader_t* stream_reader) except? N
60
60
raise InvalidBSON(" Could not read BSON document stream" )
61
61
return doc
62
62
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
+
63
68
_builder_type_map = {
64
69
BSON_TYPE_INT32: Int32Builder,
65
70
BSON_TYPE_INT64: Int64Builder,
@@ -73,6 +78,8 @@ _builder_type_map = {
73
78
BSON_TYPE_ARRAY: ListBuilder,
74
79
BSON_TYPE_BINARY: BinaryBuilder,
75
80
BSON_TYPE_CODE: CodeBuilder,
81
+ ARROW_TYPE_DATE32: Date32Builder,
82
+ ARROW_TYPE_DATE64: Date64Builder,
76
83
}
77
84
78
85
_field_type_map = {
@@ -188,6 +195,8 @@ cdef void process_raw_bson_stream(const uint8_t * docstream, size_t length, obje
188
195
cdef Decimal128Builder dec128_builder
189
196
cdef ListBuilder list_builder
190
197
cdef DocumentBuilder doc_builder
198
+ cdef Date32Builder date32_builder
199
+ cdef Date64Builder date64_builder
191
200
192
201
# Build up a map of the builders.
193
202
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
249
258
bson_iter_binary (& doc_iter, & subtype,
250
259
& val_buf_len, & val_buf)
251
260
builder = BinaryBuilder(subtype)
261
+ elif builder_type == Date32Builder:
262
+ builder = Date32Builder()
263
+ elif builder_type == Date64Builder:
264
+ builder = Date64Builder()
252
265
else :
253
266
builder = builder_type()
254
267
if arr_value_builder is None :
@@ -346,6 +359,18 @@ cdef void process_raw_bson_stream(const uint8_t * docstream, size_t length, obje
346
359
double_builder.append_raw(bson_iter_as_double(& doc_iter))
347
360
else :
348
361
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()
349
374
elif ftype == BSON_TYPE_DATE_TIME:
350
375
datetime_builder = builder
351
376
if value_t == BSON_TYPE_DATE_TIME:
@@ -626,6 +651,78 @@ cdef class DatetimeBuilder(_ArrayBuilderBase):
626
651
cdef shared_ptr[CTimestampBuilder] unwrap(self ):
627
652
return self .builder
628
653
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
+
629
726
630
727
cdef class BoolBuilder(_ArrayBuilderBase):
631
728
cdef:
0 commit comments