Prevent infinite loop while writing on CategoricalArrays (#44)
authorJacob Quinn <quinn.jacobd@gmail.com>
Fri, 23 Oct 2020 20:06:31 +0000 (14:06 -0600)
committerGitHub <noreply@github.com>
Fri, 23 Oct 2020 20:06:31 +0000 (14:06 -0600)
commitb109c4921908346c63b1e5a09bb49845aad598b8
treeae6db986693f253f85425560917e88b3178e5d2c
parent5c207eadb53115d9053e87a666d188ddf33c5b2e
Prevent infinite loop while writing on CategoricalArrays (#44)

Supporting CategoricalArrays is a bit tricky. Ideally, we could use the
same interface as PooledArrays and just rely on `DataAPI.refarray` and
`DataAPI.refpool`, but alas, a `CategoricalArray` returns a
`CategoricalRefPool` from `DataAPI.refpool`, with `CategoricalValue`
elements. The core issue comes when we try to serialize the pool, which
is a recursive process: recursive until we reach a known "leaf" type, at
which point the recursion stops. Unfortunately, a `CategoricalValue`
isn't a known leaf type, so it's treated as a `StructType`, where each
of its fields are serialized. One of the fields is the
`CategoricalRefPool`, so we get stuck in a never-ending recursive loop
serializing `CategoricalValue`s and `CategoricalRefPool`s.

This PR proposes a quick hack where we check the `DataType` name for
`:CategoricalRefPool` or `:CategoricalArray` and if so, just unwrap the
values so the recursion will be broken. It's obviously a little hacky,
but also avoids taking on the always-problematic CategoricalArrays
dependency.
src/arraytypes/dictencoding.jl