Skip to content

Commit

Permalink
filter out previous path which do not met the conditions (#5159)
Browse files Browse the repository at this point in the history
Co-authored-by: Sophie <84560950+Sophie-Xie@users.noreply.github.com>
  • Loading branch information
nevermore3 and Sophie-Xie committed Dec 30, 2022
1 parent ffaa254 commit 5aa2388
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 2 deletions.
35 changes: 33 additions & 2 deletions src/graph/executor/query/TraverseExecutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,39 @@ folly::Future<Status> TraverseExecutor::handleResponse(RpcResponse&& resps) {
}
auto listVal = std::make_shared<Value>(std::move(list));
auto iter = std::make_unique<GetNeighborsIter>(listVal);
if (currentStep_ == 1 && range_ && range_->min() == 0) {
result_.rows = buildZeroStepPath(iter.get());
if (currentStep_ == 1) {
if (range_ && range_->min() == 0) {
result_.rows = buildZeroStepPath(iter.get());
}
// match (v)-[e:Rel]-(v1:Label1)-[e1*2]->() where id(v0) in [6, 23] return v1
// the attributes of v1 will be obtained in the second traverse operator
// If the conditions are not met, the path in the previous step needs to be filtered out
if (!dst2PathsMap_.empty()) {
std::unordered_set<Value, VertexHash, VertexEqual> existVids;
existVids.reserve(iter->numRows());
auto vertices = iter->getVertices();
for (auto& vertex : vertices.values) {
if (vertex.isVertex()) {
existVids.emplace(vertex);
}
}
auto dst2PathIter = dst2PathsMap_.begin();
while (dst2PathIter != dst2PathsMap_.end()) {
if (existVids.find(dst2PathIter->first) == existVids.end()) {
dst2PathIter = dst2PathsMap_.erase(dst2PathIter);
} else {
dst2PathIter++;
}
}
auto initVidIter = initVids_.begin();
while (initVidIter != initVids_.end()) {
if (existVids.find(*initVidIter) == existVids.end()) {
initVidIter = initVids_.erase(initVidIter);
} else {
initVidIter++;
}
}
}
}
expand(iter.get());
if (!isFinalStep()) {
Expand Down
53 changes: 53 additions & 0 deletions tests/tck/features/bugfix/MatchNodeLabelFilter.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Copyright (c) 2022 vesoft inc. All rights reserved.
#
# This source code is licensed under Apache 2.0 License.
Feature: match node label filter

Background:
Given a graph with space named "nba"

Scenario: node label filter
When executing query:
"""
MATCH (v0)<-[e0:like]-(v1:bachelor)-[e1*2]->()
WHERE id(v0) in ['Tony Parker', 'Spurs', 'Yao Ming']
return type(e0), labels(v1)
"""
Then the result should be, in any order:
| type(e0) | labels(v1) |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
| "like" | ["bachelor", "player"] |
When executing query:
"""
MATCH (v0)<-[e0:like]-(v1:bachelor)-[e1*0..2]->()
WHERE id(v0) in ['Tony Parker', 'Spurs', 'Yao Ming']
return labels(v1), count(*)
"""
Then the result should be, in any order:
| labels(v1) | count(*) |
| ["bachelor", "player"] | 34 |

0 comments on commit 5aa2388

Please sign in to comment.