Skip to content

Commit

Permalink
ARROW-87: [C++] Add all four possible ways to encode Decimals in Parq…
Browse files Browse the repository at this point in the history
…uet to schema conversion
  • Loading branch information
xhochy committed Mar 28, 2016
1 parent d3cb6b4 commit cc35395
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
36 changes: 36 additions & 0 deletions cpp/src/arrow/parquet/parquet-schema-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "arrow/test-util.h"
#include "arrow/type.h"
#include "arrow/types/decimal.h"
#include "arrow/util/status.h"

#include "arrow/parquet/schema.h"
Expand All @@ -44,6 +45,7 @@ const auto DOUBLE = std::make_shared<DoubleType>();
const auto UTF8 = std::make_shared<StringType>();
const auto BINARY = std::make_shared<ListType>(
std::make_shared<Field>("", UINT8));
const auto DECIMAL_8_4 = std::make_shared<DecimalType>(8, 4);

class TestConvertParquetSchema : public ::testing::Test {
public:
Expand Down Expand Up @@ -117,6 +119,40 @@ TEST_F(TestConvertParquetSchema, ParquetFlatPrimitives) {
CheckFlatSchema(arrow_schema);
}

TEST_F(TestConvertParquetSchema, ParquetFlatDecimals) {
std::vector<NodePtr> parquet_fields;
std::vector<std::shared_ptr<Field>> arrow_fields;

parquet_fields.push_back(
PrimitiveNode::Make("flba-decimal", Repetition::OPTIONAL,
parquet_cpp::Type::FIXED_LEN_BYTE_ARRAY,
parquet_cpp::LogicalType::DECIMAL, 4, 8, 4));
arrow_fields.push_back(std::make_shared<Field>("flba-decimal", DECIMAL_8_4));

parquet_fields.push_back(
PrimitiveNode::Make("binary-decimal", Repetition::OPTIONAL,
parquet_cpp::Type::BYTE_ARRAY,
parquet_cpp::LogicalType::DECIMAL, -1, 8, 4));
arrow_fields.push_back(std::make_shared<Field>("binary-decimal", DECIMAL_8_4));

parquet_fields.push_back(
PrimitiveNode::Make("int32-decimal", Repetition::OPTIONAL,
parquet_cpp::Type::INT32,
parquet_cpp::LogicalType::DECIMAL, -1, 8, 4));
arrow_fields.push_back(std::make_shared<Field>("int32-decimal", DECIMAL_8_4));

parquet_fields.push_back(
PrimitiveNode::Make("int64-decimal", Repetition::OPTIONAL,
parquet_cpp::Type::INT64,
parquet_cpp::LogicalType::DECIMAL, -1, 8, 4));
arrow_fields.push_back(std::make_shared<Field>("int64-decimal", DECIMAL_8_4));

auto arrow_schema = std::make_shared<Schema>(arrow_fields);
ASSERT_OK(ConvertSchema(parquet_fields));

CheckFlatSchema(arrow_schema);
}

TEST_F(TestConvertParquetSchema, UnsupportedThings) {
std::vector<NodePtr> unsupported_nodes;

Expand Down
9 changes: 9 additions & 0 deletions cpp/src/arrow/parquet/schema.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ static Status FromByteArray(const PrimitiveNode* node, TypePtr* out) {
case LogicalType::UTF8:
*out = UTF8;
break;
case LogicalType::DECIMAL:
*out = MakeDecimalType(node);
break;
default:
// BINARY
*out = BINARY;
Expand Down Expand Up @@ -85,6 +88,9 @@ static Status FromInt32(const PrimitiveNode* node, TypePtr* out) {
case LogicalType::NONE:
*out = INT32;
break;
case LogicalType::DECIMAL:
*out = MakeDecimalType(node);
break;
default:
return Status::NotImplemented("Unhandled logical type for int32");
break;
Expand All @@ -97,6 +103,9 @@ static Status FromInt64(const PrimitiveNode* node, TypePtr* out) {
case LogicalType::NONE:
*out = INT64;
break;
case LogicalType::DECIMAL:
*out = MakeDecimalType(node);
break;
default:
return Status::NotImplemented("Unhandled logical type for int64");
break;
Expand Down

0 comments on commit cc35395

Please sign in to comment.