@@ -134,6 +134,24 @@ impl Scheme for FoRScheme {
134134 is_integer_primitive ( canonical)
135135 }
136136
137+ /// Dict codes always start at 0, so FoR (which subtracts the min) is a no-op.
138+ fn ancestor_exclusions ( & self ) -> Vec < AncestorExclusion > {
139+ vec ! [
140+ AncestorExclusion {
141+ ancestor: IntDictScheme . id( ) ,
142+ children: ChildSelection :: One ( 1 ) ,
143+ } ,
144+ AncestorExclusion {
145+ ancestor: FloatDictScheme . id( ) ,
146+ children: ChildSelection :: One ( 1 ) ,
147+ } ,
148+ AncestorExclusion {
149+ ancestor: StringDictScheme . id( ) ,
150+ children: ChildSelection :: One ( 1 ) ,
151+ } ,
152+ ]
153+ }
154+
137155 fn expected_compression_ratio (
138156 & self ,
139157 _compressor : & CascadingCompressor ,
@@ -225,6 +243,7 @@ impl Scheme for ZigZagScheme {
225243 is_integer_primitive ( canonical)
226244 }
227245
246+ /// Children: encoded=0.
228247 fn num_children ( & self ) -> usize {
229248 1
230249 }
@@ -249,6 +268,24 @@ impl Scheme for ZigZagScheme {
249268 ]
250269 }
251270
271+ /// Dict codes are unsigned integers (0..cardinality). ZigZag only helps negatives.
272+ fn ancestor_exclusions ( & self ) -> Vec < AncestorExclusion > {
273+ vec ! [
274+ AncestorExclusion {
275+ ancestor: IntDictScheme . id( ) ,
276+ children: ChildSelection :: One ( 1 ) ,
277+ } ,
278+ AncestorExclusion {
279+ ancestor: FloatDictScheme . id( ) ,
280+ children: ChildSelection :: One ( 1 ) ,
281+ } ,
282+ AncestorExclusion {
283+ ancestor: StringDictScheme . id( ) ,
284+ children: ChildSelection :: One ( 1 ) ,
285+ } ,
286+ ]
287+ }
288+
252289 fn expected_compression_ratio (
253290 & self ,
254291 compressor : & CascadingCompressor ,
@@ -365,6 +402,7 @@ impl Scheme for SparseScheme {
365402 }
366403 }
367404
405+ /// Children: values=0, indices=1.
368406 fn num_children ( & self ) -> usize {
369407 2
370408 }
@@ -494,6 +532,7 @@ impl Scheme for RunEndScheme {
494532 is_integer_primitive ( canonical)
495533 }
496534
535+ /// Children: values=0, ends=1.
497536 fn num_children ( & self ) -> usize {
498537 2
499538 }
@@ -507,12 +546,23 @@ impl Scheme for RunEndScheme {
507546 } ]
508547 }
509548
510- // TODO(connor): There seems to be stuff missing here...
549+ /// Dict values (child 0) are all unique by definition, so run-end encoding them is
550+ /// pointless. Codes (child 1) can have runs and may benefit from RunEnd.
511551 fn ancestor_exclusions ( & self ) -> Vec < AncestorExclusion > {
512- vec ! [ AncestorExclusion {
513- ancestor: FloatDictScheme . id( ) ,
514- children: ChildSelection :: One ( 0 ) ,
515- } ]
552+ vec ! [
553+ AncestorExclusion {
554+ ancestor: IntDictScheme . id( ) ,
555+ children: ChildSelection :: One ( 0 ) ,
556+ } ,
557+ AncestorExclusion {
558+ ancestor: FloatDictScheme . id( ) ,
559+ children: ChildSelection :: One ( 0 ) ,
560+ } ,
561+ AncestorExclusion {
562+ ancestor: StringDictScheme . id( ) ,
563+ children: ChildSelection :: One ( 0 ) ,
564+ } ,
565+ ]
516566 }
517567
518568 fn expected_compression_ratio (
0 commit comments