blob: f743abae5345fa70155e7b74d7d8d2be1e4c1365 [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize;
import lombok.Data;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* @author hanl
* @date 07/02/2014
*/
public class MetaQueryBuilder {
private static Pattern p = Pattern
.compile("\\s*\\d+-(?:c(?:hars?)?|t(?:okens?)?)");
private Map meta;
private SpanContext spanContext;
public MetaQueryBuilder() {
this.meta = new LinkedHashMap();
// this.meta.put("fields", new LinkedList<>());
}
/**
* context segment if context is either of type char or token.
* size can differ for left and right span
*
* @param left
* @param leftType
* @param right
* @param rightType
* @return
*/
public MetaQueryBuilder setSpanContext(Integer left, String leftType,
Integer right, String rightType) {
this.spanContext = new SpanContext(left, leftType, right, rightType);
return this;
}
public SpanContext getSpanContext() {
return this.spanContext;
}
/**
* context if of type paragraph or sentence where left and right
* size delimiters are irrelevant; or 2-token, 2-char p/paragraph,
* s/sentence or token, char.
* Distinguish
*
* @param context
* @return
*/
public MetaQueryBuilder setSpanContext(String context) {
if (context != null) {
if (!p.matcher(context).find())
this.spanContext = new SpanContext(context);
else {
String[] ct = context.replaceAll("\\s+", "").split(",");
String[] lc = ct[0].split("-");
String[] rc = ct[1].split("-");
this.spanContext = new SpanContext(Integer.valueOf(lc[0]),
lc[1], Integer.valueOf(rc[0]), rc[1]);
}
}
return this;
}
public MetaQueryBuilder addEntry(String name, Object value) {
if (value != null)
meta.put(name, value);
return this;
}
public Map raw() {
if (this.spanContext != null)
meta.putAll(this.spanContext.raw());
return meta;
}
@Data
public class SpanContext {
private String left_type;
private String right_type;
private int left_size;
private int right_size;
private String context = null;
/**
* context segment if context is either of type char or token.
* size can differ for left and right span
*
* @param ls
* @param lt
* @param rs
* @param rt
* @return
*/
public SpanContext(int ls, String lt, int rs, String rt) {
this.left_type = lt;
this.left_size = ls;
this.right_type = rt;
this.right_size = rs;
}
public SpanContext(String context) {
this.context = context;
}
public Map raw() {
Map meta = new LinkedHashMap();
if (this.context == null) {
Map map = new LinkedHashMap();
List l = new LinkedList();
List r = new LinkedList();
l.add(this.left_type);
l.add(this.left_size);
map.put("left", l);
r.add(this.right_type);
r.add(this.right_size);
map.put("right", r);
meta.put("context", map);
}else
meta.put("context", this.context);
return meta;
}
}
}