From fa612c7e18e0e5cc678f14ea00c2487a66f24c5d Mon Sep 17 00:00:00 2001 From: Shylock Hg <33566796+Shylock-Hg@users.noreply.github.com> Date: Thu, 29 Jul 2021 18:07:15 +0800 Subject: [PATCH] Support get attribute of date/time/datetime (#1268) * Support get attribute of date/time/datetime. * Return unknown prop * Allow the case insensitive property for date time. Co-authored-by: Yee <2520865+yixinglu@users.noreply.github.com> Co-authored-by: cpw <13495049+CPWstatic@users.noreply.github.com> --- src/visitor/DeduceTypeVisitor.cpp | 28 +++- .../tck/features/expression/Attribute.feature | 148 ++++++++++++++++++ 2 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 tests/tck/features/expression/Attribute.feature diff --git a/src/visitor/DeduceTypeVisitor.cpp b/src/visitor/DeduceTypeVisitor.cpp index d8a0a3806..58723e4f7 100644 --- a/src/visitor/DeduceTypeVisitor.cpp +++ b/src/visitor/DeduceTypeVisitor.cpp @@ -329,14 +329,26 @@ void DeduceTypeVisitor::visit(SubscriptExpression *expr) { void DeduceTypeVisitor::visit(AttributeExpression *expr) { expr->left()->accept(this); if (!ok()) return; - // TODO: Time, DateTime, Date - if (type_ != Value::Type::MAP && type_ != Value::Type::VERTEX && type_ != Value::Type::EDGE && - !isSuperiorType(type_)) { - std::stringstream ss; - ss << "`" << expr->toString() << "', expected Map, Vertex or Edge but was " << type_ << ": " - << expr->left()->toString(); - status_ = Status::SemanticError(ss.str()); - return; + switch (type_) { + case Value::Type::MAP: + case Value::Type::VERTEX: + case Value::Type::EDGE: + case Value::Type::DATE: + case Value::Type::TIME: + case Value::Type::DATETIME: + // nothing + break; + default: { + if (!isSuperiorType(type_)) { + std::stringstream ss; + ss << "`" << expr->toString() << + "', expected type with attribute like Date, Time, DateTime, " + "Map, Vertex or Edge but was " << + type_ << ": " << expr->left()->toString(); + status_ = Status::SemanticError(ss.str()); + return; + } + } } expr->right()->accept(this); diff --git a/tests/tck/features/expression/Attribute.feature b/tests/tck/features/expression/Attribute.feature new file mode 100644 index 000000000..05993c0b0 --- /dev/null +++ b/tests/tck/features/expression/Attribute.feature @@ -0,0 +1,148 @@ +# Copyright (c) 2021 vesoft inc. All rights reserved. +# +# This source code is licensed under Apache 2.0 License, +# attached with Common Clause Condition 1.0, found in the LICENSES directory. +Feature: Attribute + + Background: + Given a graph with space named "nba" + + Scenario: Attribute for basic type + When executing query: + """ + RETURN date("2021-07-19").month AS month + """ + Then the result should be, in any order: + | month | + | 7 | + When executing query: + """ + RETURN date("2021-07-19").MoNth AS month + """ + Then the result should be, in any order: + | month | + | 7 | + When executing query: + """ + RETURN time("02:59:40").minute AS minute + """ + Then the result should be, in any order: + | minute | + | 59 | + When executing query: + """ + RETURN time("02:59:40").MinUte AS minute + """ + Then the result should be, in any order: + | minute | + | 59 | + When executing query: + """ + RETURN datetime("2021-07-19T02:59:40").minute AS minute + """ + Then the result should be, in any order: + | minute | + | 59 | + When executing query: + """ + RETURN datetime("2021-07-19T02:59:40").mInutE AS minute + """ + Then the result should be, in any order: + | minute | + | 59 | + When executing query: + """ + RETURN {k1 : 1, k2: true}.k1 AS k + """ + Then the result should be, in any order: + | k | + | 1 | + When executing query: + """ + RETURN {k1 : 1, k2: true}.K1 AS k + """ + Then the result should be, in any order: + | k | + | UNKNOWN_PROP | + When executing query: + """ + MATCH (v) WHERE id(v) == 'Tim Duncan' RETURN v.name + """ + Then the result should be, in any order: + | v.name | + | "Tim Duncan" | + When executing query: + """ + MATCH (v) WHERE id(v) == 'Tim Duncan' RETURN v.Name + """ + Then the result should be, in any order: + | v.Name | + | UNKNOWN_PROP | + When executing query: + """ + MATCH (v)-[e:like]->() WHERE id(v) == 'Tim Duncan' RETURN e.likeness + """ + Then the result should be, in any order: + | e.likeness | + | 95 | + | 95 | + When executing query: + """ + MATCH (v)-[e:like]->() WHERE id(v) == 'Tim Duncan' RETURN e.Likeness + """ + Then the result should be, in any order: + | e.Likeness | + | UNKNOWN_PROP | + | UNKNOWN_PROP | + + Scenario: Not exists attribute + When executing query: + """ + RETURN date("2021-07-19").not_exists_attr AS not_exists_attr + """ + Then the result should be, in any order: + | not_exists_attr | + | UNKNOWN_PROP | + When executing query: + """ + RETURN time("02:59:40").not_exists_attr AS not_exists_attr + """ + Then the result should be, in any order: + | not_exists_attr | + | UNKNOWN_PROP | + When executing query: + """ + RETURN datetime("2021-07-19T02:59:40").not_exists_attr AS not_exists_attr + """ + Then the result should be, in any order: + | not_exists_attr | + | UNKNOWN_PROP | + When executing query: + """ + RETURN {k1 : 1, k2: true}.not_exists_attr AS not_exists_attr + """ + Then the result should be, in any order: + | not_exists_attr | + | UNKNOWN_PROP | + When executing query: + """ + MATCH (v) WHERE id(v) == 'Tim Duncan' RETURN v.not_exists_attr + """ + Then the result should be, in any order: + | v.not_exists_attr | + | UNKNOWN_PROP | + When executing query: + """ + MATCH (v)-[e:like]->() WHERE id(v) == 'Tim Duncan' RETURN e.not_exists_attr + """ + Then the result should be, in any order: + | e.not_exists_attr | + | UNKNOWN_PROP | + | UNKNOWN_PROP | + + Scenario: Invalid type + When executing query: + """ + RETURN (true).attr + """ + Then a SemanticError should be raised at runtime: `true.attr', expected type with attribute like Date, Time, DateTime, Map, Vertex or Edge but was BOOL: true