Initial commit.
Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/8427d068 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/8427d068 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/8427d068 Branch: refs/heads/fuse-join-with-select Commit: 8427d06842a38c8f97bc5a0115b9e48ee97784aa Parents: cdc1e05 Author: Hakan Memisoglu <hakanmemiso...@gmail.com> Authored: Tue Aug 16 16:40:27 2016 -0500 Committer: hakanmem <hakan...@node-2.fuse-join-select.quickstep-pg0.wisc.cloudlab.us> Committed: Tue Aug 23 13:57:22 2016 -0500 ---------------------------------------------------------------------- query_optimizer/CMakeLists.txt | 1 + query_optimizer/ExecutionGenerator.cpp | 9 ++++++ query_optimizer/PhysicalGenerator.cpp | 2 ++ query_optimizer/physical/HashJoin.cpp | 5 +++ query_optimizer/physical/HashJoin.hpp | 18 ++++++++--- query_optimizer/rules/CMakeLists.txt | 11 +++++++ query_optimizer/rules/FuseJoinSelect.cpp | 43 ++++++++++++++++++++++++++ query_optimizer/rules/FuseJoinSelect.hpp | 33 ++++++++++++++++++++ relational_operators/HashJoinOperator.cpp | 13 +++++++- relational_operators/HashJoinOperator.hpp | 12 +++++++ relational_operators/WorkOrder.proto | 1 + storage/StorageBlock.hpp | 10 ++++-- 12 files changed, 151 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt index 56ae52f..b0bc38b 100644 --- a/query_optimizer/CMakeLists.txt +++ b/query_optimizer/CMakeLists.txt @@ -195,6 +195,7 @@ target_link_libraries(quickstep_queryoptimizer_PhysicalGenerator quickstep_queryoptimizer_LogicalToPhysicalMapper quickstep_queryoptimizer_logical_Logical quickstep_queryoptimizer_physical_Physical + quickstep_queryoptimizer_rules_FuseJoinSelect quickstep_queryoptimizer_rules_PruneColumns quickstep_queryoptimizer_rules_StarSchemaHashJoinOrderOptimization quickstep_queryoptimizer_rules_SwapProbeBuild http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/ExecutionGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp index 2e03e09..c5f3005 100644 --- a/query_optimizer/ExecutionGenerator.cpp +++ b/query_optimizer/ExecutionGenerator.cpp @@ -683,6 +683,14 @@ void ExecutionGenerator::convertHashJoin(const P::HashJoinPtr &physical_plan) { query_context_proto_->add_predicates()->CopyFrom(residual_predicate->getProto()); } + // Convert the left filter predicate proto. + QueryContext::predicate_id left_filter_predicate_index = QueryContext::kInvalidPredicateId; + if (physical_plan->residual_predicate()) { + left_filter_predicate_index = query_context_proto_->predicates_size(); + unique_ptr<const Predicate> left_filter_predicate(convertPredicate(physical_plan->left_filter_predicate())); + query_context_proto_->add_predicates()->CopyFrom(left_filter_predicate->getProto()); + } + // Convert the project expressions proto. const QueryContext::scalar_group_id project_expressions_group_index = query_context_proto_->scalar_groups_size(); @@ -787,6 +795,7 @@ void ExecutionGenerator::convertHashJoin(const P::HashJoinPtr &physical_plan) { insert_destination_index, join_hash_table_index, residual_predicate_index, + left_filter_predicate_index, project_expressions_group_index, is_selection_on_build.get(), join_type)); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/PhysicalGenerator.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/PhysicalGenerator.cpp b/query_optimizer/PhysicalGenerator.cpp index 8f19702..6ad1f8c 100644 --- a/query_optimizer/PhysicalGenerator.cpp +++ b/query_optimizer/PhysicalGenerator.cpp @@ -26,6 +26,7 @@ #include "query_optimizer/Validator.hpp" #include "query_optimizer/logical/Logical.hpp" #include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/rules/FuseJoinSelect.hpp" #include "query_optimizer/rules/PruneColumns.hpp" #include "query_optimizer/rules/StarSchemaHashJoinOrderOptimization.hpp" #include "query_optimizer/rules/SwapProbeBuild.hpp" @@ -100,6 +101,7 @@ P::PhysicalPtr PhysicalGenerator::optimizePlan() { } rules.emplace_back(new PruneColumns()); rules.emplace_back(new SwapProbeBuild()); + rules.emplace_back(new FuseJoinSelect()); for (std::unique_ptr<Rule<P::Physical>> &rule : rules) { physical_plan_ = rule->apply(physical_plan_); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/physical/HashJoin.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/HashJoin.cpp b/query_optimizer/physical/HashJoin.cpp index e186072..fb9fd2c 100644 --- a/query_optimizer/physical/HashJoin.cpp +++ b/query_optimizer/physical/HashJoin.cpp @@ -102,6 +102,11 @@ void HashJoin::getFieldStringItems( non_container_child_field_names->push_back("residual_predicate"); non_container_child_fields->push_back(residual_predicate_); } + if (left_filter_predicate_ != nullptr) { + non_container_child_field_names->push_back("left_filter_predicate"); + non_container_child_fields->push_back(left_filter_predicate_); + } + container_child_field_names->push_back("left_join_attributes"); container_child_fields->push_back(CastSharedPtrVector<OptimizerTreeBase>(left_join_attributes_)); container_child_field_names->push_back("right_join_attributes"); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/physical/HashJoin.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/physical/HashJoin.hpp b/query_optimizer/physical/HashJoin.hpp index c513f77..2133a8a 100644 --- a/query_optimizer/physical/HashJoin.hpp +++ b/query_optimizer/physical/HashJoin.hpp @@ -107,6 +107,10 @@ class HashJoin : public BinaryJoin { return join_type_; } + const expressions::PredicatePtr& left_filter_predicate() const { + return left_filter_predicate_; + } + PhysicalPtr copyWithNewChildren( const std::vector<PhysicalPtr> &new_children) const override { DCHECK_EQ(children().size(), new_children.size()); @@ -136,6 +140,7 @@ class HashJoin : public BinaryJoin { * @param residual_predicate Optional filtering predicate evaluated after join. * @param project_expressions The project expressions. * @param Join type of this hash join. + * @param left_filter_predicate Optional filtering predicate for probe side before join. * @return An immutable physical HashJoin. */ static HashJoinPtr Create( @@ -145,7 +150,8 @@ class HashJoin : public BinaryJoin { const std::vector<expressions::AttributeReferencePtr> &right_join_attributes, const expressions::PredicatePtr &residual_predicate, const std::vector<expressions::NamedExpressionPtr> &project_expressions, - const JoinType join_type) { + const JoinType join_type, + const expressions::PredicatePtr &left_filter_predicate = nullptr) { return HashJoinPtr( new HashJoin(left, right, @@ -153,7 +159,8 @@ class HashJoin : public BinaryJoin { right_join_attributes, residual_predicate, project_expressions, - join_type)); + join_type, + left_filter_predicate)); } protected: @@ -173,18 +180,21 @@ class HashJoin : public BinaryJoin { const std::vector<expressions::AttributeReferencePtr> &right_join_attributes, const expressions::PredicatePtr &residual_predicate, const std::vector<expressions::NamedExpressionPtr> &project_expressions, - const JoinType join_type) + const JoinType join_type, + const expressions::PredicatePtr &left_filter_predicate = nullptr) : BinaryJoin(left, right, project_expressions), left_join_attributes_(left_join_attributes), right_join_attributes_(right_join_attributes), residual_predicate_(residual_predicate), - join_type_(join_type) { + join_type_(join_type), + left_filter_predicate_(left_filter_predicate) { } std::vector<expressions::AttributeReferencePtr> left_join_attributes_; std::vector<expressions::AttributeReferencePtr> right_join_attributes_; expressions::PredicatePtr residual_predicate_; JoinType join_type_; + expressions::PredicatePtr left_filter_predicate_; DISALLOW_COPY_AND_ASSIGN(HashJoin); }; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/rules/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/CMakeLists.txt b/query_optimizer/rules/CMakeLists.txt index d9709ce..22ac1c2 100644 --- a/query_optimizer/rules/CMakeLists.txt +++ b/query_optimizer/rules/CMakeLists.txt @@ -20,6 +20,7 @@ add_subdirectory(tests) # Declare micro-libs: add_library(quickstep_queryoptimizer_rules_BottomUpRule ../../empty_src.cpp BottomUpRule.hpp) add_library(quickstep_queryoptimizer_rules_CollapseProject CollapseProject.cpp CollapseProject.hpp) +add_library(quickstep_queryoptimizer_rules_FuseJoinSelect FuseJoinSelect.cpp FuseJoinSelect.hpp) add_library(quickstep_queryoptimizer_rules_GenerateJoins GenerateJoins.cpp GenerateJoins.hpp) add_library(quickstep_queryoptimizer_rules_PruneColumns PruneColumns.cpp PruneColumns.hpp) add_library(quickstep_queryoptimizer_rules_PushDownFilter PushDownFilter.cpp PushDownFilter.hpp) @@ -50,6 +51,15 @@ target_link_libraries(quickstep_queryoptimizer_rules_CollapseProject quickstep_queryoptimizer_rules_Rule quickstep_queryoptimizer_rules_RuleHelper quickstep_utility_Macros) +target_link_libraries(quickstep_queryoptimizer_rules_FuseJoinSelect + quickstep_queryoptimizer_expressions_Predicate + quickstep_queryoptimizer_physical_HashJoin + quickstep_queryoptimizer_physical_PatternMatcher + quickstep_queryoptimizer_physical_Physical + quickstep_queryoptimizer_physical_Selection + quickstep_queryoptimizer_physical_TableReference + quickstep_queryoptimizer_rules_BottomUpRule + quickstep_queryoptimizer_rules_Rule) target_link_libraries(quickstep_queryoptimizer_rules_GenerateJoins glog quickstep_queryoptimizer_expressions_AttributeReference @@ -189,6 +199,7 @@ add_library(quickstep_queryoptimizer_rules ../../empty_src.cpp OptimizerRulesMod target_link_libraries(quickstep_queryoptimizer_rules quickstep_queryoptimizer_rules_BottomUpRule quickstep_queryoptimizer_rules_CollapseProject + quickstep_queryoptimizer_rules_FuseJoinSelect quickstep_queryoptimizer_rules_GenerateJoins quickstep_queryoptimizer_rules_PruneColumns quickstep_queryoptimizer_rules_PushDownFilter http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/rules/FuseJoinSelect.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/FuseJoinSelect.cpp b/query_optimizer/rules/FuseJoinSelect.cpp new file mode 100644 index 0000000..6a8885f --- /dev/null +++ b/query_optimizer/rules/FuseJoinSelect.cpp @@ -0,0 +1,43 @@ +#include "query_optimizer/rules/FuseJoinSelect.hpp" + +#include "query_optimizer/expressions/Predicate.hpp" +#include "query_optimizer/physical/HashJoin.hpp" +#include "query_optimizer/physical/PatternMatcher.hpp" +#include "query_optimizer/physical/Selection.hpp" +#include "query_optimizer/physical/TableReference.hpp" +#include "query_optimizer/rules/Rule.hpp" + +namespace quickstep { +namespace optimizer { + +namespace P = ::quickstep::optimizer::physical; +namespace E = ::quickstep::optimizer::expressions; + +P::PhysicalPtr FuseJoinSelect::applyToNode(const P::PhysicalPtr &input) { + P::HashJoinPtr hash_join; + P::SelectionPtr selection; + P::TableReferencePtr table_reference; + + if (P::SomeHashJoin::MatchesWithConditionalCast(input, &hash_join) + && hash_join->join_type() == P::HashJoin::JoinType::kInnerJoin + && P::SomeSelection::MatchesWithConditionalCast(hash_join->left(), &selection) + && P::SomeTableReference::MatchesWithConditionalCast(selection->input(), &table_reference)) { + const E::PredicatePtr filter_predicate = selection->filter_predicate(); + P::PhysicalPtr output = P::HashJoin::Create(hash_join->left(), + table_reference, + hash_join->left_join_attributes(), + hash_join->right_join_attributes(), + hash_join->residual_predicate(), + hash_join->project_expressions(), + hash_join->join_type(), + filter_predicate); + LOG_APPLYING_RULE(input, output); + return output; + } + + LOG_IGNORING_RULE(input); + return input; +} + +} +} http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/query_optimizer/rules/FuseJoinSelect.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/rules/FuseJoinSelect.hpp b/query_optimizer/rules/FuseJoinSelect.hpp new file mode 100644 index 0000000..24ac08b --- /dev/null +++ b/query_optimizer/rules/FuseJoinSelect.hpp @@ -0,0 +1,33 @@ +#ifndef QUICKSTEP_QUERY_OPTIMIZER_RULES_FUSE_JOIN_SELECT_HPP_ +#define QUICKSTEP_QUERY_OPTIMIZER_RULES_FUSE_JOIN_SELECT_HPP_ + +#include <string> + +#include "query_optimizer/physical/Physical.hpp" +#include "query_optimizer/rules/Rule.hpp" +#include "query_optimizer/rules/BottomUpRule.hpp" +#include "utility/Macros.hpp" + +namespace quickstep { +namespace optimizer { + +namespace P = ::quickstep::optimizer::physical; + +class FuseJoinSelect : public BottomUpRule<P::Physical> { + public: + FuseJoinSelect() { + } + + std::string getName() const override { return "FuseJoinSelect"; } + + protected: + P::PhysicalPtr applyToNode(const P::PhysicalPtr &input) override; + + private: + DISALLOW_COPY_AND_ASSIGN(FuseJoinSelect); +}; + +} // namespace optimizer +} // namespace quickstep + +#endif http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/relational_operators/HashJoinOperator.cpp ---------------------------------------------------------------------- diff --git a/relational_operators/HashJoinOperator.cpp b/relational_operators/HashJoinOperator.cpp index 779c0fe..43b5a6b 100644 --- a/relational_operators/HashJoinOperator.cpp +++ b/relational_operators/HashJoinOperator.cpp @@ -182,6 +182,8 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders( const Predicate *residual_predicate = query_context->getPredicate(residual_predicate_index_); + const Predicate *left_filter_predicate = + query_context->getPredicate(left_filter_predicate_index_); const vector<unique_ptr<const Scalar>> &selection = query_context->getScalarGroup(selection_index_); InsertDestination *output_destination = @@ -200,6 +202,7 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders( any_join_key_attributes_nullable_, probe_block_id, residual_predicate, + left_filter_predicate, selection, hash_table, output_destination, @@ -220,6 +223,7 @@ bool HashJoinOperator::getAllNonOuterJoinWorkOrders( any_join_key_attributes_nullable_, probe_relation_block_ids_[num_workorders_generated_], residual_predicate, + left_filter_predicate, selection, hash_table, output_destination, @@ -360,6 +364,7 @@ serialization::WorkOrder* HashJoinOperator::createNonOuterJoinWorkOrderProto( proto->SetExtension(serialization::HashJoinWorkOrder::selection_index, selection_index_); proto->SetExtension(serialization::HashJoinWorkOrder::block_id, block); proto->SetExtension(serialization::HashJoinWorkOrder::residual_predicate_index, residual_predicate_index_); + proto->SetExtension(serialization::HashJoinWorkOrder::left_filter_predicate_index, left_filter_predicate_index_); return proto; } @@ -422,7 +427,13 @@ void HashInnerJoinWorkOrder::execute() { storage_manager_->getBlock(block_id_, probe_relation_)); const TupleStorageSubBlock &probe_store = probe_block->getTupleStorageSubBlock(); - std::unique_ptr<ValueAccessor> probe_accessor(probe_store.createValueAccessor()); + std::unique_ptr<ValueAccessor> probe_accessor( + probe_store.createValueAccessor( + left_filter_predicate_ == nullptr + ? nullptr + : probe_block->getMatchesForPredicate(left_filter_predicate_))); + + MapBasedJoinedTupleCollector collector; if (join_key_attributes_.size() == 1) { hash_table_.getAllFromValueAccessor( http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/relational_operators/HashJoinOperator.hpp ---------------------------------------------------------------------- diff --git a/relational_operators/HashJoinOperator.hpp b/relational_operators/HashJoinOperator.hpp index fa393b6..2368f0d 100644 --- a/relational_operators/HashJoinOperator.hpp +++ b/relational_operators/HashJoinOperator.hpp @@ -128,6 +128,7 @@ class HashJoinOperator : public RelationalOperator { const QueryContext::insert_destination_id output_destination_index, const QueryContext::join_hash_table_id hash_table_index, const QueryContext::predicate_id residual_predicate_index, + const QueryContext::predicate_id left_filter_predicate_index, const QueryContext::scalar_group_id selection_index, const std::vector<bool> *is_selection_on_build = nullptr, const JoinType join_type = JoinType::kInnerJoin) @@ -141,6 +142,7 @@ class HashJoinOperator : public RelationalOperator { output_destination_index_(output_destination_index), hash_table_index_(hash_table_index), residual_predicate_index_(residual_predicate_index), + left_filter_predicate_index_(left_filter_predicate_index), selection_index_(selection_index), is_selection_on_build_(is_selection_on_build == nullptr ? std::vector<bool>() @@ -256,6 +258,7 @@ class HashJoinOperator : public RelationalOperator { const QueryContext::insert_destination_id output_destination_index_; const QueryContext::join_hash_table_id hash_table_index_; const QueryContext::predicate_id residual_predicate_index_; + const QueryContext::predicate_id left_filter_predicate_index_; const QueryContext::scalar_group_id selection_index_; const std::vector<bool> is_selection_on_build_; const JoinType join_type_; @@ -304,6 +307,7 @@ class HashInnerJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable, const block_id lookup_block_id, const Predicate *residual_predicate, + const Predicate *left_filter_predicate, const std::vector<std::unique_ptr<const Scalar>> &selection, const JoinHashTable &hash_table, InsertDestination *output_destination, @@ -315,6 +319,7 @@ class HashInnerJoinWorkOrder : public WorkOrder { any_join_key_attributes_nullable_(any_join_key_attributes_nullable), block_id_(lookup_block_id), residual_predicate_(residual_predicate), + left_filter_predicate_(left_filter_predicate), selection_(selection), hash_table_(hash_table), output_destination_(DCHECK_NOTNULL(output_destination)), @@ -386,6 +391,7 @@ class HashInnerJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable_; const block_id block_id_; const Predicate *residual_predicate_; + const Predicate *left_filter_predicate_; const std::vector<std::unique_ptr<const Scalar>> &selection_; const JoinHashTable &hash_table_; @@ -432,6 +438,7 @@ class HashSemiJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable, const block_id lookup_block_id, const Predicate *residual_predicate, + const Predicate *left_filter_predicate, const std::vector<std::unique_ptr<const Scalar>> &selection, const JoinHashTable &hash_table, InsertDestination *output_destination, @@ -443,6 +450,7 @@ class HashSemiJoinWorkOrder : public WorkOrder { any_join_key_attributes_nullable_(any_join_key_attributes_nullable), block_id_(lookup_block_id), residual_predicate_(residual_predicate), + left_filter_predicate_(left_filter_predicate), selection_(selection), hash_table_(hash_table), output_destination_(DCHECK_NOTNULL(output_destination)), @@ -510,6 +518,7 @@ class HashSemiJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable_; const block_id block_id_; const Predicate *residual_predicate_; + const Predicate *left_filter_predicate_; const std::vector<std::unique_ptr<const Scalar>> &selection_; const JoinHashTable &hash_table_; @@ -556,6 +565,7 @@ class HashAntiJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable, const block_id lookup_block_id, const Predicate *residual_predicate, + const Predicate *left_filter_predicate, const std::vector<std::unique_ptr<const Scalar>> &selection, const JoinHashTable &hash_table, InsertDestination *output_destination, @@ -567,6 +577,7 @@ class HashAntiJoinWorkOrder : public WorkOrder { any_join_key_attributes_nullable_(any_join_key_attributes_nullable), block_id_(lookup_block_id), residual_predicate_(residual_predicate), + left_filter_predicate_(left_filter_predicate), selection_(selection), hash_table_(hash_table), output_destination_(DCHECK_NOTNULL(output_destination)), @@ -640,6 +651,7 @@ class HashAntiJoinWorkOrder : public WorkOrder { const bool any_join_key_attributes_nullable_; const block_id block_id_; const Predicate *residual_predicate_; + const Predicate *left_filter_predicate_; const std::vector<std::unique_ptr<const Scalar>> &selection_; const JoinHashTable &hash_table_; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/relational_operators/WorkOrder.proto ---------------------------------------------------------------------- diff --git a/relational_operators/WorkOrder.proto b/relational_operators/WorkOrder.proto index 02aa50e..4874450 100644 --- a/relational_operators/WorkOrder.proto +++ b/relational_operators/WorkOrder.proto @@ -128,6 +128,7 @@ message HashJoinWorkOrder { // Used by all but HashOuterJoinWorkOrder. optional int32 residual_predicate_index = 169; + optional int32 left_filter_predicate_index = 400; // Used by HashOuterJoinWorkOrder only. repeated bool is_selection_on_build = 170; } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/8427d068/storage/StorageBlock.hpp ---------------------------------------------------------------------- diff --git a/storage/StorageBlock.hpp b/storage/StorageBlock.hpp index 97b4773..9041eba 100644 --- a/storage/StorageBlock.hpp +++ b/storage/StorageBlock.hpp @@ -590,6 +590,14 @@ class StorageBlock : public StorageBlockBase { **/ const std::size_t getNumTuples() const; + /** + * @brief Get the ids of tuples that matches with the predicate. + * + * @param predicate The predicate that filters the tuples. + * @return The id sequence of matched tuples. + **/ + TupleIdSequence* getMatchesForPredicate(const Predicate *predicate) const; + private: static TupleStorageSubBlock* CreateTupleStorageSubBlock( const CatalogRelationSchema &relation, @@ -629,8 +637,6 @@ class StorageBlock : public StorageBlockBase { // StorageBlock's header. bool rebuildIndexes(bool short_circuit); - TupleIdSequence* getMatchesForPredicate(const Predicate *predicate) const; - std::unordered_map<attribute_id, TypedValue>* generateUpdatedValues( const ValueAccessor &accessor, const tuple_id tuple,