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/09/06 11:36:14 UTC
arrow git commit: ARROW-1468: [C++] Add primitive Append variants
that accept std::vector
Repository: arrow
Updated Branches:
refs/heads/master a3514a388 -> 5abd12321
ARROW-1468: [C++] Add primitive Append variants that accept std::vector<T>
Having to always unbox std::vector in user code is a rough edge in practice -- this makes things simpler in third party applications.
Author: Wes McKinney <we...@twosigma.com>
Closes #1053 from wesm/ARROW-1468 and squashes the following commits:
2546d8fe [Wes McKinney] Add primitive Append variants that accept std::vector<T>
Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/5abd1232
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/5abd1232
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/5abd1232
Branch: refs/heads/master
Commit: 5abd12321e5730ffd8e16207d86c479f5eb362a5
Parents: a3514a3
Author: Wes McKinney <we...@twosigma.com>
Authored: Wed Sep 6 07:36:09 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Wed Sep 6 07:36:09 2017 -0400
----------------------------------------------------------------------
cpp/src/arrow/array-test.cc | 19 +++++++++++++++++--
cpp/src/arrow/builder.cc | 34 ++++++++++++++++++++++++++++++++++
cpp/src/arrow/builder.h | 29 +++++++++++++++++++++++++++++
3 files changed, 80 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/arrow/blob/5abd1232/cpp/src/arrow/array-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array-test.cc b/cpp/src/arrow/array-test.cc
index a73a73e..5d9eb18 100644
--- a/cpp/src/arrow/array-test.cc
+++ b/cpp/src/arrow/array-test.cc
@@ -614,22 +614,32 @@ TYPED_TEST(TestPrimitiveBuilder, TestAppendVectorStdBool) {
is_valid.push_back(this->valid_bytes_[i] != 0);
}
ASSERT_OK(this->builder_->Append(draws.data(), K, is_valid));
+ ASSERT_OK(this->builder_nn_->Append(draws.data(), K));
ASSERT_EQ(1000, this->builder_->length());
ASSERT_EQ(1024, this->builder_->capacity());
+ ASSERT_EQ(1000, this->builder_nn_->length());
+ ASSERT_EQ(1024, this->builder_nn_->capacity());
// Append the next 9000
is_valid.clear();
+ std::vector<T> partial_draws;
for (int64_t i = K; i < size; ++i) {
+ partial_draws.push_back(draws[i]);
is_valid.push_back(this->valid_bytes_[i] != 0);
}
- ASSERT_OK(this->builder_->Append(draws.data() + K, size - K, is_valid));
+ ASSERT_OK(this->builder_->Append(partial_draws, is_valid));
+ ASSERT_OK(this->builder_nn_->Append(partial_draws));
ASSERT_EQ(size, this->builder_->length());
ASSERT_EQ(BitUtil::NextPower2(size), this->builder_->capacity());
+ ASSERT_EQ(size, this->builder_nn_->length());
+ ASSERT_EQ(BitUtil::NextPower2(size), this->builder_->capacity());
+
this->Check(this->builder_, true);
+ this->Check(this->builder_nn_, false);
}
TYPED_TEST(TestPrimitiveBuilder, TestAdvance) {
@@ -671,6 +681,7 @@ TYPED_TEST(TestPrimitiveBuilder, TestReserve) {
TEST(TestBooleanBuilder, TestStdBoolVectorAppend) {
BooleanBuilder builder;
+ BooleanBuilder builder_nn;
std::vector<bool> values, is_valid;
@@ -686,12 +697,15 @@ TEST(TestBooleanBuilder, TestStdBoolVectorAppend) {
chunk_is_valid.push_back(is_valid[i]);
}
ASSERT_OK(builder.Append(chunk_values, chunk_is_valid));
+ ASSERT_OK(builder_nn.Append(chunk_values));
}
- std::shared_ptr<Array> result;
+ std::shared_ptr<Array> result, result_nn;
ASSERT_OK(builder.Finish(&result));
+ ASSERT_OK(builder_nn.Finish(&result_nn));
const auto& arr = static_cast<const BooleanArray&>(*result);
+ const auto& arr_nn = static_cast<const BooleanArray&>(*result_nn);
for (int i = 0; i < length; ++i) {
if (is_valid[i]) {
ASSERT_FALSE(arr.IsNull(i));
@@ -699,6 +713,7 @@ TEST(TestBooleanBuilder, TestStdBoolVectorAppend) {
} else {
ASSERT_TRUE(arr.IsNull(i));
}
+ ASSERT_EQ(values[i], arr_nn.Value(i));
}
}
http://git-wip-us.apache.org/repos/asf/arrow/blob/5abd1232/cpp/src/arrow/builder.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/builder.cc b/cpp/src/arrow/builder.cc
index 0129dc8..7966241 100644
--- a/cpp/src/arrow/builder.cc
+++ b/cpp/src/arrow/builder.cc
@@ -292,6 +292,17 @@ Status PrimitiveBuilder<T>::Append(const value_type* values, int64_t length,
}
template <typename T>
+Status PrimitiveBuilder<T>::Append(const std::vector<value_type>& values,
+ const std::vector<bool>& is_valid) {
+ return Append(values.data(), static_cast<int64_t>(values.size()), is_valid);
+}
+
+template <typename T>
+Status PrimitiveBuilder<T>::Append(const std::vector<value_type>& values) {
+ return Append(values.data(), static_cast<int64_t>(values.size()));
+}
+
+template <typename T>
Status PrimitiveBuilder<T>::Finish(std::shared_ptr<Array>* out) {
const int64_t bytes_required = TypeTraits<T>::bytes_required(length_);
if (bytes_required > 0 && bytes_required < data_->size()) {
@@ -750,6 +761,7 @@ Status BooleanBuilder::Append(const uint8_t* values, int64_t length,
Status BooleanBuilder::Append(const uint8_t* values, int64_t length,
const std::vector<bool>& is_valid) {
RETURN_NOT_OK(Reserve(length));
+ DCHECK_EQ(length, static_cast<int64_t>(is_valid.size()));
for (int64_t i = 0; i < length; ++i) {
BitUtil::SetBitTo(raw_data_, length_ + i, values[i] != 0);
@@ -760,10 +772,20 @@ Status BooleanBuilder::Append(const uint8_t* values, int64_t length,
return Status::OK();
}
+Status BooleanBuilder::Append(const std::vector<uint8_t>& values,
+ const std::vector<bool>& is_valid) {
+ return Append(values.data(), static_cast<int64_t>(values.size()), is_valid);
+}
+
+Status BooleanBuilder::Append(const std::vector<uint8_t>& values) {
+ return Append(values.data(), static_cast<int64_t>(values.size()));
+}
+
Status BooleanBuilder::Append(const std::vector<bool>& values,
const std::vector<bool>& is_valid) {
const int64_t length = static_cast<int64_t>(values.size());
RETURN_NOT_OK(Reserve(length));
+ DCHECK_EQ(length, static_cast<int64_t>(is_valid.size()));
for (int64_t i = 0; i < length; ++i) {
BitUtil::SetBitTo(raw_data_, length_ + i, values[i]);
@@ -774,6 +796,18 @@ Status BooleanBuilder::Append(const std::vector<bool>& values,
return Status::OK();
}
+Status BooleanBuilder::Append(const std::vector<bool>& values) {
+ const int64_t length = static_cast<int64_t>(values.size());
+ RETURN_NOT_OK(Reserve(length));
+
+ for (int64_t i = 0; i < length; ++i) {
+ BitUtil::SetBitTo(raw_data_, length_ + i, values[i]);
+ }
+
+ ArrayBuilder::UnsafeSetNotNull(length);
+ return Status::OK();
+}
+
// ----------------------------------------------------------------------
// DictionaryBuilder
http://git-wip-us.apache.org/repos/asf/arrow/blob/5abd1232/cpp/src/arrow/builder.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/builder.h b/cpp/src/arrow/builder.h
index a99e682..3e8289f 100644
--- a/cpp/src/arrow/builder.h
+++ b/cpp/src/arrow/builder.h
@@ -220,6 +220,18 @@ class ARROW_EXPORT PrimitiveBuilder : public ArrayBuilder {
Status Append(const value_type* values, int64_t length,
const std::vector<bool>& is_valid);
+ /// \brief Append a sequence of elements in one shot
+ /// \param[in] values a std::vector of values
+ /// \param[in] is_valid an std::vector<bool> indicating valid (1) or null
+ /// (0). Equal in length to values
+ /// \return Status
+ Status Append(const std::vector<value_type>& values, const std::vector<bool>& is_valid);
+
+ /// \brief Append a sequence of elements in one shot
+ /// \param[in] values a std::vector of values
+ /// \return Status
+ Status Append(const std::vector<value_type>& values);
+
Status Finish(std::shared_ptr<Array>* out) override;
Status Init(int64_t capacity) override;
@@ -556,12 +568,29 @@ class ARROW_EXPORT BooleanBuilder : public ArrayBuilder {
Status Append(const uint8_t* values, int64_t length, const std::vector<bool>& is_valid);
/// \brief Append a sequence of elements in one shot
+ /// \param[in] values a std::vector of bytes
+ /// \param[in] is_valid an std::vector<bool> indicating valid (1) or null
+ /// (0). Equal in length to values
+ /// \return Status
+ Status Append(const std::vector<uint8_t>& values, const std::vector<bool>& is_valid);
+
+ /// \brief Append a sequence of elements in one shot
+ /// \param[in] values a std::vector of bytes
+ /// \return Status
+ Status Append(const std::vector<uint8_t>& values);
+
+ /// \brief Append a sequence of elements in one shot
/// \param[in] values an std::vector<bool> indicating true (1) or false
/// \param[in] is_valid an std::vector<bool> indicating valid (1) or null
/// (0). Equal in length to values
/// \return Status
Status Append(const std::vector<bool>& values, const std::vector<bool>& is_valid);
+ /// \brief Append a sequence of elements in one shot
+ /// \param[in] values an std::vector<bool> indicating true (1) or false
+ /// \return Status
+ Status Append(const std::vector<bool>& values);
+
Status Finish(std::shared_ptr<Array>* out) override;
Status Init(int64_t capacity) override;