package jeql.command.db.sde;
public class SimpleSqlPatternMatcher {
public static final int MATCH_EXACT = 0;
public static final int MATCH_PREFIX = 1;
public static final int MATCH_INFIX = 2;
public static final int MATCH_SUFFIX = 3;
public static final int MATCH_ANY = 4;
private String pattern;
private String fixedData;
private String fixedDataLower = null;
private int matchStrategy = MATCH_EXACT;
public SimpleSqlPatternMatcher(String pattern) {
this.pattern = pattern;
prepare(pattern);
}
private void prepare(String pattern) {
if (pattern.equals("%")) {
matchStrategy = MATCH_ANY;
return;
}
boolean hasPrefixWildCard = pattern.startsWith("%");
boolean hasSuffixWildCard = pattern.endsWith("%");
if (hasPrefixWildCard && hasSuffixWildCard && pattern.length() >= 2) {
fixedData = pattern.substring(1, pattern.length() - 1);
matchStrategy = MATCH_INFIX;
return;
}
if (hasPrefixWildCard) {
fixedData = pattern.substring(1, pattern.length());
matchStrategy = MATCH_SUFFIX;
return;
}
if (hasSuffixWildCard) {
fixedData = pattern.substring(0, pattern.length() - 1);
matchStrategy = MATCH_PREFIX;
return;
}
fixedData = pattern;
matchStrategy = MATCH_EXACT;
}
public boolean match(String input) {
return match(input, fixedData);
}
public boolean matchIgnoreCase(String input) {
if (fixedDataLower == null)
fixedDataLower = fixedData.toLowerCase();
String inputLower = input.toLowerCase();
return match(inputLower, fixedDataLower);
}
private boolean match(String input, String fixedData) {
switch (matchStrategy) {
case MATCH_ANY:
return true;
case MATCH_EXACT:
return fixedData.equals(input);
case MATCH_PREFIX:
return input.startsWith(fixedData);
case MATCH_SUFFIX:
return input.endsWith(fixedData);
case MATCH_INFIX:
return input.indexOf(fixedData) >= 0;
}
throw new IllegalStateException("Unknown match state");
}
}