From 11e99c393b9c9b799c5c620ee391f093ea609548 Mon Sep 17 00:00:00 2001 From: aziz-mu Date: Wed, 23 Nov 2022 11:24:48 -0500 Subject: [PATCH] refactor transformer code --- src/parser/include/transformer.h | 8 +++ src/parser/transformer.cpp | 86 ++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/parser/include/transformer.h b/src/parser/include/transformer.h index da2f24f6836..e67293966df 100644 --- a/src/parser/include/transformer.h +++ b/src/parser/include/transformer.h @@ -128,6 +128,14 @@ class Transformer { CypherParser::OC_ListOperatorExpressionContext& ctx, unique_ptr propertyExpression); + unique_ptr transformListSliceOperatorExpression( + CypherParser::KU_ListSliceOperatorExpressionContext& ctx, + unique_ptr propertyExpression); + + unique_ptr transformListExtractOperatorExpression( + CypherParser::KU_ListExtractOperatorExpressionContext& ctx, + unique_ptr propertyExpression); + unique_ptr transformNullOperatorExpression( CypherParser::OC_NullOperatorExpressionContext& ctx, unique_ptr propertyExpression); diff --git a/src/parser/transformer.cpp b/src/parser/transformer.cpp index ba44722ccbc..883bab84158 100644 --- a/src/parser/transformer.cpp +++ b/src/parser/transformer.cpp @@ -498,50 +498,62 @@ unique_ptr Transformer::transformListOperatorExpression( CypherParser::OC_ListOperatorExpressionContext& ctx, unique_ptr propertyExpression) { auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText(); + unique_ptr listOperator; if (ctx.kU_ListSliceOperatorExpression()) { - auto listSlice = - make_unique(LIST_SLICE_FUNC_NAME, move(rawExpression)); - listSlice->addChild(move(propertyExpression)); - if (ctx.kU_ListSliceOperatorExpression()->children[1]->getText() == ":") { - listSlice->addChild(getZeroLiteral()); - if (ctx.kU_ListSliceOperatorExpression()->oC_Expression(0)) { - listSlice->addChild( - transformExpression(*ctx.kU_ListSliceOperatorExpression()->oC_Expression(0))); - } else { - listSlice->addChild(getZeroLiteral()); - } - } else { - if (ctx.kU_ListSliceOperatorExpression()->oC_Expression(1)) { - listSlice->addChild( - transformExpression(*ctx.kU_ListSliceOperatorExpression()->oC_Expression(0))); - listSlice->addChild( - transformExpression(*ctx.kU_ListSliceOperatorExpression()->oC_Expression(1))); - } else { - listSlice->addChild( - transformExpression(*ctx.kU_ListSliceOperatorExpression()->oC_Expression(0))); - listSlice->addChild(getZeroLiteral()); - } - } - if (ctx.oC_ListOperatorExpression()) { - return transformListOperatorExpression( - *ctx.oC_ListOperatorExpression(), move(listSlice)); + 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; + } +} + +unique_ptr Transformer::transformListSliceOperatorExpression( + CypherParser::KU_ListSliceOperatorExpressionContext& ctx, + unique_ptr propertyExpression) { + auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText(); + auto listSlice = + make_unique(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 { - return listSlice; + listSlice->addChild(getZeroLiteral()); } } else { - auto listExtract = - make_unique(LIST_EXTRACT_FUNC_NAME, move(rawExpression)); - listExtract->addChild(move(propertyExpression)); - listExtract->addChild( - transformExpression(*ctx.kU_ListExtractOperatorExpression()->oC_Expression())); - if (ctx.oC_ListOperatorExpression()) { - return transformListOperatorExpression( - *ctx.oC_ListOperatorExpression(), move(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 { - return listExtract; + listSlice->addChild(transformExpression(*ctx.oC_Expression(0))); + listSlice->addChild(getZeroLiteral()); } } -} + return listSlice; +}; + +unique_ptr Transformer::transformListExtractOperatorExpression( + CypherParser::KU_ListExtractOperatorExpressionContext& ctx, + unique_ptr propertyExpression) { + auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText(); + auto listExtract = + make_unique(LIST_EXTRACT_FUNC_NAME, move(rawExpression)); + listExtract->addChild(move(propertyExpression)); + listExtract->addChild(transformExpression(*ctx.oC_Expression())); + return listExtract; +}; unique_ptr Transformer::transformNullOperatorExpression( CypherParser::OC_NullOperatorExpressionContext& ctx,