com.espertech.esper.epl.parse.ASTMatchUntilHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of esper Show documentation
Show all versions of esper Show documentation
Complex event processing and event series analysis component
/*
***************************************************************************************
* 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.expression.core.ExprNodeUtility;
/**
* Helper for walking a pattern match-until clause.
*/
public class ASTMatchUntilHelper {
/**
* Validate.
*
* @param lowerBounds is the lower bounds, or null if none supplied
* @param upperBounds is the upper bounds, or null if none supplied
* @param isAllowLowerZero true to allow zero value for lower range
* @return true if closed range of constants and the constants are the same value
* @throws ASTWalkException if the AST is incorrect
*/
public static boolean validate(ExprNode lowerBounds, ExprNode upperBounds, boolean isAllowLowerZero) throws ASTWalkException {
boolean isConstants = true;
Object constantLower = null;
String numericMessage = "Match-until bounds expect a numeric or expression value";
if (ExprNodeUtility.isConstantValueExpr(lowerBounds)) {
constantLower = lowerBounds.getExprEvaluator().evaluate(null, true, null);
if (constantLower == null || !(constantLower instanceof Number)) {
throw ASTWalkException.from(numericMessage);
}
} else {
isConstants = lowerBounds == null;
}
Object constantUpper = null;
if (ExprNodeUtility.isConstantValueExpr(upperBounds)) {
constantUpper = upperBounds.getExprEvaluator().evaluate(null, true, null);
if (constantUpper == null || !(constantUpper instanceof Number)) {
throw ASTWalkException.from(numericMessage);
}
} else {
isConstants = isConstants && upperBounds == null;
}
if (!isConstants) {
return true;
}
if (constantLower != null && constantUpper != null) {
Integer lower = ((Number) constantLower).intValue();
Integer upper = ((Number) constantUpper).intValue();
if (lower > upper) {
throw ASTWalkException.from("Incorrect range specification, lower bounds value '" + lower +
"' is higher then higher bounds '" + upper + "'");
}
}
verifyConstant(constantLower, isAllowLowerZero);
verifyConstant(constantUpper, false);
return constantLower != null && constantUpper != null && constantLower.equals(constantUpper);
}
private static void verifyConstant(Object value, boolean isAllowZero) {
if (value != null) {
Integer bound = ((Number) value).intValue();
if (isAllowZero) {
if (bound < 0) {
throw ASTWalkException.from("Incorrect range specification, a bounds value of negative value is not allowed");
}
} else {
if (bound <= 0) {
throw ASTWalkException.from("Incorrect range specification, a bounds value of zero or negative value is not allowed");
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy