1
0
Fork 0

optimize lookups by shard key for smart vertex collections (#8641)

This commit is contained in:
Jan 2019-04-03 15:15:46 +02:00 committed by GitHub
parent 7cd84a785a
commit 0764e045fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 9 deletions

View File

@ -150,12 +150,25 @@ std::shared_ptr<std::vector<std::string>> Collection::shardIds(
} }
/// @brief returns the shard keys of a collection /// @brief returns the shard keys of a collection
std::vector<std::string> Collection::shardKeys() const { std::vector<std::string> Collection::shardKeys(bool normalize) const {
auto coll = getCollection(); auto coll = getCollection();
std::vector<std::string> keys; auto const& originalKeys = coll->shardKeys();
for (auto const& x : coll->shardKeys()) {
keys.emplace_back(x); if (normalize &&
coll->isSmart() && coll->type() == TRI_COL_TYPE_DOCUMENT) {
// smart vertex collection always has ["_key:"] as shard keys
TRI_ASSERT(originalKeys.size() == 1);
TRI_ASSERT(originalKeys[0] == "_key:");
// now normalize it this to _key
return std::vector<std::string>{ StaticStrings::KeyString };
} }
std::vector<std::string> keys;
keys.reserve(originalKeys.size());
for (auto const& key : originalKeys) {
keys.emplace_back(key);
}
return keys; return keys;
} }

View File

@ -103,7 +103,9 @@ struct Collection {
std::shared_ptr<std::vector<std::string>> shardIds(std::unordered_set<std::string> const& includedShards) const; std::shared_ptr<std::vector<std::string>> shardIds(std::unordered_set<std::string> const& includedShards) const;
/// @brief returns the shard keys of a collection /// @brief returns the shard keys of a collection
std::vector<std::string> shardKeys() const; /// if "normalize" is true, then the shard keys for a smart vertex collection
/// will be reported as "_key" instead of "_key:"
std::vector<std::string> shardKeys(bool normalize) const;
size_t numberOfShards() const; size_t numberOfShards() const;

View File

@ -599,7 +599,7 @@ std::string getSingleShardId(arangodb::aql::ExecutionPlan const* plan,
} }
// note for which shard keys we need to look for // note for which shard keys we need to look for
auto shardKeys = collection->shardKeys(); auto shardKeys = collection->shardKeys(true);
std::unordered_set<std::string> toFind; std::unordered_set<std::string> toFind;
for (auto const& it : shardKeys) { for (auto const& it : shardKeys) {
if (it.find('.') != std::string::npos) { if (it.find('.') != std::string::npos) {
@ -1462,7 +1462,7 @@ class PropagateConstantAttributesHelper {
// don't remove a smart join attribute access! // don't remove a smart join attribute access!
return; return;
} else { } else {
std::vector<std::string> const& shardKeys = logical->shardKeys(); std::vector<std::string> shardKeys = collection->shardKeys(true);
if (std::find(shardKeys.begin(), shardKeys.end(), nameAttribute->getString()) != shardKeys.end()) { if (std::find(shardKeys.begin(), shardKeys.end(), nameAttribute->getString()) != shardKeys.end()) {
// don't remove equality lookups on shard keys, as this may prevent // don't remove equality lookups on shard keys, as this may prevent
// the restrict-to-single-shard rule from being applied later! // the restrict-to-single-shard rule from being applied later!
@ -4812,7 +4812,7 @@ class RemoveToEnumCollFinder final : public WalkerWorker<ExecutionNode> {
break; // abort . . . break; // abort . . .
} }
// check the remove node's collection is sharded over _key // check the remove node's collection is sharded over _key
std::vector<std::string> shardKeys = rn->collection()->shardKeys(); std::vector<std::string> shardKeys = rn->collection()->shardKeys(false);
if (shardKeys.size() != 1 || shardKeys[0] != StaticStrings::KeyString) { if (shardKeys.size() != 1 || shardKeys[0] != StaticStrings::KeyString) {
break; // abort . . . break; // abort . . .
} }
@ -4833,7 +4833,7 @@ class RemoveToEnumCollFinder final : public WalkerWorker<ExecutionNode> {
} }
// note for which shard keys we need to look for // note for which shard keys we need to look for
auto shardKeys = rn->collection()->shardKeys(); auto shardKeys = rn->collection()->shardKeys(false);
std::unordered_set<std::string> toFind; std::unordered_set<std::string> toFind;
for (auto const& it : shardKeys) { for (auto const& it : shardKeys) {
toFind.emplace(it); toFind.emplace(it);