Ensure serializing Arrow.DictEncoded writes dictionary messages (#149)
authorJacob Quinn <quinn.jacobd@gmail.com>
Fri, 12 Mar 2021 16:07:04 +0000 (09:07 -0700)
committerGitHub <noreply@github.com>
Fri, 12 Mar 2021 16:07:04 +0000 (09:07 -0700)
commit4cc34a3c3d2f406a7054f0b7bca4e0bbfb472785
tree81fd6818747a61cc8349d2d7fda64ad5d662a87a
parentd7a1e32c971611ca9822b296c7587d0da3ba6850
Ensure serializing Arrow.DictEncoded writes dictionary messages (#149)

Fixes #126. The issue here was when `Arrow.write` was faced with the
task of serializing an `Arrow.DictEncoded`. For most arrow array types,
if the input array is already an arrow array type, it's a no-op (e.g. if
you're writing out an `Arrow.Table`). The problem comes from
`Arrow.DictEncoded`, where there is still no conversion required, but we
do need to make a note of the dict encoded column to ensure a dictionary
message is written before the record batch. In addition, we also add
some code for handling delta dictionary messages if required from
multiple record batches that contain `Arrow.DictEncoded`s, which is a
valid use-case where you may have multiple arrow files, with the same
schema, that you wish to serialize as a single arrow file w/ each file
as a separate record batch.

Slightly unrelated, but there's also a fix here in our use of Lockable.
We actually had a race condition I ran into once where the locking was
on the Lockable object, but inside the locked region, we replaced the
entire Lockable instead of the _contents_ of the Lockable. This meant
anyone who started waiting on the Lockable's lock didn't see updates
when unlocked because the entire Lockable had been updated.
src/arraytypes/dictencoding.jl
src/utils.jl
src/write.jl
test/runtests.jl