You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/04/10 01:11:42 UTC

arrow git commit: ARROW-800: [C++] Boost headers being transitively included in pyarrow

Repository: arrow
Updated Branches:
  refs/heads/master 137aade40 -> 72e1e0875


ARROW-800: [C++] Boost headers being transitively included in pyarrow

thanks to @wesm for suggesting the idea of returning `std::string` and doing the dispatching in c++.

Author: Phillip Cloud <cp...@gmail.com>

Closes #518 from cpcloud/ARROW-800 and squashes the following commits:

a983841 [Phillip Cloud] Formatting
ba46502 [Phillip Cloud] decimal namespace and change to FormatValue
f326f3a [Phillip Cloud] Const things
9001432 [Phillip Cloud] Remove ARROW_EXPORT of method inside ARROW_EXPORTed class
0c300ec [Phillip Cloud] ARROW-800: [C++] Boost headers being transitively included in pyarrow


Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/72e1e087
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/72e1e087
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/72e1e087

Branch: refs/heads/master
Commit: 72e1e08754003a56b413f49a107d55d61519f7ef
Parents: 137aade
Author: Phillip Cloud <cp...@gmail.com>
Authored: Sun Apr 9 21:11:33 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Sun Apr 9 21:11:33 2017 -0400

----------------------------------------------------------------------
 cpp/src/arrow/array-decimal-test.cc     |  2 ++
 cpp/src/arrow/array.cc                  | 44 +++++++++++++++++-----------
 cpp/src/arrow/array.h                   |  3 +-
 cpp/src/arrow/builder.cc                | 12 ++++----
 cpp/src/arrow/builder.h                 |  6 +++-
 cpp/src/arrow/python/builtin_convert.cc |  2 +-
 cpp/src/arrow/python/helpers.cc         | 12 ++++----
 cpp/src/arrow/python/helpers.h          |  7 ++++-
 cpp/src/arrow/python/pandas_convert.cc  | 10 +++----
 cpp/src/arrow/python/python-test.cc     |  4 +--
 cpp/src/arrow/type_fwd.h                |  2 +-
 cpp/src/arrow/util/CMakeLists.txt       |  1 -
 cpp/src/arrow/util/decimal-test.cc      |  2 ++
 cpp/src/arrow/util/decimal.cc           |  2 ++
 cpp/src/arrow/util/decimal.h            |  2 ++
 python/pyarrow/includes/common.pxd      |  5 ----
 python/pyarrow/includes/libarrow.pxd    |  7 +----
 python/pyarrow/scalar.pyx               |  9 +-----
 18 files changed, 71 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/array-decimal-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array-decimal-test.cc b/cpp/src/arrow/array-decimal-test.cc
