Skip to content

Commit

Permalink
Merge pull request #1054 from kuzudb/fix-968
Browse files Browse the repository at this point in the history
fixed multi extract/slice
  • Loading branch information
aziz-mu committed Nov 23, 2022
2 parents 0ec32c0 + dc87fee commit e558c54
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 27 deletions.
9 changes: 7 additions & 2 deletions src/antlr4/Cypher.g4
Original file line number Diff line number Diff line change
Expand Up @@ -334,8 +334,13 @@ oC_StringListNullOperatorExpression
: oC_PropertyOrLabelsExpression ( oC_StringOperatorExpression | oC_ListOperatorExpression | oC_NullOperatorExpression )? ;

oC_ListOperatorExpression
: ( SP ? '[' oC_Expression ']' )
| ( SP ? '[' oC_Expression? ':' oC_Expression? ']' );
: ( kU_ListExtractOperatorExpression | kU_ListSliceOperatorExpression ) oC_ListOperatorExpression ? ;

kU_ListExtractOperatorExpression
: SP ? '[' oC_Expression ']' ;

kU_ListSliceOperatorExpression
: SP ? '[' oC_Expression? ':' oC_Expression? ']' ;

oC_StringOperatorExpression
: ( ( SP STARTS SP WITH ) | ( SP ENDS SP WITH ) | ( SP CONTAINS ) ) SP? oC_PropertyOrLabelsExpression ;
Expand Down
8 changes: 8 additions & 0 deletions src/parser/include/transformer.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,14 @@ class Transformer {
CypherParser::OC_ListOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression);

unique_ptr<ParsedExpression> transformListSliceOperatorExpression(
CypherParser::KU_ListSliceOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression);

unique_ptr<ParsedExpression> transformListExtractOperatorExpression(
CypherParser::KU_ListExtractOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression);

unique_ptr<ParsedExpression> transformNullOperatorExpression(
CypherParser::OC_NullOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression);
Expand Down
76 changes: 51 additions & 25 deletions src/parser/transformer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,36 +498,62 @@ unique_ptr<ParsedExpression> Transformer::transformListOperatorExpression(
CypherParser::OC_ListOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression) {
auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText();
unique_ptr<ParsedExpression> listOperator;
if (ctx.kU_ListSliceOperatorExpression()) {
listOperator = transformListSliceOperatorExpression(
*ctx.kU_ListSliceOperatorExpression(), move(propertyExpression));
} else {
listOperator = transformListExtractOperatorExpression(
*ctx.kU_ListExtractOperatorExpression(), move(propertyExpression));
}
if (ctx.oC_ListOperatorExpression()) {
return transformListOperatorExpression(
*ctx.oC_ListOperatorExpression(), move(listOperator));
} else {
return listOperator;
}
}

if (ctx.children[1]->getText() == ":" || ctx.children[2]->getText() == ":") {
auto listSlice =
make_unique<ParsedFunctionExpression>(LIST_SLICE_FUNC_NAME, move(rawExpression));
listSlice->addChild(move(propertyExpression));
if (ctx.children[1]->getText() == ":") {
listSlice->addChild(getZeroLiteral());
if (ctx.oC_Expression(0)) {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
} else {
listSlice->addChild(getZeroLiteral());
}
unique_ptr<ParsedExpression> Transformer::transformListSliceOperatorExpression(
CypherParser::KU_ListSliceOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression) {
auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText();
auto listSlice =
make_unique<ParsedFunctionExpression>(LIST_SLICE_FUNC_NAME, move(rawExpression));
listSlice->addChild(move(propertyExpression));
if (ctx.children[1]->getText() == ":") {
listSlice->addChild(getZeroLiteral());
// Parsing [:right] syntax.
if (ctx.oC_Expression(0)) {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
// Parsing [:] syntax.
} else {
if (ctx.oC_Expression(1)) {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
listSlice->addChild(transformExpression(*ctx.oC_Expression(1)));
} else {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
listSlice->addChild(getZeroLiteral());
}
listSlice->addChild(getZeroLiteral());
}
return listSlice;
} else {
auto listExtract =
make_unique<ParsedFunctionExpression>(LIST_EXTRACT_FUNC_NAME, move(rawExpression));
listExtract->addChild(move(propertyExpression));
listExtract->addChild(transformExpression(*ctx.oC_Expression(0)));
return listExtract;
// Parsing [left:right] syntax.
if (ctx.oC_Expression(1)) {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
listSlice->addChild(transformExpression(*ctx.oC_Expression(1)));
// Parsing [left:] syntax.
} else {
listSlice->addChild(transformExpression(*ctx.oC_Expression(0)));
listSlice->addChild(getZeroLiteral());
}
}
}
return listSlice;
};

unique_ptr<ParsedExpression> Transformer::transformListExtractOperatorExpression(
CypherParser::KU_ListExtractOperatorExpressionContext& ctx,
unique_ptr<ParsedExpression> propertyExpression) {
auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText();
auto listExtract =
make_unique<ParsedFunctionExpression>(LIST_EXTRACT_FUNC_NAME, move(rawExpression));
listExtract->addChild(move(propertyExpression));
listExtract->addChild(transformExpression(*ctx.oC_Expression()));
return listExtract;
};

unique_ptr<ParsedExpression> Transformer::transformNullOperatorExpression(
CypherParser::OC_NullOperatorExpressionContext& ctx,
Expand Down
37 changes: 37 additions & 0 deletions test/test_files/tinySNB/function/list.test
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,31 @@ Fesdwe
Grad
Ad

-NAME ListExtractDoubleExtract
-QUERY MATCH (a:person) RETURN a.courseScoresPerTerm[1][1]
---- 8
10
8
8
7
6
8
10
7

-NAME ListExtractSliceListOfStrings
-QUERY MATCH (a:person) RETURN a.usedNames[1][3:7]
---- 8
da
bby
rmen
lfesc
n
sdwe
ad



-NAME ListLenStructuredListOfInts
-QUERY MATCH (a:person) RETURN len(a.workedHours)
---- 8
Expand Down Expand Up @@ -665,6 +690,18 @@ ABFsUni
CsWork
DEsWork

-NAME ListSliceStructuredStringDoubleSlice
-QUERY MATCH (a:person) RETURN a.fName[3:][2:4]
---- 8
ce

ol

zab
ooq
g
ert

-NAME ListCreateFromLiteral1
-QUERY RETURN [[100,200],[200,300],[300,400]]
---- 1
Expand Down

0 comments on commit e558c54

Please sign in to comment.