Skip to content

Commit

Permalink
extract attribute from properties function
Browse files Browse the repository at this point in the history
  • Loading branch information
nevermore3 committed Sep 2, 2022
1 parent 51d84a4 commit 3a0bfd0
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 22 deletions.
69 changes: 49 additions & 20 deletions src/graph/visitor/PropertyTrackerVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@

#include "graph/visitor/PropertyTrackerVisitor.h"

#include <sstream>
#include <unordered_set>

#include "common/expression/Expression.h"
#include "graph/context/QueryContext.h"

Expand Down Expand Up @@ -174,27 +171,69 @@ void PropertyTrackerVisitor::visit(AttributeExpression *expr) {
return;
}
auto &propName = constVal.getStr();
static const int kUnknownEdgeType = 0;
static const int kUnknownType = 0;
switch (lhs->kind()) {
case Expression::Kind::kInputProperty:
case Expression::Kind::kVarProperty: { // $e.name
auto *varPropExpr = static_cast<PropertyExpression *>(lhs);
auto &edgeAlias = varPropExpr->prop();
propsUsed_.insertEdgeProp(edgeAlias, kUnknownEdgeType, propName);
propsUsed_.insertEdgeProp(edgeAlias, kUnknownType, propName);
break;
}
case Expression::Kind::kSubscript: { // $-.e[0].name
auto *subscriptExpr = static_cast<SubscriptExpression *>(lhs);
auto *subLeftExpr = subscriptExpr->left();
if (subLeftExpr->kind() == Expression::Kind::kInputProperty) {
auto *inputPropExpr = static_cast<InputPropertyExpression *>(subLeftExpr);
auto &edgeAlias = inputPropExpr->prop();
propsUsed_.insertEdgeProp(edgeAlias, kUnknownEdgeType, propName);
auto kind = subLeftExpr->kind();
if (kind == Expression::Kind::kInputProperty || kind == Expression::Kind::kVarProperty) {
auto *propExpr = static_cast<PropertyExpression *>(subLeftExpr);
auto &edgeAlias = propExpr->prop();
propsUsed_.insertEdgeProp(edgeAlias, kUnknownType, propName);
}
break;
}
case Expression::Kind::kFunctionCall: { // properties(t3).name
// TODO(jmq) determine whether it is a vertex or edge
auto *funCallExpr = static_cast<FunctionCallExpression *>(lhs);
auto funName = funCallExpr->name();
std::transform(funName.begin(), funName.end(), funName.begin(), ::tolower);
if (funName != "properties") {
break;
}
auto *argExpr = funCallExpr->args()->args().front();
auto kind = argExpr->kind();
switch (kind) {
case Expression::Kind::kInputProperty: {
// match (v) return properties(v).name
auto *inputPropExpr = static_cast<InputPropertyExpression *>(argExpr);
auto &aliasName = inputPropExpr->prop();
propsUsed_.insertVertexProp(aliasName, kUnknownType, propName);
break;
}
case Expression::Kind::kSubscript: {
auto *subscriptExpr = static_cast<SubscriptExpression *>(argExpr);
auto *subLeftExpr = subscriptExpr->left();
auto leftKind = subLeftExpr->kind();
if (leftKind == Expression::Kind::kInputProperty ||
leftKind == Expression::Kind::kVarProperty) {
// match (v)-[e]->(b) return properties(e).start_year
auto *propExpr = static_cast<PropertyExpression *>(subLeftExpr);
auto &aliasName = propExpr->prop();
propsUsed_.insertEdgeProp(aliasName, kUnknownType, propName);
} else if (leftKind == Expression::Kind::kListComprehension) {
// match (v)-[c*2]->(b) retrun properties(c[0]).start_year
// properties([e IN $-.c WHERE is_edge($e)][0]).start_year
auto *listExpr = static_cast<ListComprehensionExpression *>(subLeftExpr);
auto *collectExpr = listExpr->collection();
if (collectExpr->kind() == Expression::Kind::kInputProperty) {
auto *inputPropExpr = static_cast<InputPropertyExpression *>(collectExpr);
auto &aliasName = inputPropExpr->prop();
propsUsed_.insertEdgeProp(aliasName, kUnknownType, propName);
}
}
break;
}
default:
break;
}
break;
}
default:
Expand Down Expand Up @@ -294,15 +333,5 @@ void PropertyTrackerVisitor::visit(EdgeExpression *expr) {
UNUSED(expr);
}

std::string PropertyTrackerVisitor::extractColNameFromInputPropOrVarPropExpr(
const Expression *expr) {
if (expr->kind() == Expression::Kind::kInputProperty ||
expr->kind() == Expression::Kind::kVarProperty) {
auto *propExpr = static_cast<const PropertyExpression *>(expr);
return propExpr->prop();
}
return "";
}

} // namespace graph
} // namespace nebula
2 changes: 0 additions & 2 deletions src/graph/visitor/PropertyTrackerVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,6 @@ class PropertyTrackerVisitor : public ExprVisitorImpl {
void visit(ColumnExpression* expr) override;
void visit(AggregateExpression* expr) override;

std::string extractColNameFromInputPropOrVarPropExpr(const Expression* expr);

const QueryContext* qctx_{nullptr};
GraphSpaceID space_;
PropertyTracker& propsUsed_;
Expand Down

0 comments on commit 3a0bfd0

Please sign in to comment.