package net.sourceforge.mayfly.evaluation.condition; import net.sourceforge.mayfly.datastore.Cell; import net.sourceforge.mayfly.datastore.NullCell; import net.sourceforge.mayfly.evaluation.Expression; import net.sourceforge.mayfly.evaluation.ResultRow; import net.sourceforge.mayfly.evaluation.select.Evaluator; import java.util.regex.Pattern; public class Like extends RowExpression { public Like(Expression left, Expression pattern) { super(left, pattern); } @Override protected boolean compare(Cell left, Cell right) { if (left instanceof NullCell || right instanceof NullCell) { return false; } String candidate = left.asString(); String pattern = right.asString(); return compare(candidate, pattern); } static boolean compare(String candidate, String pattern) { String regex = quote(pattern) .replaceAll("%", ".*") .replaceAll("_", ".") ; return Pattern.matches(regex, candidate); } static String quote(String in) { return in .replace("\\", "\\\\") .replace("[", "\\[") .replace("]", "\\]") .replace(".", "\\.") .replace("$", "\\$") .replace("^", "\\^") .replace("?", "\\?") .replace("*", "\\*") .replace("+", "\\+") .replace("{", "\\{") .replace("}", "\\}") .replace("|", "\\|") .replace("(", "\\(") .replace(")", "\\)") ; } @Override public Condition resolve(ResultRow row, Evaluator evaluator) { Expression newLeftSide = leftSide.resolve(row, evaluator); Expression newRightSide = rightSide.resolve(row, evaluator); if (newLeftSide != leftSide || newRightSide != rightSide) { return new Like(newLeftSide, newRightSide); } else { return this; } } }