/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.epl.parse; import com.espertech.esper.epl.expression.core.ExprNode; import com.espertech.esper.epl.generated.EsperEPL2GrammarParser; import com.espertech.esper.epl.spec.MatchRecognizeSkipEnum; import com.espertech.esper.rowregex.RowRegexExprRepeatDesc; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.Tree; import java.util.Locale; import java.util.Map; /** * Helper class for walking the match-recognize AST. */ public class ASTMatchRecognizeHelper { private final static String MESSAGE = "Match-recognize AFTER clause must be either AFTER MATCH SKIP TO LAST ROW or AFTER MATCH SKIP TO NEXT ROW or AFTER MATCH SKIP TO CURRENT ROW"; public static MatchRecognizeSkipEnum parseSkip(CommonTokenStream tokenStream, EsperEPL2GrammarParser.MatchRecogMatchesAfterSkipContext ctx) { if ((!ctx.i1.getText().toUpperCase(Locale.ENGLISH).equals("MATCH")) || (!ctx.i2.getText().toUpperCase(Locale.ENGLISH).equals("SKIP")) || (!ctx.i5.getText().toUpperCase(Locale.ENGLISH).equals("ROW")) ) { throw ASTWalkException.from(MESSAGE, tokenStream, ctx); } if ((!ctx.i3.getText().toUpperCase(Locale.ENGLISH).equals("TO")) && (!ctx.i3.getText().toUpperCase(Locale.ENGLISH).equals("PAST"))) { throw ASTWalkException.from(MESSAGE, tokenStream, ctx); } if (ctx.i4.getText().toUpperCase(Locale.ENGLISH).equals("LAST")) { return MatchRecognizeSkipEnum.PAST_LAST_ROW; } else if (ctx.i4.getText().toUpperCase(Locale.ENGLISH).equals("NEXT")) { return MatchRecognizeSkipEnum.TO_NEXT_ROW; } else if (ctx.i4.getText().toUpperCase(Locale.ENGLISH).equals("CURRENT")) { return MatchRecognizeSkipEnum.TO_CURRENT_ROW; } throw ASTWalkException.from(MESSAGE); } public static RowRegexExprRepeatDesc walkOptionalRepeat(EsperEPL2GrammarParser.MatchRecogPatternRepeatContext ctx, Map<Tree, ExprNode> astExprNodeMap) { if (ctx == null) { return null; } ExprNode e1 = ctx.e1 == null ? null : ASTExprHelper.exprCollectSubNodes(ctx.e1, 0, astExprNodeMap).get(0); ExprNode e2 = ctx.e2 == null ? null : ASTExprHelper.exprCollectSubNodes(ctx.e2, 0, astExprNodeMap).get(0); if (ctx.comma == null && ctx.e1 != null) { return new RowRegexExprRepeatDesc(null, null, e1); } if (e1 == null && e2 == null) { throw ASTWalkException.from("Invalid match-recognize quantifier '" + ctx.getText() + "', expecting an expression"); } return new RowRegexExprRepeatDesc(e1, e2, null); } }