blob: e7bf8bd7d48d88b0dddc12f99bf94e90c635608f [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.antlr.runtime.tree.Tree;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.commons.lang.StringUtils;
import de.ids_mannheim.korap.util.QueryException;
public abstract class AbstractSyntaxTree {
public abstract Map<String, Object> getRequestMap();
public abstract void process(String query) throws QueryException;
public static final Integer MAXIMUM_DISTANCE = 100;
protected LinkedHashMap<String, Object> makeSpan() {
LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
span.put("@type", "korap:span");
return span;
}
protected LinkedHashMap<String, Object> makeTerm() {
LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
term.put("@type", "korap:term");
return term;
}
protected LinkedHashMap<String, Object> makeTermGroup(String relation) {
LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
term.put("@type", "korap:termGroup");
term.put("relation", "relation:"+relation);
term.put("operands", new ArrayList<Object>());
return term;
}
protected LinkedHashMap<String, Object> makeToken() {
LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
token.put("@type", "korap:token");
return token;
}
protected LinkedHashMap<String, Object> makeGroup(String operation) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:"+operation);
group.put("operands", new ArrayList<Object>());
return group;
}
protected LinkedHashMap<String, Object> makePosition(String frame) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:position");
group.put("frame", "frame:"+frame);
group.put("operands", new ArrayList<Object>());
return group;
}
protected LinkedHashMap<String, Object> makeClass(int classCount) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:class");
group.put("class", classCount);
group.put("operands", new ArrayList<Object>());
return group;
}
protected LinkedHashMap<String, Object> makeTreeRelation(String reltype) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:treeRelation");
if (reltype != null) group.put("reltype", reltype);
return group;
}
protected LinkedHashMap<String, Object> makeRelation(String reltype) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:relation");
if (reltype != null) group.put("reltype", reltype);
return group;
}
protected LinkedHashMap<String, Object> makeBoundary(int min, int max) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:boundary");
group.put("min", min);
group.put("max", max);
return group;
}
protected LinkedHashMap<String, Object> makeDistance(String key, int min, int max) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:distance");
group.put("key", key);
group.put("min", min);
group.put("max", max);
return group;
}
protected LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:reference");
group.put("classRef", classRefs);
return group;
}
protected LinkedHashMap<String, Object> makeReference(int classRef) {
ArrayList<Integer> classRefs = new ArrayList<Integer>();
classRefs.add(classRef);
return makeReference(classRefs);
}
protected void addOperandsToGroup(LinkedHashMap<String, Object> group) {
ArrayList<Object> operands = new ArrayList<Object>();
group.put("operands", operands);
}
/**
* Returns the category (or 'label') of the root of a (sub-) ParseTree (ANTLR 3).
*
* @param node
* @return
*/
public static String getNodeCat(Tree node) {
String nodeCat = node.toStringTree();
Pattern p = Pattern.compile("\\((.*?)\\s"); // from opening parenthesis to 1st whitespace
Matcher m = p.matcher(node.toStringTree());
if (m.find()) {
nodeCat = m.group(1);
}
return nodeCat;
}
/**
* Tests whether a certain node has a child by a certain name
*
* @param node The parent node.
* @param childCat The category of the potential child.
* @return true iff one or more children belong to the specified category
*/
public static boolean hasChild(Tree node, String childCat) {
for (int i = 0; i < node.getChildCount(); i++) {
if (getNodeCat(node.getChild(i)).equals(childCat)) {
return true;
}
}
return false;
}
public static List<Tree> getChildrenWithCat(Tree node, String nodeCat) {
ArrayList<Tree> children = new ArrayList<Tree>();
for (int i = 0; i < node.getChildCount(); i++) {
if (getNodeCat(node.getChild(i)).equals(nodeCat)) {
children.add(node.getChild(i));
}
}
return children;
}
public static List<ParseTree> getChildren(ParseTree node) {
ArrayList<ParseTree> children = new ArrayList<ParseTree>();
for (int i = 0; i < node.getChildCount(); i++) {
children.add(node.getChild(i));
}
return children;
}
public static Tree getFirstChildWithCat(Tree node, String nodeCat) {
for (int i = 0; i < node.getChildCount(); i++) {
if (getNodeCat(node.getChild(i)).equals(nodeCat)) {
return node.getChild(i);
}
}
return null;
}
public static void checkUnbalancedPars(String q) throws QueryException {
int openingPars = StringUtils.countMatches(q, "(");
int closingPars = StringUtils.countMatches(q, ")");
int openingBrkts = StringUtils.countMatches(q, "[");
int closingBrkts = StringUtils.countMatches(q, "]");
int openingBrcs = StringUtils.countMatches(q, "{");
int closingBrcs = StringUtils.countMatches(q, "}");
if (openingPars != closingPars) throw new QueryException(
"Your query string contains an unbalanced number of parantheses.");
if (openingBrkts != closingBrkts) throw new QueryException(
"Your query string contains an unbalanced number of brackets.");
if (openingBrcs != closingBrcs) throw new QueryException(
"Your query string contains an unbalanced number of braces.");
}
}