blob: c6d1ebb5d2005e8c8b74cc7cfd72d7856a9d1d37 [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author hanl
* @date 10/12/2013
*/
public class QueryUtils {
public static SimpleEntry<String, Integer> checkUnbalancedPars(String q) {
Map<Character, Character> brackets = new HashMap<Character, Character>();
brackets.put('[', ']');
brackets.put('{', '}');
brackets.put('(', ')');
Set<Character> allChars = new HashSet<Character>();
allChars.addAll(brackets.keySet());
allChars.addAll(brackets.values());
int lastOpenBracket = 0;
final Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < q.length(); i++) {
if (!allChars.contains(q.charAt(i)))
continue;
if (brackets.containsKey(q.charAt(i))) {
stack.push(q.charAt(i));
lastOpenBracket = i;
}
else if (stack.empty()
|| (q.charAt(i) != brackets.get(stack.pop()))) {
return new SimpleEntry<String, Integer>(
"Parantheses/brackets unbalanced.", i);
}
}
if (!stack.empty())
return new SimpleEntry<String, Integer>(
"Parantheses/brackets unbalanced.", lastOpenBracket);
return null;
}
public static List<String> parseMorph(String stringTree) {
ArrayList<String> morph = new ArrayList<String>();
return morph;
}
public static String buildCypherQuery(String cypher, String ctypel,
String ctyper, int cl, int cr, int page, int limit) {
// todo: implies that there is only one type allowed!
String sctypel = "", sctyper = "";
switch (ctypel) {
case "C":
sctypel = "chars";
break;
case "T":
sctypel = "tokens";
break;
}
switch (ctyper) {
case "C":
sctyper = "chars";
break;
case "T":
sctyper = "tokens";
break;
}
StringBuffer buffer = new StringBuffer();
buffer.append("<query><cypher><![CDATA[");
buffer.append(cypher);
buffer.append("]]></cypher>");
buffer.append("<wordAliasPrefix>wtok_</wordAliasPrefix>");
buffer.append("<contextColumn>sent</contextColumn>");
buffer.append("<contextIdColumn>sid</contextIdColumn>");
buffer.append("<textColumn>txt</textColumn>");
buffer.append("<startIndex>");
buffer.append(page);
buffer.append("</startIndex>");
buffer.append("<itemsPerPage>");
buffer.append(limit);
buffer.append("</itemsPerPage>");
buffer.append("<context>");
buffer.append("<left>");
buffer.append("<" + sctypel + ">");
buffer.append(cl);
buffer.append("</" + sctypel + ">");
buffer.append("</left>");
buffer.append("<right>");
buffer.append("<" + sctyper + ">");
buffer.append(cr);
buffer.append("</" + sctyper + ">");
buffer.append("</right>");
buffer.append("</context>");
buffer.append("</query>");
return buffer.toString();
}
public static String buildDotQuery(long sid, String graphdb_id) {
StringBuffer b = new StringBuffer();
b.append("<query>");
b.append("<sentenceId>");
b.append(sid);
b.append("</sentenceId>");
b.append("<gdbId>");
b.append(graphdb_id);
b.append("</gdbId>");
b.append("<hls>");
b.append("<hl>");
b.append(40857);
b.append("</hl>");
b.append("<hl>");
b.append(40856);
b.append("</hl>");
b.append("</hls>");
b.append("</query>");
return b.toString();
}
public String buildaggreQuery(String query) {
StringBuffer b = new StringBuffer();
b.append("<query><cypher><![CDATA[");
b.append(query);
b.append("]]></cypher>");
b.append("<columns>");
b.append("<column agg='true' sum='false'>");
b.append("<cypherAlias>");
b.append("aggBy");
b.append("</cypherAlias>");
b.append("<displayName>");
b.append("Aggregate");
b.append("</displayName>");
b.append("</column>");
b.append("<column agg='fals' sum='true'>");
b.append("<cypherAlias>");
b.append("cnt");
b.append("</cypherAlias>");
b.append("<displayName>");
b.append("Count");
b.append("</displayName>");
b.append("</column>");
b.append("</columns>");
b.append("</query>");
return b.toString();
}
@Deprecated
public static Map addParameters(Map request, int page, int num, String cli,
String cri, int cls, int crs, boolean cutoff) {
Map ctx = new LinkedHashMap();
List left = new ArrayList();
left.add(cli);
left.add(cls);
List right = new ArrayList();
right.add(cri);
right.add(crs);
ctx.put("left", left);
ctx.put("right", right);
request.put("startPage", page);
request.put("count", num);
request.put("context", ctx);
request.put("cutOff", cutoff);
return request;
}
public static void prepareContext(LinkedHashMap<String, Object> requestMap) {
LinkedHashMap<String, Object> context = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> classMap = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> operands = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> operation = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> frame = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> classRef = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> spanRef = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> classRefOp = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> min = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> max = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> exclude = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> distances = new LinkedHashMap<String, Object>();
LinkedHashMap<String, Object> inOrder = new LinkedHashMap<String, Object>();
operation.put("@id", "group:operation/");
operation.put("@type", "@id");
classMap.put("@id", "group:class");
classMap.put("@type", "xsd:integer");
operands.put("@id", "group:operands");
operands.put("@container", "@list");
frame.put("@id", "group:frame/");
frame.put("@type", "@id");
classRef.put("@id", "group:classRef");
classRef.put("@type", "xsd:integer");
spanRef.put("@id", "group:spanRef");
spanRef.put("@type", "xsd:integer");
classRefOp.put("@id", "group:classRefOp");
classRefOp.put("@type", "@id");
min.put("@id", "boundary:min");
min.put("@type", "xsd:integer");
max.put("@id", "boundary:max");
max.put("@type", "xsd:integer");
exclude.put("@id", "group:exclude");
exclude.put("@type", "xsd:boolean");
distances.put("@id", "group:distances");
distances.put("@container", "@list");
inOrder.put("@id", "group:inOrder");
inOrder.put("@type", "xsd:boolean");
context.put("korap",
"http://korap.ids-mannheim.de/ns/KorAP/json-ld/v0.1/");
context.put("boundary", "korap:boundary/");
context.put("group", "korap:group/");
context.put("operation", operation);
context.put("class", classMap);
context.put("operands", operands);
context.put("frame", frame);
context.put("classRef", classRef);
context.put("spanRef", spanRef);
context.put("classRefOp", classRefOp);
context.put("min", min);
context.put("max", max);
context.put("exclude", exclude);
context.put("distances", distances);
context.put("inOrder", inOrder);
requestMap.put("@context", context);
}
public static String escapeRegexSpecialChars(String key) {
key.replace("\\", "\\\\");
Pattern p = Pattern
.compile("\\.|\\^|\\$|\\||\\?|\\*|\\+|\\(|\\)|\\[|\\]|\\{|\\}");
Matcher m = p.matcher(key);
while (m.find()) {
System.out.println(m.group(0));
String match = m.group();
System.out.println(key);
key = m.replaceAll("\\\\" + match);
System.out.println(" > " + key);
}
return key;
}
}