package er.neo4jadaptor.query.neo4j_eval.evaluators; import java.util.Iterator; import java.util.regex.Pattern; import org.neo4j.graphdb.PropertyContainer; import er.neo4jadaptor.query.neo4j_eval.Cost; import er.neo4jadaptor.query.neo4j_eval.retrievers.Retriever; /** * Tells if a value retrieved from a candidate using {@link Retriever} matches some regular expression. * * @author Jedrzej Sobanski * * @param <T> */ public class RegexMatch <T extends PropertyContainer> implements Evaluator<T> { private final Retriever<T, String> valueRetriever; private final Pattern pattern; public static <T extends PropertyContainer> RegexMatch<T> wildcardMatch(Retriever<T, String> valueRetriever, String expression) { Pattern p = Pattern.compile(wildcardExpressionToRegex(expression)); return new RegexMatch<>(valueRetriever, p); } private RegexMatch(Retriever<T, String> valueRetriever, Pattern pattern) { this.valueRetriever = valueRetriever; this.pattern = pattern; } private static String wildcardExpressionToRegex(String wildcardExpression) { // TODO: has to secure against user's input containing special regex characters return wildcardExpression.replaceAll("\\*", "\\.*"); } public boolean evaluate(T candidate) { Iterator<String> it = valueRetriever.retrieve(candidate); while (it.hasNext()) { String s = it.next(); if (pattern.matcher(s).matches()) { return true; } } return false; } public Cost getCost() { return valueRetriever.getCost(); } }