package edu.stanford.nlp.ling.tokensregex;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.util.*;
import java.util.*;
import java.util.function.BiFunction;
import java.util.regex.Pattern;
/**
* Pattern for matching a CoreMap
*
* @author Angel Chang
*/
public class CoreMapNodePattern extends ComplexNodePattern<CoreMap, Class> {
private static BiFunction<CoreMap, Class, Object> createGetter() {
return new BiFunction<CoreMap, Class, Object>() {
@Override
public Object apply(CoreMap m, Class k) {
return m.get(k);
}
};
}
public CoreMapNodePattern(List<Pair<Class, NodePattern>> annotationPatterns) {
super(createGetter(), annotationPatterns);
}
public CoreMapNodePattern(Pair<Class, NodePattern>... annotationPatterns) {
super(createGetter(), annotationPatterns);
}
public CoreMapNodePattern(Class key, NodePattern pattern) {
this(Pair.makePair(key,pattern));
}
public static CoreMapNodePattern valueOf(String textAnnotationPattern) {
return valueOf(null, textAnnotationPattern);
}
public static CoreMapNodePattern valueOf(String textAnnotationPattern, int flags) {
CoreMapNodePattern p = new CoreMapNodePattern(new ArrayList<>(1));
p.add(CoreAnnotations.TextAnnotation.class,
newStringRegexPattern(textAnnotationPattern, flags));
return p;
}
public static CoreMapNodePattern valueOf(Env env, String textAnnotationPattern) {
CoreMapNodePattern p = new CoreMapNodePattern(new ArrayList<>(1));
p.add(CoreAnnotations.TextAnnotation.class,
newStringRegexPattern(textAnnotationPattern, (env != null)? env.defaultStringPatternFlags: 0));
return p;
}
public static CoreMapNodePattern valueOf(Pattern textAnnotationPattern) {
CoreMapNodePattern p = new CoreMapNodePattern(new ArrayList<>(1));
p.add(CoreAnnotations.TextAnnotation.class,
new StringAnnotationRegexPattern(textAnnotationPattern));
return p;
}
public static CoreMapNodePattern valueOf(Map<String, String> attributes) {
return valueOf(null, attributes);
}
public static CoreMapNodePattern valueOf(Env env, Map<String, String> attributes) {
CoreMapNodePattern p = new CoreMapNodePattern(new ArrayList<>(attributes.size()));
p.populate(env, attributes, envAttrPair -> EnvLookup.lookupAnnotationKeyWithClassname(envAttrPair.first, envAttrPair.second));
return p;
}
public static class AttributesEqualMatchChecker<K> implements SequencePattern.NodesMatchChecker<CoreMap> {
Collection<Class> keys;
public AttributesEqualMatchChecker(Class... keys) {
this.keys = CollectionUtils.asSet(keys);
}
public boolean matches(CoreMap o1, CoreMap o2) {
for (Class key : keys) {
Object v1 = o1.get(key);
Object v2 = o2.get(key);
if (v1 != null) {
if (!v1.equals(v2)) {
return false;
}
} else {
if (v2 != null) return false;
}
}
return true;
}
}
public static final AttributesEqualMatchChecker TEXT_ATTR_EQUAL_CHECKER =
new CoreMapNodePattern.AttributesEqualMatchChecker(CoreAnnotations.TextAnnotation.class);
}