@@ -769,23 +769,55 @@ cdef class CSchema:
769
769
else :
770
770
return None
771
771
772
- def modify (self , *, name = None , flags = None , nullable = None , metadata = None ,
773
- validate = True ):
774
- builder = CSchemaBuilder.copy( self )
772
+ def modify (self , *, format = None , name = None , flags = None , nullable = None ,
773
+ metadata = None , children = None , dictionary = None , validate = True ):
774
+ cdef CSchemaBuilder builder = CSchemaBuilder.allocate( )
775
775
776
- if name is not None :
776
+ if format is None :
777
+ builder.set_format(self .format)
778
+ else :
779
+ builder.set_format(format)
780
+
781
+ if name is None :
782
+ builder.set_name(self .name)
783
+ elif name is not False :
777
784
builder.set_name(name)
778
785
779
- if flags is not None :
786
+ if flags is None :
787
+ builder.set_flags(self .flags)
788
+ else :
780
789
builder.set_flags(flags)
781
790
782
791
if nullable is not None :
783
792
builder.set_nullable(nullable)
784
793
785
- if metadata is not None :
786
- builder.clear_metadata()
794
+ if metadata is None :
795
+ if self .metadata is not None :
796
+ builder.append_metadata(self .metadata)
797
+ else :
787
798
builder.append_metadata(metadata)
788
799
800
+ if children is None :
801
+ if self .n_children > 0 :
802
+ builder.allocate_children(self .n_children)
803
+ for i, child in enumerate (self .children):
804
+ builder.set_child(i, None , child)
805
+ elif hasattr (children, " items" ):
806
+ builder.allocate_children(len (children))
807
+ for i, item in enumerate (children.items()):
808
+ name, child = item
809
+ builder.set_child(i, name, child)
810
+ else :
811
+ builder.allocate_children(len (children))
812
+ for i, child in enumerate (children):
813
+ builder.set_child(i, None , child)
814
+
815
+ if dictionary is None :
816
+ if self .dictionary:
817
+ builder.set_dictionary(self .dictionary)
818
+ elif dictionary is not False :
819
+ builder.set_dictionary(dictionary)
820
+
789
821
if validate:
790
822
builder.validate()
791
823
@@ -1036,19 +1068,10 @@ cdef class CSchemaBuilder:
1036
1068
if self ._ptr.release == NULL :
1037
1069
ArrowSchemaInit(self ._ptr)
1038
1070
1039
- @staticmethod
1040
- def copy (CSchema schema ):
1041
- return CSchemaBuilder(schema.__deepcopy__())
1042
-
1043
1071
@staticmethod
1044
1072
def allocate ():
1045
1073
return CSchemaBuilder(CSchema.allocate())
1046
1074
1047
- def clear_metadata (self ):
1048
- cdef int code = ArrowSchemaSetMetadata(self .c_schema._ptr, NULL )
1049
- Error.raise_error_not_ok(" ArrowSchemaSetMetadata()" , code)
1050
- return self
1051
-
1052
1075
def append_metadata (self , metadata ):
1053
1076
cdef CBuffer buffer = CBuffer.empty()
1054
1077
@@ -1164,6 +1187,23 @@ cdef class CSchemaBuilder:
1164
1187
if name is not None :
1165
1188
name = str (name)
1166
1189
code = ArrowSchemaSetName(self ._ptr.children[i], name.encode(" UTF-8" ))
1190
+ Error.raise_error_not_ok(" ArrowSchemaSetName()" , code)
1191
+
1192
+ return self
1193
+
1194
+ def set_dictionary (self , CSchema dictionary ):
1195
+ self .c_schema._assert_valid()
1196
+
1197
+ cdef int code
1198
+ if self ._ptr.dictionary == NULL :
1199
+ code = ArrowSchemaAllocateDictionary(self ._ptr)
1200
+ Error.raise_error_not_ok(" ArrowSchemaAllocateDictionary()" , code)
1201
+
1202
+ if self ._ptr.dictionary.release != NULL :
1203
+ ArrowSchemaRelease(self ._ptr.dictionary)
1204
+
1205
+ code = ArrowSchemaDeepCopy(dictionary._ptr, self ._ptr.dictionary)
1206
+ Error.raise_error_not_ok(" ArrowSchemaDeepCopy()" , code)
1167
1207
1168
1208
return self
1169
1209
@@ -1179,6 +1219,14 @@ cdef class CSchemaBuilder:
1179
1219
1180
1220
return self
1181
1221
1222
+ def set_dictionary_ordered (self , dictionary_ordered ):
1223
+ if dictionary_ordered:
1224
+ self ._ptr.flags = self ._ptr.flags | ARROW_FLAG_DICTIONARY_ORDERED
1225
+ else :
1226
+ self ._ptr.flags = self ._ptr.flags & ~ ARROW_FLAG_DICTIONARY_ORDERED
1227
+
1228
+ return self
1229
+
1182
1230
def validate (self ):
1183
1231
return CSchemaView(self .c_schema)
1184
1232
0 commit comments