You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by ji...@apache.org on 2017/07/10 20:36:53 UTC

incubator-quickstep git commit: Refactored PartitionAwareInsertDestination::getPartitionId.

Repository: incubator-quickstep
Updated Branches:
  refs/heads/master f35bd8f60 -> aebe60af8


Refactored PartitionAwareInsertDestination::getPartitionId.


Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/aebe60af
Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/aebe60af
Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/aebe60af

Branch: refs/heads/master
Commit: aebe60af8d73a382eead24dee3c9eb5b840bc666
Parents: f35bd8f
Author: Zuyu Zhang <zu...@apache.org>
Authored: Tue Jun 27 20:16:35 2017 -0500
Committer: Zuyu Zhang <zu...@cs.wisc.edu>
Committed: Mon Jul 10 14:41:58 2017 -0500

----------------------------------------------------------------------
 storage/InsertDestination.cpp | 16 ++++++----------
 storage/InsertDestination.hpp | 34 +++++++++++++++++++++++++---------
 2 files changed, 31 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/aebe60af/storage/InsertDestination.cpp
----------------------------------------------------------------------
diff --git a/storage/InsertDestination.cpp b/storage/InsertDestination.cpp
index 3caa80f..ff39c55 100644
--- a/storage/InsertDestination.cpp
+++ b/storage/InsertDestination.cpp
@@ -619,19 +619,17 @@ void PartitionAwareInsertDestination::bulkInsertTuples(ValueAccessor *accessor,
       [this,
        &always_mark_full,
        &num_partitions](auto *accessor) -> void {  // NOLINT(build/c++11)
-    std::vector<std::unique_ptr<TupleIdSequence>> partition_membership;
+    std::vector<std::unique_ptr<TupleIdSequence>> partition_membership(num_partitions);
 
     // Create a tuple-id sequence for each partition.
     for (std::size_t partition = 0; partition < num_partitions; ++partition) {
-      partition_membership.emplace_back(std::make_unique<TupleIdSequence>(accessor->getEndPosition()));
+      partition_membership[partition] = std::make_unique<TupleIdSequence>(accessor->getEndPosition());
     }
 
     // Iterate over ValueAccessor for each tuple,
     // set a bit in the appropriate TupleIdSequence.
     accessor->beginIteration();
-    while (accessor->next()) {
-      partition_membership[this->getPartitionId(accessor)]->set(accessor->getCurrentPosition(), true);
-    }
+    this->setPartitionMembership(&partition_membership, accessor);
 
     // For each partition, create an adapter around Value Accessor and
     // TupleIdSequence.
@@ -670,19 +668,17 @@ void PartitionAwareInsertDestination::bulkInsertTuplesWithRemappedAttributes(
        &attribute_map,
        &always_mark_full,
        &num_partitions](auto *accessor) -> void {  // NOLINT(build/c++11)
-    std::vector<std::unique_ptr<TupleIdSequence>> partition_membership;
+    std::vector<std::unique_ptr<TupleIdSequence>> partition_membership(num_partitions);
 
     // Create a tuple-id sequence for each partition.
     for (std::size_t partition = 0; partition < num_partitions; ++partition) {
-      partition_membership.emplace_back(std::make_unique<TupleIdSequence>(accessor->getEndPosition()));
+      partition_membership[partition] = std::make_unique<TupleIdSequence>(accessor->getEndPosition());
     }
 
     // Iterate over ValueAccessor for each tuple,
     // set a bit in the appropriate TupleIdSequence.
     accessor->beginIteration();
-    while (accessor->next()) {
-      partition_membership[this->getPartitionId(accessor)]->set(accessor->getCurrentPosition(), true);
-    }
+    this->setPartitionMembership(&partition_membership, accessor);
 
     // For each partition, create an adapter around Value Accessor and
     // TupleIdSequence.

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/aebe60af/storage/InsertDestination.hpp
----------------------------------------------------------------------
diff --git a/storage/InsertDestination.hpp b/storage/InsertDestination.hpp
index 878ebb4..c3d5641 100644
--- a/storage/InsertDestination.hpp
+++ b/storage/InsertDestination.hpp
@@ -36,6 +36,7 @@
 #include "storage/StorageBlock.hpp"
 #include "storage/StorageBlockInfo.hpp"
 #include "storage/StorageBlockLayout.hpp"
+#include "storage/TupleIdSequence.hpp"
 #include "storage/ValueAccessor.hpp"
 #include "threading/SpinMutex.hpp"
 #include "threading/ThreadIDBasedMap.hpp"
@@ -612,21 +613,35 @@ class PartitionAwareInsertDestination : public InsertDestination {
   }
 
   partition_id getPartitionId(const Tuple &tuple) const {
-    PartitionSchemeHeader::PartitionValues values;
-    for (const attribute_id attr_id : partition_scheme_header_->getPartitionAttributeIds()) {
-      values.push_back(tuple.getAttributeValue(attr_id));
+    const auto &partition_attr_ids = partition_scheme_header_->getPartitionAttributeIds();
+
+    PartitionSchemeHeader::PartitionValues values(partition_attr_ids.size());
+    for (std::size_t i = 0; i < partition_attr_ids.size(); ++i) {
+      values[i] = tuple.getAttributeValue(partition_attr_ids[i]);
     }
 
     return values.empty() ? input_partition_id_ : partition_scheme_header_->getPartitionId(values);
   }
 
-  partition_id getPartitionId(ValueAccessor *accessor) const {
-    PartitionSchemeHeader::PartitionValues values;
-    for (const attribute_id attr_id : partition_scheme_header_->getPartitionAttributeIds()) {
-      values.push_back(accessor->getTypedValueVirtual(attr_id));
+  template<typename ValueAccessorT>
+  void setPartitionMembership(std::vector<std::unique_ptr<TupleIdSequence>> *partition_membership,
+                              ValueAccessorT *accessor) const {
+    const auto &partition_attr_ids = partition_scheme_header_->getPartitionAttributeIds();
+
+    if (partition_attr_ids.empty()) {
+      while (accessor->next()) {
+        (*partition_membership)[input_partition_id_]->set(accessor->getCurrentPosition(), true);
+      }
+    } else {
+      PartitionSchemeHeader::PartitionValues values(partition_attr_ids.size());
+      while (accessor->next()) {
+        for (std::size_t i = 0; i < partition_attr_ids.size(); ++i) {
+          values[i] = accessor->getTypedValue(partition_attr_ids[i]);
+        }
+        (*partition_membership)[partition_scheme_header_->getPartitionId(values)]->set(
+            accessor->getCurrentPosition(), true);
+      }
     }
-
-    return values.empty() ? input_partition_id_ : partition_scheme_header_->getPartitionId(values);
   }
 
   std::unique_ptr<const PartitionSchemeHeader> partition_scheme_header_;
@@ -646,6 +661,7 @@ class PartitionAwareInsertDestination : public InsertDestination {
 
   DISALLOW_COPY_AND_ASSIGN(PartitionAwareInsertDestination);
 };
+
 /** @} */
 
 }  // namespace quickstep