index 4c01f92..8353acc 100644
--- a/cpp/src/arrow/array-decimal-test.cc
+++ b/cpp/src/arrow/array-decimal-test.cc
@@ -23,6 +23,7 @@
 #include "arrow/util/decimal.h"
 
 namespace arrow {
+namespace decimal {
 
 TEST(TypesTest, TestDecimal32Type) {
   DecimalType t1(8, 4);
@@ -221,4 +222,5 @@ INSTANTIATE_TEST_CASE_P(Decimal128BuilderTest, Decimal128BuilderTest,
     ::testing::Range(
         DecimalPrecision<int128_t>::minimum, DecimalPrecision<int128_t>::maximum));
 
+}  // namespace decimal
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/array.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array.cc b/cpp/src/arrow/array.cc
index 4e73e71..c4a78f3 100644
--- a/cpp/src/arrow/array.cc
+++ b/cpp/src/arrow/array.cc
@@ -310,25 +310,35 @@ bool DecimalArray::IsNegative(int64_t i) const {
   return sign_bitmap_data_ != nullptr ? BitUtil::GetBit(sign_bitmap_data_, i) : false;
 }
 
-template <typename T>
-ARROW_EXPORT Decimal<T> DecimalArray::Value(int64_t i) const {
-  Decimal<T> result;
-  FromBytes(GetValue(i), &result);
-  return result;
-}
-
-template ARROW_EXPORT Decimal32 DecimalArray::Value(int64_t i) const;
-template ARROW_EXPORT Decimal64 DecimalArray::Value(int64_t i) const;
-
-template <>
-ARROW_EXPORT Decimal128 DecimalArray::Value(int64_t i) const {
-  Decimal128 result;
-  FromBytes(GetValue(i), IsNegative(i), &result);
-  return result;
+std::string DecimalArray::FormatValue(int64_t i) const {
+  const auto type_ = std::dynamic_pointer_cast<DecimalType>(type());
+  const int precision = type_->precision;
+  const int scale = type_->scale;
+  const int byte_width = byte_width_;
+  const uint8_t* bytes = GetValue(i);
+  switch (byte_width) {
+    case 4: {
+      decimal::Decimal32 value;
+      decimal::FromBytes(bytes, &value);
+      return decimal::ToString(value, precision, scale);
+    }
+    case 8: {
+      decimal::Decimal64 value;
+      decimal::FromBytes(bytes, &value);
+      return decimal::ToString(value, precision, scale);
+    }
+    case 16: {
+      decimal::Decimal128 value;
+      decimal::FromBytes(bytes, IsNegative(i), &value);
+      return decimal::ToString(value, precision, scale);
+    }
+    default: {
+      DCHECK(false) << "Invalid byte width: " << byte_width;
+      return "";
+    }
+  }
 }
 
-template ARROW_EXPORT Decimal128 DecimalArray::Value(int64_t i) const;
-
 std::shared_ptr<Array> DecimalArray::Slice(int64_t offset, int64_t length) const {
   ConformSliceParams(offset_, length_, &offset, &length);
   return std::make_shared<DecimalArray>(

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/array.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h
index a4117fa..4f8b22e 100644
--- a/cpp/src/arrow/array.h
+++ b/cpp/src/arrow/array.h
@@ -384,8 +384,7 @@ class ARROW_EXPORT DecimalArray : public FixedSizeBinaryArray {
 
   bool IsNegative(int64_t i) const;
 
-  template <typename T>
-  ARROW_EXPORT Decimal<T> Value(int64_t i) const;
+  std::string FormatValue(int64_t i) const;
 
   std::shared_ptr<Array> Slice(int64_t offset, int64_t length) const override;
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/builder.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/builder.cc b/cpp/src/arrow/builder.cc
index a3677ef..4281a61 100644
--- a/cpp/src/arrow/builder.cc
+++ b/cpp/src/arrow/builder.cc
@@ -332,7 +332,7 @@ DecimalBuilder::DecimalBuilder(MemoryPool* pool, const std::shared_ptr<DataType>
       sign_bitmap_data_(nullptr) {}
 
 template <typename T>
-ARROW_EXPORT Status DecimalBuilder::Append(const Decimal<T>& val) {
+ARROW_EXPORT Status DecimalBuilder::Append(const decimal::Decimal<T>& val) {
   DCHECK_EQ(sign_bitmap_, nullptr) << "sign_bitmap_ is not null";
   DCHECK_EQ(sign_bitmap_data_, nullptr) << "sign_bitmap_data_ is not null";
 
@@ -340,11 +340,11 @@ ARROW_EXPORT Status DecimalBuilder::Append(const Decimal<T>& val) {
   return FixedSizeBinaryBuilder::Append(reinterpret_cast<const uint8_t*>(&val.value));
 }
 
-template ARROW_EXPORT Status DecimalBuilder::Append(const Decimal32& val);
-template ARROW_EXPORT Status DecimalBuilder::Append(const Decimal64& val);
+template ARROW_EXPORT Status DecimalBuilder::Append(const decimal::Decimal32& val);
+template ARROW_EXPORT Status DecimalBuilder::Append(const decimal::Decimal64& val);
 
 template <>
-ARROW_EXPORT Status DecimalBuilder::Append(const Decimal128& value) {
+ARROW_EXPORT Status DecimalBuilder::Append(const decimal::Decimal128& value) {
   DCHECK_NE(sign_bitmap_, nullptr) << "sign_bitmap_ is null";
   DCHECK_NE(sign_bitmap_data_, nullptr) << "sign_bitmap_data_ is null";
 
@@ -352,7 +352,7 @@ ARROW_EXPORT Status DecimalBuilder::Append(const Decimal128& value) {
   uint8_t stack_bytes[16] = {0};
   uint8_t* bytes = stack_bytes;
   bool is_negative;
-  ToBytes(value, &bytes, &is_negative);
+  decimal::ToBytes(value, &bytes, &is_negative);
   RETURN_NOT_OK(FixedSizeBinaryBuilder::Append(bytes));
 
   // TODO(phillipc): calculate the proper storage size here (do we have a function to do
@@ -363,7 +363,7 @@ ARROW_EXPORT Status DecimalBuilder::Append(const Decimal128& value) {
   return Status::OK();
 }
 
-template ARROW_EXPORT Status DecimalBuilder::Append(const Decimal128& val);
+template ARROW_EXPORT Status DecimalBuilder::Append(const decimal::Decimal128& val);
 
 Status DecimalBuilder::Init(int64_t capacity) {
   RETURN_NOT_OK(FixedSizeBinaryBuilder::Init(capacity));

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/builder.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/builder.h b/cpp/src/arrow/builder.h
index d42ab5b..6876916 100644
--- a/cpp/src/arrow/builder.h
+++ b/cpp/src/arrow/builder.h
@@ -37,9 +37,13 @@ namespace arrow {
 
 class Array;
 
+namespace decimal {
+
 template <typename T>
 struct Decimal;
 
+}  // namespace decimal
+
 static constexpr int64_t kMinBuilderCapacity = 1 << 5;
 
 /// Base class for all data array builders.
@@ -421,7 +425,7 @@ class ARROW_EXPORT DecimalBuilder : public FixedSizeBinaryBuilder {
   explicit DecimalBuilder(MemoryPool* pool, const std::shared_ptr<DataType>& type);
 
   template <typename T>
-  ARROW_EXPORT Status Append(const Decimal<T>& val);
+  ARROW_EXPORT Status Append(const decimal::Decimal<T>& val);
 
   Status Init(int64_t capacity) override;
   Status Resize(int64_t capacity) override;

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/python/builtin_convert.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/builtin_convert.cc b/cpp/src/arrow/python/builtin_convert.cc
index a064a3d..1ae13f3 100644
--- a/cpp/src/arrow/python/builtin_convert.cc
+++ b/cpp/src/arrow/python/builtin_convert.cc
@@ -523,7 +523,7 @@ class ListConverter : public TypedConverter<ListBuilder> {
 
 #define DECIMAL_CONVERT_CASE(bit_width, item, builder)        \
   case bit_width: {                                           \
-    arrow::Decimal##bit_width out;                            \
+    arrow::decimal::Decimal##bit_width out;                   \
     RETURN_NOT_OK(PythonDecimalToArrowDecimal((item), &out)); \
     RETURN_NOT_OK((builder)->Append(out));                    \
     break;                                                    \

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/python/helpers.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/helpers.cc b/cpp/src/arrow/python/helpers.cc
index ffba7bb..3d3d07a 100644
--- a/cpp/src/arrow/python/helpers.cc
+++ b/cpp/src/arrow/python/helpers.cc
@@ -74,7 +74,8 @@ Status ImportFromModule(const OwnedRef& module, const std::string& name, OwnedRe
 }
 
 template <typename T>
-Status PythonDecimalToArrowDecimal(PyObject* python_decimal, Decimal<T>* arrow_decimal) {
+Status PythonDecimalToArrowDecimal(
+    PyObject* python_decimal, decimal::Decimal<T>* arrow_decimal) {
   // Call Python's str(decimal_object)
   OwnedRef str_obj(PyObject_Str(python_decimal));
   RETURN_IF_PYERROR();
@@ -92,11 +93,11 @@ Status PythonDecimalToArrowDecimal(PyObject* python_decimal, Decimal<T>* arrow_d
 }
 
 template Status PythonDecimalToArrowDecimal(
-    PyObject* python_decimal, Decimal32* arrow_decimal);
+    PyObject* python_decimal, decimal::Decimal32* arrow_decimal);
 template Status PythonDecimalToArrowDecimal(
-    PyObject* python_decimal, Decimal64* arrow_decimal);
+    PyObject* python_decimal, decimal::Decimal64* arrow_decimal);
 template Status PythonDecimalToArrowDecimal(
-    PyObject* python_decimal, Decimal128* arrow_decimal);
+    PyObject* python_decimal, decimal::Decimal128* arrow_decimal);
 
 Status InferDecimalPrecisionAndScale(
     PyObject* python_decimal, int* precision, int* scale) {
@@ -111,7 +112,8 @@ Status InferDecimalPrecisionAndScale(
   auto size = str.size;
 
   std::string c_string(bytes, size);
-  return FromString(c_string, static_cast<Decimal32*>(nullptr), precision, scale);
+  return FromString(
+      c_string, static_cast<decimal::Decimal32*>(nullptr), precision, scale);
 }
 
 Status DecimalFromString(

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/python/helpers.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/helpers.h b/cpp/src/arrow/python/helpers.h
index a19b25f..77fde26 100644
--- a/cpp/src/arrow/python/helpers.h
+++ b/cpp/src/arrow/python/helpers.h
@@ -29,9 +29,13 @@
 
 namespace arrow {
 
+namespace decimal {
+
 template <typename T>
 struct Decimal;
 
+}  // namespace decimal
+
 namespace py {
 
 class OwnedRef;
@@ -43,7 +47,8 @@ Status ImportFromModule(
     const OwnedRef& module, const std::string& module_name, OwnedRef* ref);
 
 template <typename T>
-Status PythonDecimalToArrowDecimal(PyObject* python_decimal, Decimal<T>* arrow_decimal);
+Status PythonDecimalToArrowDecimal(
+    PyObject* python_decimal, decimal::Decimal<T>* arrow_decimal);
 
 Status InferDecimalPrecisionAndScale(
     PyObject* python_decimal, int* precision = nullptr, int* scale = nullptr);

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/python/pandas_convert.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/pandas_convert.cc b/cpp/src/arrow/python/pandas_convert.cc
index 5bb8e45..1a250e8 100644
--- a/cpp/src/arrow/python/pandas_convert.cc
+++ b/cpp/src/arrow/python/pandas_convert.cc
@@ -530,7 +530,7 @@ Status PandasConverter::ConvertDates() {
 
 #define CONVERT_DECIMAL_CASE(bit_width, builder, object)      \
   case bit_width: {                                           \
-    Decimal##bit_width d;                                     \
+    decimal::Decimal##bit_width d;                            \
     RETURN_NOT_OK(PythonDecimalToArrowDecimal((object), &d)); \
     RETURN_NOT_OK((builder).Append(d));                       \
     break;                                                    \
@@ -620,7 +620,7 @@ Status PandasConverter::ConvertObjectFixedWidthBytes(
 
 template <typename T>
 Status validate_precision(int precision) {
-  constexpr static const int maximum_precision = DecimalPrecision<T>::maximum;
+  constexpr static const int maximum_precision = decimal::DecimalPrecision<T>::maximum;
   if (!(precision > 0 && precision <= maximum_precision)) {
     std::stringstream ss;
     ss << "Invalid precision: " << precision << ". Minimum is 1, maximum is "
@@ -636,7 +636,7 @@ Status RawDecimalToString(
   DCHECK_NE(bytes, nullptr);
   DCHECK_NE(result, nullptr);
   RETURN_NOT_OK(validate_precision<T>(precision));
-  Decimal<T> decimal;
+  decimal::Decimal<T> decimal;
   FromBytes(bytes, &decimal);
   *result = ToString(decimal, precision, scale);
   return Status::OK();
@@ -651,8 +651,8 @@ Status RawDecimalToString(const uint8_t* bytes, int precision, int scale,
     bool is_negative, std::string* result) {
   DCHECK_NE(bytes, nullptr);
   DCHECK_NE(result, nullptr);
-  RETURN_NOT_OK(validate_precision<int128_t>(precision));
-  Decimal128 decimal;
+  RETURN_NOT_OK(validate_precision<boost::multiprecision::int128_t>(precision));
+  decimal::Decimal128 decimal;
   FromBytes(bytes, is_negative, &decimal);
   *result = ToString(decimal, precision, scale);
   return Status::OK();

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/python/python-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/python-test.cc b/cpp/src/arrow/python/python-test.cc
index b63d2ff..a4a11c0 100644
--- a/cpp/src/arrow/python/python-test.cc
+++ b/cpp/src/arrow/python/python-test.cc
@@ -63,8 +63,8 @@ TEST(DecimalTest, TestPythonDecimalToArrowDecimal128) {
   ASSERT_NE(pydecimal.obj(), nullptr);
   ASSERT_EQ(PyErr_Occurred(), nullptr);
 
-  Decimal128 arrow_decimal;
-  int128_t boost_decimal(decimal_string);
+  decimal::Decimal128 arrow_decimal;
+  boost::multiprecision::int128_t boost_decimal(decimal_string);
   PyObject* obj = pydecimal.obj();
   ASSERT_OK(PythonDecimalToArrowDecimal(obj, &arrow_decimal));
   ASSERT_EQ(boost_decimal, arrow_decimal.value);

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/type_fwd.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/type_fwd.h b/cpp/src/arrow/type_fwd.h
index acf12c3..2bb05f8 100644
--- a/cpp/src/arrow/type_fwd.h
+++ b/cpp/src/arrow/type_fwd.h
@@ -147,7 +147,7 @@ std::shared_ptr<DataType> ARROW_EXPORT binary();
 
 std::shared_ptr<DataType> ARROW_EXPORT date32();
 std::shared_ptr<DataType> ARROW_EXPORT date64();
-std::shared_ptr<DataType> ARROW_EXPORT decimal(int precision, int scale);
+std::shared_ptr<DataType> ARROW_EXPORT decimal_type(int precision, int scale);
 
 }  // namespace arrow
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/util/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/util/CMakeLists.txt b/cpp/src/arrow/util/CMakeLists.txt
index 054f110..9aa8bae 100644
--- a/cpp/src/arrow/util/CMakeLists.txt
+++ b/cpp/src/arrow/util/CMakeLists.txt
@@ -22,7 +22,6 @@
 # Headers: top level
 install(FILES
   bit-util.h
-  decimal.h
   logging.h
   macros.h
   random.h

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/util/decimal-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/util/decimal-test.cc b/cpp/src/arrow/util/decimal-test.cc
index 1e22643..dcaa9af 100644
--- a/cpp/src/arrow/util/decimal-test.cc
+++ b/cpp/src/arrow/util/decimal-test.cc
@@ -23,6 +23,7 @@
 #include "arrow/test-util.h"
 
 namespace arrow {
+namespace decimal {
 
 template <typename T>
 class DecimalTest : public ::testing::Test {
@@ -158,4 +159,5 @@ TEST(DecimalTest, TestDecimal128StringAndBytesRoundTrip) {
 
   ASSERT_EQ(expected.value, result.value);
 }
+}  // namespace decimal
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/util/decimal.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/util/decimal.cc b/cpp/src/arrow/util/decimal.cc
index 1ac3471..3b8a3ff 100644
--- a/cpp/src/arrow/util/decimal.cc
+++ b/cpp/src/arrow/util/decimal.cc
@@ -20,6 +20,7 @@
 #include <boost/regex.hpp>
 
 namespace arrow {
+namespace decimal {
 
 static const boost::regex DECIMAL_PATTERN("(\\+?|-?)((0*)(\\d*))(\\.(\\d+))?");
 
@@ -138,4 +139,5 @@ void ToBytes(const Decimal128& decimal, uint8_t** bytes, bool* is_negative) {
   *is_negative = backend.isneg();
 }
 
+}  // namespace decimal
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/cpp/src/arrow/util/decimal.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/util/decimal.h b/cpp/src/arrow/util/decimal.h
index 46883e3..c73bae1 100644
--- a/cpp/src/arrow/util/decimal.h
+++ b/cpp/src/arrow/util/decimal.h
@@ -31,6 +31,7 @@
 #include <boost/multiprecision/cpp_int.hpp>
 
 namespace arrow {
+namespace decimal {
 
 using boost::multiprecision::int128_t;
 
@@ -140,5 +141,6 @@ ARROW_EXPORT void ToBytes(const Decimal32& value, uint8_t** bytes);
 ARROW_EXPORT void ToBytes(const Decimal64& value, uint8_t** bytes);
 ARROW_EXPORT void ToBytes(const Decimal128& decimal, uint8_t** bytes, bool* is_negative);
 
+}  // namespace decimal
 }  // namespace arrow
 #endif  // ARROW_DECIMAL_H

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/python/pyarrow/includes/common.pxd
----------------------------------------------------------------------
diff --git a/python/pyarrow/includes/common.pxd b/python/pyarrow/includes/common.pxd
index 4860334..ab38ff3 100644
--- a/python/pyarrow/includes/common.pxd
+++ b/python/pyarrow/includes/common.pxd
@@ -51,11 +51,6 @@ cdef extern from "arrow/api.h" namespace "arrow" nogil:
         c_bool IsTypeError()
 
 
-cdef extern from "arrow/util/decimal.h" namespace "arrow" nogil:
-    cdef cppclass int128_t:
-        pass
-
-
 cdef inline object PyObject_to_object(PyObject* o):
     # Cast to "object" increments reference count
     cdef object result = <object> o

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/python/pyarrow/includes/libarrow.pxd
----------------------------------------------------------------------
diff --git a/python/pyarrow/includes/libarrow.pxd b/python/pyarrow/includes/libarrow.pxd
index 73d96b2..e719e18 100644
--- a/python/pyarrow/includes/libarrow.pxd
+++ b/python/pyarrow/includes/libarrow.pxd
@@ -60,11 +60,6 @@ cdef extern from "arrow/api.h" namespace "arrow" nogil:
         TimeUnit_MICRO" arrow::TimeUnit::MICRO"
         TimeUnit_NANO" arrow::TimeUnit::NANO"
 
-    cdef cppclass Decimal[T]:
-        Decimal(const T&)
-
-    cdef c_string ToString[T](const Decimal[T]&, int, int)
-
     cdef cppclass CDataType" arrow::DataType":
         Type type
 
@@ -226,7 +221,7 @@ cdef extern from "arrow/api.h" namespace "arrow" nogil:
         const uint8_t* GetValue(int i)
 
     cdef cppclass CDecimalArray" arrow::DecimalArray"(CFixedSizeBinaryArray):
-        Decimal[T] Value[T](int i)
+        c_string FormatValue(int i)
 
     cdef cppclass CListArray" arrow::ListArray"(CArray):
         const int32_t* raw_value_offsets()

http://git-wip-us.apache.org/repos/asf/arrow/blob/72e1e087/python/pyarrow/scalar.pyx
----------------------------------------------------------------------
diff --git a/python/pyarrow/scalar.pyx b/python/pyarrow/scalar.pyx
index 196deed..7591ae8 100644
--- a/python/pyarrow/scalar.pyx
+++ b/python/pyarrow/scalar.pyx
@@ -17,7 +17,6 @@
 
 from pyarrow.schema cimport DataType, box_data_type
 
-from pyarrow.includes.common cimport int128_t
 from pyarrow.compat import frombytes
 import pyarrow.schema as schema
 import decimal
@@ -213,13 +212,7 @@ cdef class DecimalValue(ArrayValue):
             int bit_width = t.bit_width()
             int precision = t.precision
             int scale = t.scale
-            c_string s
-        if bit_width == 32:
-            s = ToString[int32_t](ap.Value[int32_t](self.index), precision, scale)
-        elif bit_width == 64:
-            s = ToString[int64_t](ap.Value[int64_t](self.index), precision, scale)
-        elif bit_width == 128:
-            s = ToString[int128_t](ap.Value[int128_t](self.index), precision, scale)
+            c_string s = ap.FormatValue(self.index)
         return decimal.Decimal(s.decode('utf8'))