@@ -154,40 +154,43 @@ class DictionaryBuilderBase : public ArrayBuilder {
154154 const std::shared_ptr<DataType>&>
155155 value_type,
156156 MemoryPool* pool = default_memory_pool(),
157- int64_t alignment = kDefaultBufferAlignment )
157+ int64_t alignment = kDefaultBufferAlignment , bool ordered = false )
158158 : ArrayBuilder(pool, alignment),
159159 memo_table_ (new internal::DictionaryMemoTable(pool, value_type)),
160160 delta_offset_(0 ),
161161 byte_width_(-1 ),
162162 indices_builder_(start_int_size, pool, alignment),
163- value_type_(value_type) {}
163+ value_type_(value_type),
164+ ordered_(ordered) {}
164165
165166 template <typename T1 = T>
166167 explicit DictionaryBuilderBase (
167168 enable_if_t <!is_fixed_size_binary_type<T1 >::value, const std::shared_ptr<DataType>&>
168169 value_type,
169170 MemoryPool* pool = default_memory_pool(),
170- int64_t alignment = kDefaultBufferAlignment)
171+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false )
171172 : ArrayBuilder(pool, alignment),
172173 memo_table_(new internal::DictionaryMemoTable(pool, value_type)),
173174 delta_offset_(0 ),
174175 byte_width_(-1 ),
175176 indices_builder_(pool, alignment),
176- value_type_(value_type) {}
177+ value_type_(value_type),
178+ ordered_(ordered) {}
177179
178180 template <typename T1 = T>
179181 explicit DictionaryBuilderBase (
180182 const std::shared_ptr<DataType>& index_type,
181183 enable_if_t <!is_fixed_size_binary_type<T1 >::value, const std::shared_ptr<DataType>&>
182184 value_type,
183185 MemoryPool* pool = default_memory_pool(),
184- int64_t alignment = kDefaultBufferAlignment)
186+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false )
185187 : ArrayBuilder(pool, alignment),
186188 memo_table_(new internal::DictionaryMemoTable(pool, value_type)),
187189 delta_offset_(0 ),
188190 byte_width_(-1 ),
189191 indices_builder_(index_type, pool, alignment),
190- value_type_(value_type) {}
192+ value_type_(value_type),
193+ ordered_(ordered) {}
191194
192195 template <typename B = BuilderType, typename T1 = T>
193196 DictionaryBuilderBase (uint8_t start_int_size,
@@ -196,38 +199,41 @@ class DictionaryBuilderBase : public ArrayBuilder {
196199 const std::shared_ptr<DataType>&>
197200 value_type,
198201 MemoryPool* pool = default_memory_pool(),
199- int64_t alignment = kDefaultBufferAlignment)
202+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false )
200203 : ArrayBuilder(pool, alignment),
201204 memo_table_(new internal::DictionaryMemoTable(pool, value_type)),
202205 delta_offset_(0 ),
203206 byte_width_(static_cast <const T1 &>(*value_type).byte_width()),
204207 indices_builder_(start_int_size, pool, alignment),
205- value_type_(value_type) {}
208+ value_type_(value_type),
209+ ordered_(ordered) {}
206210
207211 template <typename T1 = T>
208212 explicit DictionaryBuilderBase (
209213 enable_if_fixed_size_binary<T1 , const std::shared_ptr<DataType>&> value_type,
210214 MemoryPool* pool = default_memory_pool(),
211- int64_t alignment = kDefaultBufferAlignment)
215+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false )
212216 : ArrayBuilder(pool, alignment),
213217 memo_table_(new internal::DictionaryMemoTable(pool, value_type)),
214218 delta_offset_(0 ),
215219 byte_width_(static_cast <const T1 &>(*value_type).byte_width()),
216220 indices_builder_(pool, alignment),
217- value_type_(value_type) {}
221+ value_type_(value_type),
222+ ordered_(ordered) {}
218223
219224 template <typename T1 = T>
220225 explicit DictionaryBuilderBase (
221226 const std::shared_ptr<DataType>& index_type,
222227 enable_if_fixed_size_binary<T1 , const std::shared_ptr<DataType>&> value_type,
223228 MemoryPool* pool = default_memory_pool(),
224- int64_t alignment = kDefaultBufferAlignment)
229+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false )
225230 : ArrayBuilder(pool, alignment),
226231 memo_table_(new internal::DictionaryMemoTable(pool, value_type)),
227232 delta_offset_(0 ),
228233 byte_width_(static_cast <const T1 &>(*value_type).byte_width()),
229234 indices_builder_(index_type, pool, alignment),
230- value_type_(value_type) {}
235+ value_type_(value_type),
236+ ordered_(ordered) {}
231237
232238 template <typename T1 = T>
233239 explicit DictionaryBuilderBase (
@@ -237,13 +243,15 @@ class DictionaryBuilderBase : public ArrayBuilder {
237243 // This constructor doesn't check for errors. Use InsertMemoValues instead.
238244 explicit DictionaryBuilderBase (const std::shared_ptr<Array>& dictionary,
239245 MemoryPool* pool = default_memory_pool(),
240- int64_t alignment = kDefaultBufferAlignment)
246+ int64_t alignment = kDefaultBufferAlignment,
247+ bool ordered = false)
241248 : ArrayBuilder(pool, alignment),
242249 memo_table_(new internal::DictionaryMemoTable(pool, dictionary)),
243250 delta_offset_(0 ),
244251 byte_width_(-1 ),
245252 indices_builder_(pool, alignment),
246- value_type_(dictionary->type ()) {}
253+ value_type_(dictionary->type ()),
254+ ordered_(ordered) {}
247255
248256 ~DictionaryBuilderBase () override = default ;
249257
@@ -490,7 +498,7 @@ class DictionaryBuilderBase : public ArrayBuilder {
490498 Status Finish (std::shared_ptr<DictionaryArray>* out) { return FinishTyped (out); }
491499
492500 std::shared_ptr<DataType> type () const override {
493- return ::arrow::dictionary (indices_builder_.type (), value_type_);
501+ return ::arrow::dictionary (indices_builder_.type (), value_type_, ordered_ );
494502 }
495503
496504 protected:
@@ -561,6 +569,7 @@ class DictionaryBuilderBase : public ArrayBuilder {
561569
562570 BuilderType indices_builder_;
563571 std::shared_ptr<DataType> value_type_;
572+ bool ordered_ = false ;
564573};
565574
566575template <typename BuilderType>
@@ -571,31 +580,53 @@ class DictionaryBuilderBase<BuilderType, NullType> : public ArrayBuilder {
571580 enable_if_t <std::is_base_of<AdaptiveIntBuilderBase, B>::value, uint8_t >
572581 start_int_size,
573582 const std::shared_ptr<DataType>& value_type,
574- MemoryPool* pool = default_memory_pool())
575- : ArrayBuilder(pool), indices_builder_(start_int_size, pool) {}
583+ MemoryPool* pool = default_memory_pool(),
584+ int64_t alignment = kDefaultBufferAlignment , bool ordered = false )
585+ : ArrayBuilder(pool, alignment),
586+ indices_builder_ (start_int_size, pool, alignment),
587+ ordered_(ordered) {}
576588
577589 explicit DictionaryBuilderBase (const std::shared_ptr<DataType>& value_type,
578- MemoryPool* pool = default_memory_pool())
579- : ArrayBuilder(pool), indices_builder_(pool) {}
590+ MemoryPool* pool = default_memory_pool(),
591+ int64_t alignment = kDefaultBufferAlignment,
592+ bool ordered = false)
593+ : ArrayBuilder(pool, alignment),
594+ indices_builder_(pool, alignment),
595+ ordered_(ordered) {}
580596
581597 explicit DictionaryBuilderBase (const std::shared_ptr<DataType>& index_type,
582598 const std::shared_ptr<DataType>& value_type,
583- MemoryPool* pool = default_memory_pool())
584- : ArrayBuilder(pool), indices_builder_(index_type, pool) {}
599+ MemoryPool* pool = default_memory_pool(),
600+ int64_t alignment = kDefaultBufferAlignment,
601+ bool ordered = false)
602+ : ArrayBuilder(pool, alignment),
603+ indices_builder_(index_type, pool, alignment),
604+ ordered_(ordered) {}
585605
586606 template <typename B = BuilderType>
587607 explicit DictionaryBuilderBase (
588608 enable_if_t <std::is_base_of<AdaptiveIntBuilderBase, B>::value, uint8_t >
589609 start_int_size,
590- MemoryPool* pool = default_memory_pool())
591- : ArrayBuilder(pool), indices_builder_(start_int_size, pool) {}
610+ MemoryPool* pool = default_memory_pool(),
611+ int64_t alignment = kDefaultBufferAlignment, bool ordered = false)
612+ : ArrayBuilder(pool, alignment),
613+ indices_builder_(start_int_size, pool, alignment),
614+ ordered_(ordered) {}
592615
593- explicit DictionaryBuilderBase (MemoryPool* pool = default_memory_pool())
594- : ArrayBuilder(pool), indices_builder_(pool) {}
616+ explicit DictionaryBuilderBase (MemoryPool* pool = default_memory_pool(),
617+ int64_t alignment = kDefaultBufferAlignment,
618+ bool ordered = false)
619+ : ArrayBuilder(pool, alignment),
620+ indices_builder_(pool, alignment),
621+ ordered_(ordered) {}
595622
596623 explicit DictionaryBuilderBase (const std::shared_ptr<Array>& dictionary,
597- MemoryPool* pool = default_memory_pool())
598- : ArrayBuilder(pool), indices_builder_(pool) {}
624+ MemoryPool* pool = default_memory_pool(),
625+ int64_t alignment = kDefaultBufferAlignment,
626+ bool ordered = false)
627+ : ArrayBuilder(pool, alignment),
628+ indices_builder_(pool, alignment),
629+ ordered_(ordered) {}
599630
600631 // / \brief Append a scalar null value
601632 Status AppendNull () final {
@@ -647,7 +678,7 @@ class DictionaryBuilderBase<BuilderType, NullType> : public ArrayBuilder {
647678
648679 Status FinishInternal (std::shared_ptr<ArrayData>* out) override {
649680 ARROW_RETURN_NOT_OK (indices_builder_.FinishInternal (out));
650- (*out)->type = dictionary ((*out)->type , null ());
681+ (*out)->type = dictionary ((*out)->type , null (), ordered_ );
651682 (*out)->dictionary = NullArray (0 ).data ();
652683 return Status::OK ();
653684 }
@@ -659,11 +690,12 @@ class DictionaryBuilderBase<BuilderType, NullType> : public ArrayBuilder {
659690 Status Finish (std::shared_ptr<DictionaryArray>* out) { return FinishTyped (out); }
660691
661692 std::shared_ptr<DataType> type () const override {
662- return ::arrow::dictionary (indices_builder_.type (), null ());
693+ return ::arrow::dictionary (indices_builder_.type (), null (), ordered_ );
663694 }
664695
665696 protected:
666697 BuilderType indices_builder_;
698+ bool ordered_ = false ;
667699};
668700
669701} // namespace internal
0 commit comments