blob: af5d8d8c7343a9eebb07eff70648e4912adb14c4 [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import de.ids_mannheim.korap.util.QueryException;
import de.ids_mannheim.korap.utils.JsonUtils;
import de.ids_mannheim.korap.utils.KorAPLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Map;
/**
* @author bingel, hanl
*/
public class QuerySerializer {
private Logger qllogger = KorAPLogger.initiate("ql");
public static String queryLanguageVersion;
private AbstractSyntaxTree ast;
private Object collection;
private Object meta;
private org.slf4j.Logger log = LoggerFactory
.getLogger(QuerySerializer.class);
/**
* @param args
* @throws QueryException
*/
public static void main(String[] args) {
/*
* just for testing...
*/
QuerySerializer jg = new QuerySerializer();
int i = 0;
String[] queries;
if (args.length == 0) {
queries = new String[]{
};
} else {
queries = new String[]{args[0]};
}
for (String q : queries) {
i++;
try {
System.out.println(q);
String ql = "cosmas2";
jg.run(q, ql, System.getProperty("user.home") + "/" + ql + "_" + i + ".jsonld");
System.out.println();
} catch (NullPointerException npe) {
npe.printStackTrace();
System.out.println("null\n");
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (QueryException e) {
e.printStackTrace();
}
}
}
/**
* Runs the QuerySerializer by initializing the relevant AbstractSyntaxTree implementation (depending on specified query language)
* and transforms and writes the tree's requestMap to the specified output file.
*
* @param outFile The file to which the serialization is written
* @param query The query string
* @param queryLanguage The query language. As of 13/11/20, this must be either 'poliqarp' or 'poliqarpplus'. Some extra maven stuff needs to done to support CosmasII ('cosmas') [that maven stuff would be to tell maven how to build the cosmas grammar and where to find the classes]
* @throws IOException
* @throws QueryException
*/
public void run(String query, String queryLanguage, String outFile)
throws IOException, QueryException {
if (queryLanguage.equals("poliqarp")) {
ast = new PoliqarpPlusTree(query);
} else if (queryLanguage.toLowerCase().equals("cosmas2")) {
ast = new CosmasTree(query);
} else if (queryLanguage.toLowerCase().equals("poliqarpplus")) {
ast = new PoliqarpPlusTree(query);
} else if (queryLanguage.toLowerCase().equals("cql")) {
ast = new CQLTree(query);
} else if (queryLanguage.toLowerCase().equals("annis")) {
ast = new AqlTree(query);
} else {
throw new QueryException(queryLanguage + " is not a supported query language!");
}
Map<String, Object> requestMap = ast.getRequestMap();
// mapper.writeValue(new File(outFile), requestMap);
}
public QuerySerializer setQuery(String query, String ql, String version)
throws QueryException {
if (query == null || query.isEmpty())
throw new QueryException(406, "No Content!");
try {
if (ql.equalsIgnoreCase("poliqarp")) {
ast = new PoliqarpPlusTree(query);
} else if (ql.equalsIgnoreCase("cosmas2")) {
ast = new CosmasTree(query);
} else if (ql.equalsIgnoreCase("poliqarpplus")) {
ast = new PoliqarpPlusTree(query);
} else if (ql.equalsIgnoreCase("cql")) {
if (version == null)
ast = new CQLTree(query);
else
ast = new CQLTree(query, version);
} else if (ql.equalsIgnoreCase("annis")) {
ast = new AqlTree(query);
} else {
throw new QueryException(ql + " is not a supported query language!");
}
} catch (QueryException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new QueryException("UNKNOWN: Query could not be parsed (" + query + ")");
}
return this;
}
public QuerySerializer setQuery(String query, String ql) throws QueryException {
return setQuery(query, ql, "");
}
public final String toJSON() {
String ser = JsonUtils.toJSON(raw());
qllogger.info("Serialized query: " + ser);
return ser;
}
public final Map build() {
return raw();
}
private Map raw() {
Map<String, Object> requestMap = ast.getRequestMap();
if (collection != null)
requestMap.put("collections", collection);
if (meta != null)
requestMap.put("meta", meta);
return requestMap;
}
public QuerySerializer setMeta(
String cli, String cri, int cls, int crs,
int num, int pageIndex) {
MetaQueryBuilder meta = new MetaQueryBuilder();
meta.setSpanContext(cls, cli, crs, cri);
meta.addEntry("startIndex", pageIndex);
meta.addEntry("count", num);
this.meta = meta.raw();
return this;
}
public QuerySerializer setMeta(String context, int num, int pageidx) {
MetaQueryBuilder meta = new MetaQueryBuilder();
meta.addEntry("startIndex", pageidx);
meta.addEntry("count", num);
meta.setSpanContext(context);
return this;
}
public QuerySerializer setMeta(MetaQueryBuilder meta) {
this.meta = meta.raw();
return this;
}
@Deprecated
public QuerySerializer setCollectionSimple(String collection) {
CollectionQueryBuilder qobj = new CollectionQueryBuilder();
qobj.addResource(collection);
this.collection = qobj.raw();
return this;
}
public QuerySerializer setCollection(String collection) throws QueryException {
CollectionQueryTree tree = new CollectionQueryTree();
tree.process(collection);
this.collection = tree.getRequestMap();
return this;
}
public QuerySerializer setCollection(CollectionQueryBuilder2 collections) {
this.collection = collections.raw();
return this;
}
public QuerySerializer setDeprCollection(CollectionQueryBuilder collections) {
this.collection = collections.raw();
return this;
}
}