From 1516bad1049545741a5e65c71f1a02ddbbeffd72 Mon Sep 17 00:00:00 2001 From: trippli Date: Mon, 13 Jul 2020 21:08:56 +0800 Subject: [PATCH] ajust and more comments on fetch prop on vertex. --- src/graph/FetchVerticesExecutor.cpp | 61 +++++++++++------------------ src/parser/Clauses.h | 6 --- src/parser/TraverseSentences.cpp | 2 +- src/parser/TraverseSentences.h | 13 +++--- src/parser/parser.yy | 4 +- src/parser/test/ParserTest.cpp | 4 +- 6 files changed, 34 insertions(+), 56 deletions(-) diff --git a/src/graph/FetchVerticesExecutor.cpp b/src/graph/FetchVerticesExecutor.cpp index 4aac10bb6b4..0ab83dd81f3 100644 --- a/src/graph/FetchVerticesExecutor.cpp +++ b/src/graph/FetchVerticesExecutor.cpp @@ -14,7 +14,7 @@ namespace graph { FetchVerticesExecutor::FetchVerticesExecutor(Sentence *sentence, ExecutionContext *ectx) : TraverseExecutor(ectx, "fetch_vertices") { - sentence_ = static_cast(sentence); + sentence_ = dynamic_cast(sentence); } Status FetchVerticesExecutor::prepare() { @@ -27,11 +27,11 @@ Status FetchVerticesExecutor::prepareVids() { fromType_ = kRef; auto *expr = sentence_->ref(); if (expr->isInputExpression()) { - auto *iexpr = static_cast(expr); + auto *iexpr = dynamic_cast(expr); colname_ = iexpr->prop(); inputs_p_ = inputs_.get(); } else if (expr->isVariableExpression()) { - auto *vexpr = static_cast(expr); + auto *vexpr = dynamic_cast(expr); auto varname = vexpr->alias(); colname_ = vexpr->prop(); bool existing = false; @@ -146,16 +146,8 @@ Status FetchVerticesExecutor::prepareTags() { } Status FetchVerticesExecutor::prepareYield() { - { - auto *column = new YieldColumn( - new InputPropertyExpression(new std::string("VertexID")), - new std::string("VertexID") - ); - yieldColsHolder_.addColumn(column); - yields_.emplace_back(column); - colNames_.emplace_back("VertexID"); - colTypes_.emplace_back(nebula::cpp2::SupportedType::VID); - } + colNames_.emplace_back("VertexID"); + colTypes_.emplace_back(nebula::cpp2::SupportedType::VID); if (yieldClause_ == nullptr) { // determine which columns to return after received response from storage. for (unsigned i = 0; i < tagNames_.size(); i++) { @@ -182,7 +174,7 @@ Status FetchVerticesExecutor::prepareYield() { } if (col->expr()->isInputExpression()) { - auto *inputExpr = static_cast(col->expr()); + auto *inputExpr = dynamic_cast(col->expr()); auto *colName = inputExpr->prop(); if (*colName == "*") { auto colNames = inputs_p_->getColNames(); @@ -198,7 +190,7 @@ Status FetchVerticesExecutor::prepareYield() { continue; } } else if (col->expr()->isVariableExpression()) { - auto *variableExpr = static_cast(col->expr()); + auto *variableExpr = dynamic_cast(col->expr()); auto *colName = variableExpr->prop(); if (*colName == "*") { auto colNames = inputs_p_->getColNames(); @@ -300,7 +292,7 @@ Status FetchVerticesExecutor::prepareClauses() { if (!status.ok()) { break; } - } while (0); + } while (false); if (!status.ok()) { LOG(ERROR) << "Preparing failed: " << status; @@ -351,8 +343,7 @@ void FetchVerticesExecutor::fetchVertices() { } } processResult(std::move(result)); - return; - }; + }; auto error = [this] (auto &&e) { auto msg = folly::stringPrintf("Get tag props exception: %s.", e.what().c_str()); LOG(ERROR) << msg; @@ -461,24 +452,21 @@ void FetchVerticesExecutor::processResult(RpcResponse &&result) { if (rc != ResultType::SUCCEEDED) { return Status::Error("Column `%s' not found", colname_->c_str()); } - if (dataMap.find(vid) == dataMap.end() && !expCtx_->hasInputProp()) { + auto dsIter = dataMap.find(vid); + if (dsIter == dataMap.end() && !expCtx_->hasInputProp()) { return Status::OK(); } - auto& ds = dataMap[vid]; + auto& ds = dsIter->second; std::vector record; + record.emplace_back(VariantType(vid)); + auto schema = reader->getSchema().get(); Getters getters; getters.getVariableProp = [&] (const std::string &prop) -> OptVariantType { - if (prop == "VertexID") { - return OptVariantType(vid); - } return Collector::getProp(schema, prop, reader); }; getters.getInputProp = [&] (const std::string &prop) -> OptVariantType { - if (prop == "VertexID") { - return OptVariantType(vid); - } return Collector::getProp(schema, prop, reader); }; getters.getAliasProp = [&] (const std::string& tagName, const std::string &prop) -> OptVariantType { @@ -487,8 +475,9 @@ void FetchVerticesExecutor::processResult(RpcResponse &&result) { return tagIdStatus.status(); } TagID tagId = std::move(tagIdStatus).value(); - if (ds.find(tagId) != ds.end()) { - auto vreader = ds[tagId].get(); + auto tagIter = ds.find(tagId); + if (tagIter != ds.end()) { + auto vreader = tagIter->second.get(); auto vschema = vreader->getSchema().get(); return Collector::getProp(vschema, prop, vreader); } else { @@ -543,24 +532,20 @@ void FetchVerticesExecutor::processResult(RpcResponse &&result) { continue; } auto& ds = dataMap[vid]; + std::vector record; + record.emplace_back(VariantType(vid)); + Getters getters; - getters.getInputProp = [&] (const std::string &prop) -> OptVariantType { - if (prop == "VertexID") { - return OptVariantType(vid); - } - std::string errMsg = - folly::stringPrintf("Unknown input prop: %s", prop.c_str()); - return OptVariantType(Status::Error(errMsg)); - }; getters.getAliasProp = [&] (const std::string& tagName, const std::string &prop) -> OptVariantType { auto tagIdStatus = ectx()->schemaManager()->toTagID(spaceId_, tagName); if (!tagIdStatus.ok()) { return tagIdStatus.status(); } TagID tagId = std::move(tagIdStatus).value(); - if (ds.find(tagId) != ds.end()) { - auto vreader = ds[tagId].get(); + auto tagIter = ds.find(tagId); + if (tagIter != ds.end()) { + auto vreader = tagIter->second.get(); auto vschema = vreader->getSchema().get(); return Collector::getProp(vschema, prop, vreader); } else { diff --git a/src/parser/Clauses.h b/src/parser/Clauses.h index 672e1ddc251..24e712c48de 100644 --- a/src/parser/Clauses.h +++ b/src/parser/Clauses.h @@ -272,12 +272,6 @@ class FetchLabels final { } std::string toString() const; - - std::string* release() { - auto label = labels_[0].release(); - delete this; - return label; - } private: std::vector> labels_; }; diff --git a/src/parser/TraverseSentences.cpp b/src/parser/TraverseSentences.cpp index 422704ce4fe..a3c78e806d9 100644 --- a/src/parser/TraverseSentences.cpp +++ b/src/parser/TraverseSentences.cpp @@ -249,7 +249,7 @@ std::string FetchEdgesSentence::toString() const { std::string buf; buf.reserve(256); buf += "FETCH PROP ON "; - buf += *edge_; + buf += edges_->toString(); buf += " "; if (isRef()) { buf += keyRef_->toString(); diff --git a/src/parser/TraverseSentences.h b/src/parser/TraverseSentences.h index e40620f3515..ce6689eec27 100644 --- a/src/parser/TraverseSentences.h +++ b/src/parser/TraverseSentences.h @@ -425,20 +425,20 @@ class EdgeKeyRef final { class FetchEdgesSentence final : public Sentence { public: - FetchEdgesSentence(std::string *edge, + FetchEdgesSentence(FetchLabels *edges, EdgeKeys *keys, YieldClause *clause) { kind_ = Kind::kFetchEdges; - edge_.reset(edge); + edges_.reset(edges); edgeKeys_.reset(keys); yieldClause_.reset(clause); } - FetchEdgesSentence(std::string *edge, + FetchEdgesSentence(FetchLabels *edges, EdgeKeyRef *ref, YieldClause *clause) { kind_ = Kind::kFetchEdges; - edge_.reset(edge); + edges_.reset(edges); keyRef_.reset(ref); yieldClause_.reset(clause); } @@ -472,13 +472,14 @@ class FetchEdgesSentence final : public Sentence { } std::string* edge() const { - return edge_.get(); + // TODO support multi edges. + return edges_.get()->labels().at(0); } std::string toString() const override; private: - std::unique_ptr edge_; + std::unique_ptr edges_; std::unique_ptr edgeKeys_; std::unique_ptr keyRef_; std::unique_ptr yieldClause_; diff --git a/src/parser/parser.yy b/src/parser/parser.yy index 169d7f0825f..07248778fb3 100644 --- a/src/parser/parser.yy +++ b/src/parser/parser.yy @@ -928,11 +928,11 @@ edge_key_ref: fetch_edges_sentence : KW_FETCH KW_PROP KW_ON fetch_labels edge_keys yield_clause { - auto fetch = new FetchEdgesSentence($4->release(), $5, $6); + auto fetch = new FetchEdgesSentence($4, $5, $6); $$ = fetch; } | KW_FETCH KW_PROP KW_ON fetch_labels edge_key_ref yield_clause { - auto fetch = new FetchEdgesSentence($4->release(), $5, $6); + auto fetch = new FetchEdgesSentence($4, $5, $6); $$ = fetch; } ; diff --git a/src/parser/test/ParserTest.cpp b/src/parser/test/ParserTest.cpp index bc420135edc..b8d86ef74fd 100644 --- a/src/parser/test/ParserTest.cpp +++ b/src/parser/test/ParserTest.cpp @@ -1826,9 +1826,7 @@ TEST(Parser, GroupBy) { "F_STD($^.person.name ), " "F_BIT_AND($^.person.name ), " "F_BIT_OR($^.person.name ), " - "F_BIT_XOR($^.person.name ), " - "COLLECT_LIST($^.person.name ), " - "COLLECT_SET($^.person.name )"; + "F_BIT_XOR($^.person.name )"; auto result = parser.parse(query); ASSERT_TRUE(result.ok()) << result.status();