blob: b03959d0f2b07ee732f488e0ad2a2133647fb256 [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import de.ids_mannheim.korap.query.serialize.AbstractQueryProcessor;
public class CqlfObjectGenerator {
protected static final Integer MAXIMUM_DISTANCE = 100;
private static AbstractQueryProcessor qp;
public static void setQueryProcessor(AbstractQueryProcessor qp) {
CqlfObjectGenerator.qp = qp;
}
public static LinkedHashMap<String, Object> makeSpan() {
LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
span.put("@type", "korap:span");
return span;
}
public static LinkedHashMap<String, Object> makeSpan(String key) {
LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
span.put("@type", "korap:span");
span.put("key", key);
return span;
}
public static LinkedHashMap<String, Object> makeTerm() {
LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
term.put("@type", "korap:term");
return term;
}
public static 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;
}
public static LinkedHashMap<String, Object> makeDoc() {
LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
term.put("@type", "korap:doc");
return term;
}
public static LinkedHashMap<String, Object> makeDocGroup(String relation) {
LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
term.put("@type", "korap:docGroup");
term.put("operation", "operation:"+relation);
term.put("operands", new ArrayList<Object>());
return term;
}
public static LinkedHashMap<String, Object> makeToken() {
LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
token.put("@type", "korap:token");
return token;
}
public static 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;
}
public static LinkedHashMap<String, Object> makeRepetition(Integer min, Integer max) {
LinkedHashMap<String, Object> group = makeGroup("repetition");
group.put("boundary", makeBoundary(min, max));
group.put("min", min);
return group;
}
@Deprecated
public static 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;
}
public static LinkedHashMap<String, Object> makePosition(String[] allowedFrames, String[] classRefCheck) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:position");
group.put("frames", Arrays.asList(allowedFrames));
group.put("operands", new ArrayList<Object>());
return group;
}
public static LinkedHashMap<String, Object> makeSpanClass(int classCount) {
return makeSpanClass(classCount, true);
}
public static LinkedHashMap<String, Object> makeSpanClass(int classCount, boolean setBySystem) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:class");
if (setBySystem) {
group.put("class", 128+classCount);
group.put("classOut", 128+classCount);
qp.addMessage("A class has been introduced into the backend representation of " +
"your query for later reference to a part of the query. The class id is "+(128+classCount));
} else {
group.put("class", classCount);
group.put("classOut", classCount);
}
qp.addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " +
"Classes are now defined using the 'classOut' attribute.");
group.put("operands", new ArrayList<Object>());
return group;
}
public static LinkedHashMap<String, Object> makeClassRefCheck(ArrayList<String> check, Integer[] classIn, int classOut) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:class");
group.put("classRefCheck", check);
group.put("classIn", Arrays.asList(classIn));
group.put("classOut", classOut);
group.put("class", classOut);
qp.addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-10-07: 'class' only to be supported until 3 months from deprecation date. " +
"Classes are now defined using the 'classOut' attribute.");
group.put("operands", new ArrayList<Object>());
return group;
}
public static LinkedHashMap<String, Object> makeClassRefOp(String operation, Integer[] classIn, int classOut) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:group");
group.put("operation", "operation:class");
group.put("classRefOp", operation);
group.put("classIn", Arrays.asList(classIn));
group.put("classOut", classOut);
group.put("operands", new ArrayList<Object>());
return group;
}
@Deprecated
public static 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;
}
public static LinkedHashMap<String, Object> makeRelation() {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:relation");
return group;
}
public static LinkedHashMap<String, Object> makeBoundary(Integer min, Integer max) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:boundary");
group.put("min", min);
if (max != null) {
group.put("max", max);
}
return group;
}
public static LinkedHashMap<String, Object> makeDistance(String key, Integer min, Integer max) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
if (key.equals("w")) {
group.put("@type", "korap:distance");
} else {
group.put("@type", "cosmas:distance");
}
group.put("key", key);
group.put("boundary", makeBoundary(min, max));
group.put("min", min);
if (max != null) {
group.put("max", max);
}
qp.addMessage(StatusCodes.DEPRECATED_QUERY_ELEMENT, "Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date.");
return group;
}
public static LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs, String operation) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:reference");
group.put("operation", "operation:"+operation);
if (classRefs!= null && !classRefs.isEmpty()) {
group.put("classRef", classRefs);
}
return group;
}
public static LinkedHashMap<String, Object> makeReference(ArrayList<Integer> classRefs) {
return makeReference(classRefs, "focus");
}
public static LinkedHashMap<String, Object> makeReference(int classRef, String operation, boolean setBySystem) {
ArrayList<Integer> classRefs = new ArrayList<Integer>();
if (setBySystem) classRef = classRef+128;
classRefs.add(classRef);
return makeReference(classRefs, operation);
}
public static LinkedHashMap<String, Object> makeReference(int classRef, boolean setBySystem) {
ArrayList<Integer> classRefs = new ArrayList<Integer>();
if (setBySystem) classRef = classRef+128;
classRefs.add(classRef);
return makeReference(classRefs, "focus");
}
public static LinkedHashMap<String, Object> makeReference(int classRef) {
return makeReference(classRef, false);
}
public static LinkedHashMap<String, Object> makeResetReference() {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:reference");
group.put("operation", "operation:focus");
group.put("reset", true);
group.put("operands", new ArrayList<Object>());
return group;
}
public static LinkedHashMap<String, Object> makeSpanReference(Integer[] spanRef, String operation) {
LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
group.put("@type", "korap:reference");
group.put("operation", "operation:"+operation);
group.put("spanRef", Arrays.asList(spanRef));
group.put("operands", new ArrayList<Object>());
return group;
}
public static void addOperandsToGroup(LinkedHashMap<String, Object> group) {
ArrayList<Object> operands = new ArrayList<Object>();
group.put("operands", operands);
}
public static LinkedHashMap<String, Object> wrapInReference(LinkedHashMap<String, Object> group, Integer classId) {
LinkedHashMap<String, Object> refGroup = makeReference(classId);
ArrayList<Object> operands = new ArrayList<Object>();
operands.add(group);
refGroup.put("operands", operands);
return refGroup;
}
@SuppressWarnings("unchecked")
public static LinkedHashMap<String, Object> wrapInClass(LinkedHashMap<String, Object> group, Integer classId) {
LinkedHashMap<String, Object> classGroup = makeSpanClass(classId, true);
((ArrayList<Object>) classGroup.get("operands")).add(group);
return classGroup;
}
/**
* Ensures that a distance or quantification value does not exceed the allowed maximum value.
* @param number
* @return The input number if it is below the allowed maximum value, else the maximum value.
*/
public static int cropToMaxValue(int number) {
if (number > MAXIMUM_DISTANCE) {
number = MAXIMUM_DISTANCE;
String warning = String.format("You specified a distance between two segments that is greater than " +
"the allowed max value of %d. Your query will be re-interpreted using a distance of %d.", MAXIMUM_DISTANCE, MAXIMUM_DISTANCE);
qp.addWarning(warning);
}
return number;
}
}