Repository: incubator-quickstep Updated Branches: refs/heads/LIP-for-tpch-merged 3d8b738ea -> 11b01099e
Partial work, try 02 Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/a9cfdd1a Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/a9cfdd1a Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/a9cfdd1a Branch: refs/heads/LIP-for-tpch-merged Commit: a9cfdd1ab962680108a90a5a4a9198ae99967eb5 Parents: 3d8b738 Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Tue Aug 23 15:11:52 2016 -0500 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Tue Aug 23 15:11:52 2016 -0500 ---------------------------------------------------------------------- relational_operators/HashJoinOperator.cpp | 47 +++++++++++++------- storage/CountedReference.hpp | 4 +- storage/EvictionPolicy.cpp | 17 +++---- types/containers/ColumnVector.hpp | 43 +++++++++++++++--- types/containers/ColumnVectorsValueAccessor.hpp | 25 ++++++----- utility/BitVector.hpp | 31 ++++++++++++- 6 files changed, 124 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/relational_operators/HashJoinOperator.cpp ---------------------------------------------------------------------- diff --git a/relational_operators/HashJoinOperator.cpp b/relational_operators/HashJoinOperator.cpp index 70fbb1a..a45eb24 100644 --- a/relational_operators/HashJoinOperator.cpp +++ b/relational_operators/HashJoinOperator.cpp @@ -471,6 +471,7 @@ void HashInnerJoinWorkOrder::execute() { // materialize_line->emplace_back(); // iterate_line->emplace_back(); +// std::cout << "here!\n"; ColumnVectorsValueAccessor temp_result; for (std::pair<const block_id, std::vector<std::pair<tuple_id, tuple_id>>> &build_block_entry : *collector.getJoinedTuples()) { @@ -529,18 +530,34 @@ void HashInnerJoinWorkOrder::execute() { // benefit (probably only a real performance win when there are very few // matching tuples in each individual inner block but very many inner // blocks with at least one match). - std::size_t i = 0; + std::vector<std::unique_ptr<ColumnVector>> columns; for (vector<unique_ptr<const Scalar>>::const_iterator selection_cit = selection_.begin(); selection_cit != selection_.end(); - ++selection_cit, ++i) { - temp_result.appendColumn((*selection_cit)->getAllValuesForJoin(build_relation_id, - build_accessor.get(), - probe_relation_id, - probe_accessor.get(), - build_block_entry.second), - i); + ++selection_cit) { + columns.emplace_back( + std::unique_ptr<ColumnVector>( + (*selection_cit)->getAllValuesForJoin(build_relation_id, + build_accessor.get(), + probe_relation_id, + probe_accessor.get(), + build_block_entry.second))); } + temp_result.appendColumns(&columns, build_block_entry.second.size()); + +// ColumnVectorsValueAccessor temp_result; +// for (vector<unique_ptr<const Scalar>>::const_iterator selection_cit = selection_.begin(); +// selection_cit != selection_.end(); +// ++selection_cit) { +// temp_result.addColumn( +// (*selection_cit)->getAllValuesForJoin(build_relation_id, +// build_accessor.get(), +// probe_relation_id, +// probe_accessor.get(), +// build_block_entry.second)); +// } +// output_destination_->bulkInsertTuples(&temp_result); + // iterate_line->emplace_back(); } // iterate_line->back().endEvent(); @@ -551,13 +568,13 @@ void HashInnerJoinWorkOrder::execute() { // materialize_line->back().endEvent(); // materialize_line->back().setPayload(getOperatorIndex(), collector.getJoinedTuples()->size()); - if (build_relation_id == 0 && - probe_relation_id == 0 && - residual_predicate_ == nullptr && - output_destination_ == nullptr && - selection_.empty()) { - return; - } +// if (build_relation_id == 0 && +// probe_relation_id == 0 && +// residual_predicate_ == nullptr && +// output_destination_ == nullptr && +// selection_.empty()) { +// return; +// } } void HashSemiJoinWorkOrder::execute() { http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/storage/CountedReference.hpp ---------------------------------------------------------------------- diff --git a/storage/CountedReference.hpp b/storage/CountedReference.hpp index 49d0f73..2d9cec3 100644 --- a/storage/CountedReference.hpp +++ b/storage/CountedReference.hpp @@ -66,7 +66,7 @@ class CountedReference { **/ CountedReference(T *block, EvictionPolicy *eviction_policy) : block_(block), eviction_policy_(eviction_policy) { -// eviction_policy_->blockReferenced(block_->getID()); + eviction_policy_->blockReferenced(block_->getID()); #ifdef QUICKSTEP_DEBUG block_->ref(); #endif @@ -111,7 +111,7 @@ class CountedReference { #ifdef QUICKSTEP_DEBUG block_->unref(); #endif -// eviction_policy_->blockUnreferenced(block_->getID()); + eviction_policy_->blockUnreferenced(block_->getID()); } } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/storage/EvictionPolicy.cpp ---------------------------------------------------------------------- diff --git a/storage/EvictionPolicy.cpp b/storage/EvictionPolicy.cpp index 2f10f09..7af7f93 100644 --- a/storage/EvictionPolicy.cpp +++ b/storage/EvictionPolicy.cpp @@ -44,14 +44,15 @@ using std::chrono::microseconds; namespace quickstep { EvictionPolicy::Status EvictAnyBlockEvictionPolicy::chooseBlockToEvict(block_id* block) { - MutexLock lock(mutex_); - if (nonreferenced_blocks_.empty()) { - return Status::kBlockNotFound; - } - std::unordered_set<block_id>::const_iterator it = nonreferenced_blocks_.begin(); - *block = *it; - ref_counts_.erase(*it); - nonreferenced_blocks_.erase(it); +// MutexLock lock(mutex_); +// if (nonreferenced_blocks_.empty()) { +// return Status::kBlockNotFound; +// } +// std::unordered_set<block_id>::const_iterator it = nonreferenced_blocks_.begin(); +// *block = *it; +// ref_counts_.erase(*it); +// nonreferenced_blocks_.erase(it); + LOG(FATAL) << "No eviction allowed"; return Status::kOk; } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/types/containers/ColumnVector.hpp ---------------------------------------------------------------------- diff --git a/types/containers/ColumnVector.hpp b/types/containers/ColumnVector.hpp index b95ae98..c1cbff6 100644 --- a/types/containers/ColumnVector.hpp +++ b/types/containers/ColumnVector.hpp @@ -107,7 +107,7 @@ class ColumnVector { **/ virtual bool isNative() const = 0; - virtual bool append(ColumnVector *column_vector) = 0; + virtual bool append(const ColumnVector *column_vector) = 0; protected: const Type &type_; @@ -401,12 +401,13 @@ class NativeColumnVector : public ColumnVector { } } - bool append(ColumnVector *column_vector) override { + bool append(const ColumnVector *column_vector) override { // Other ColumnVector also has to be native. if (!column_vector->isNative()) { return false; } - NativeColumnVector *casted_column_vector = static_cast<NativeColumnVector*>(column_vector); + const NativeColumnVector *casted_column_vector = + static_cast<const NativeColumnVector*>(column_vector); // Both ColumnVectors has to have same type to be appended. if (!type_.equals(casted_column_vector->type_) || type_length_ != casted_column_vector->type_length_) { @@ -421,7 +422,9 @@ class NativeColumnVector : public ColumnVector { new_reserved_length = reserved_length_; } - void *new_buffer = std::realloc(values_, new_reserved_length); + void *new_buffer = std::realloc(values_, + type_length_ * new_reserved_length); + if (new_buffer == nullptr) { return false; } @@ -433,6 +436,11 @@ class NativeColumnVector : public ColumnVector { reserved_length_ = new_reserved_length; actual_length_ = new_actual_length; + + if (null_bitmap_) { + return null_bitmap_->append((casted_column_vector->null_bitmap_).get()); + } + return true; } @@ -628,13 +636,36 @@ class IndirectColumnVector : public ColumnVector { values_[position] = std::move(value); } - bool append(ColumnVector *column_vector) override { + bool append(const ColumnVector *column_vector) override { + if (column_vector->isNative()) { + return false; + } + const IndirectColumnVector *casted_column_vector = + static_cast<const IndirectColumnVector*>(column_vector); + // Both ColumnVectors has to have same type to be appended. + if (!type_.equals(casted_column_vector->type_) + || type_is_nullable_ != casted_column_vector->type_is_nullable_) { + return false; + } + + std::size_t new_actual_length = values_.size() + casted_column_vector->values_.size(); + std::size_t new_reserved_length + = (new_actual_length > reserved_length_) + ? (new_actual_length * 2) + : (reserved_length_); + + values_.reserve(new_reserved_length); + values_.insert(values_.end(), + casted_column_vector->values_.begin(), + casted_column_vector->values_.end()); + reserved_length_ = new_reserved_length; + return true; } private: const bool type_is_nullable_; - const std::size_t reserved_length_; + std::size_t reserved_length_; std::vector<TypedValue> values_; DISALLOW_COPY_AND_ASSIGN(IndirectColumnVector); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/types/containers/ColumnVectorsValueAccessor.hpp ---------------------------------------------------------------------- diff --git a/types/containers/ColumnVectorsValueAccessor.hpp b/types/containers/ColumnVectorsValueAccessor.hpp index 05ec7ee..ed2ee76 100644 --- a/types/containers/ColumnVectorsValueAccessor.hpp +++ b/types/containers/ColumnVectorsValueAccessor.hpp @@ -22,6 +22,7 @@ #include <cstddef> #include <limits> +#include <memory> #include <utility> #include <vector> @@ -92,20 +93,24 @@ class ColumnVectorsValueAccessor : public ValueAccessor { : static_cast<const IndirectColumnVector*>(column)->size(); } - void appendColumn(ColumnVector *column, const std::size_t index, const bool owns = true) { - if (index >= columns_.size()) { - addColumn(column, owns); + void appendColumns(std::vector<std::unique_ptr<ColumnVector>> *columns, + const std::size_t length) { + if (columns_.empty()) { + for (auto &column : *columns) { + addColumn(column.release(), true); + } } else { - ColumnVector *old_column = columns_[index]; - old_column->append(column); - const int appended_column_length - = column->isNative() - ? static_cast<const NativeColumnVector*>(column)->size() - : static_cast<const IndirectColumnVector*>(column)->size(); - column_length_ += appended_column_length; + for (std::size_t i = 0; i < columns_.size(); ++i) { + columns_[i]->append(columns->at(i).get()); + } + column_length_ += length; } } + void increaseColumnLength(const std::size_t delta_length) { + column_length_ += delta_length; + } + inline void beginIteration() { current_position_ = std::numeric_limits<std::size_t>::max(); } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/a9cfdd1a/utility/BitVector.hpp ---------------------------------------------------------------------- diff --git a/utility/BitVector.hpp b/utility/BitVector.hpp index bb76315..c47d150 100644 --- a/utility/BitVector.hpp +++ b/utility/BitVector.hpp @@ -829,6 +829,33 @@ class BitVector { return num_bits_; } + bool append(BitVector *other) { + std::size_t total_data_array_size = data_array_size_ + other->data_array_size_; + + std::size_t *new_data_array_ = reinterpret_cast<std::size_t*>(std::realloc(data_array_, total_data_array_size)); + if (new_data_array_ == nullptr) { + return false; + } + // Swap pointers. + std::swap(data_array_, new_data_array_); + + // Copy other BitVector's data. + std::memcpy(reinterpret_cast<std::uint8_t*>(data_array_) + data_array_size_, + other->data_array_, + other->data_array_size_); + + // Not complete (it is working only under vector<std::size_t> impl.) + const std::size_t excess_bits_at_original = num_bits_ % kSizeTBits; + const std::size_t old_num_bits = num_bits_; + // Update private fields to make shiftTailForward work correctly. + data_array_size_ = total_data_array_size; + num_bits_ = num_bits_ + other->num_bits_; + + shiftTailForward(old_num_bits, excess_bits_at_original); + + return true; + } + private: // This works as long as the bit-width of size_t is power of 2: static const std::size_t kLowerOrderMask = (sizeof(std::size_t) << 3) - 1; @@ -1166,8 +1193,8 @@ class BitVector { const bool owned_; const bool short_version_; // Vector is 32 bits or less, so we use not even a full size_t. std::size_t *data_array_; - const std::size_t num_bits_; - const std::size_t data_array_size_; + std::size_t num_bits_; + std::size_t data_array_size_; DISALLOW_COPY_AND_ASSIGN(BitVector); };