Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ci/travis_install_conda.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
set -e

if [ $TRAVIS_OS_NAME == "linux" ]; then
MINICONDA_URL="https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh"
MINICONDA_URL="https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh"
else
MINICONDA_URL="https://repo.continuum.io/miniconda/Miniconda-latest-MacOSX-x86_64.sh"
MINICONDA_URL="https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh"
fi

wget -O miniconda.sh $MINICONDA_URL
Expand Down
2 changes: 1 addition & 1 deletion cpp/src/arrow/ipc/ipc-file-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ TEST_P(TestStreamFormat, RoundTrip) {
#define BATCH_CASES() \
::testing::Values(&MakeIntRecordBatch, &MakeListRecordBatch, &MakeNonNullRecordBatch, \
&MakeZeroLengthRecordBatch, &MakeDeeplyNestedList, &MakeStringTypesRecordBatch, \
&MakeStruct, &MakeDictionary);
&MakeStruct, &MakeUnion, &MakeDictionary);

INSTANTIATE_TEST_CASE_P(FileRoundTripTests, TestFileFormat, BATCH_CASES());
INSTANTIATE_TEST_CASE_P(StreamRoundTripTests, TestStreamFormat, BATCH_CASES());
Expand Down
101 changes: 64 additions & 37 deletions cpp/src/arrow/ipc/metadata-internal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -78,43 +78,6 @@ static Status FloatFromFlatuffer(
return Status::OK();
}

static Status TypeFromFlatbuffer(flatbuf::Type type, const void* type_data,
const std::vector<std::shared_ptr<Field>>& children, std::shared_ptr<DataType>* out) {
switch (type) {
case flatbuf::Type_NONE:
return Status::Invalid("Type metadata cannot be none");
case flatbuf::Type_Int:
return IntFromFlatbuffer(static_cast<const flatbuf::Int*>(type_data), out);
case flatbuf::Type_FloatingPoint:
return FloatFromFlatuffer(
static_cast<const flatbuf::FloatingPoint*>(type_data), out);
case flatbuf::Type_Binary:
*out = binary();
return Status::OK();
case flatbuf::Type_Utf8:
*out = utf8();
return Status::OK();
case flatbuf::Type_Bool:
*out = boolean();
return Status::OK();
case flatbuf::Type_Decimal:
case flatbuf::Type_Timestamp:
case flatbuf::Type_List:
if (children.size() != 1) {
return Status::Invalid("List must have exactly 1 child field");
}
*out = std::make_shared<ListType>(children[0]);
return Status::OK();
case flatbuf::Type_Struct_:
*out = std::make_shared<StructType>(children);
return Status::OK();
case flatbuf::Type_Union:
return Status::NotImplemented("Type is not implemented");
default:
return Status::Invalid("Unrecognized type");
}
}

// Forward declaration
static Status FieldToFlatbuffer(FBB& fbb, const std::shared_ptr<Field>& field,
DictionaryMemo* dictionary_memo, FieldOffset* offset);
Expand Down Expand Up @@ -153,6 +116,32 @@ static Status StructToFlatbuffer(FBB& fbb, const std::shared_ptr<DataType>& type
return Status::OK();
}

// ----------------------------------------------------------------------
// Union implementation

static Status UnionFromFlatbuffer(const flatbuf::Union* union_data,
const std::vector<std::shared_ptr<Field>>& children, std::shared_ptr<DataType>* out) {
UnionMode mode = union_data->mode() == flatbuf::UnionMode_Sparse ? UnionMode::SPARSE
: UnionMode::DENSE;

std::vector<uint8_t> type_codes;

const flatbuffers::Vector<int32_t>* fb_type_ids = union_data->typeIds();
if (fb_type_ids == nullptr) {
for (uint8_t i = 0; i < children.size(); ++i) {
type_codes.push_back(i);
}
} else {
for (int32_t id : (*fb_type_ids)) {
// TODO(wesm): can these values exceed 255?
type_codes.push_back(static_cast<uint8_t>(id));
}
}

*out = union_(children, type_codes, mode);
return Status::OK();
}

static Status UnionToFlatBuffer(FBB& fbb, const std::shared_ptr<DataType>& type,
std::vector<FieldOffset>* out_children, DictionaryMemo* dictionary_memo,
Offset* offset) {
Expand Down Expand Up @@ -181,6 +170,44 @@ static Status UnionToFlatBuffer(FBB& fbb, const std::shared_ptr<DataType>& type,
*offset = IntToFlatbuffer(fbb, BIT_WIDTH, IS_SIGNED); \
break;

static Status TypeFromFlatbuffer(flatbuf::Type type, const void* type_data,
const std::vector<std::shared_ptr<Field>>& children, std::shared_ptr<DataType>* out) {
switch (type) {
case flatbuf::Type_NONE:
return Status::Invalid("Type metadata cannot be none");
case flatbuf::Type_Int:
return IntFromFlatbuffer(static_cast<const flatbuf::Int*>(type_data), out);
case flatbuf::Type_FloatingPoint:
return FloatFromFlatuffer(
static_cast<const flatbuf::FloatingPoint*>(type_data), out);
case flatbuf::Type_Binary:
*out = binary();
return Status::OK();
case flatbuf::Type_Utf8:
*out = utf8();
return Status::OK();
case flatbuf::Type_Bool:
*out = boolean();
return Status::OK();
case flatbuf::Type_Decimal:
case flatbuf::Type_Timestamp:
case flatbuf::Type_List:
if (children.size() != 1) {
return Status::Invalid("List must have exactly 1 child field");
}
*out = std::make_shared<ListType>(children[0]);
return Status::OK();
case flatbuf::Type_Struct_:
*out = std::make_shared<StructType>(children);
return Status::OK();
case flatbuf::Type_Union:
return UnionFromFlatbuffer(
static_cast<const flatbuf::Union*>(type_data), children, out);
default:
return Status::Invalid("Unrecognized type");
}
}

// TODO(wesm): Convert this to visitor pattern
static Status TypeToFlatbuffer(FBB& fbb, const std::shared_ptr<DataType>& type,
std::vector<FieldOffset>* children, std::vector<VectorLayoutOffset>* layout,
Expand Down