Extend Languages
If you want to add query specific statistics and/or using the correct result size for an HTTP Worker (Post or Get) you can do so. (This may be interesting if you're not using SPARQL)
Let's start by implementing the LanguageProcessor
@Shorthand("lang.MyLanguage")
public class MyLanguageProcessor implements LanguageProcessor {
@Override
public String getQueryPrefix() {
}
@Override
public Model generateTripleStats(List<QueryWrapper> queries, String resourcePrefix, String taskID) {
}
@Override
public Long getResultSize(CloseableHttpResponse response) throws ParserConfigurationException, SAXException, ParseException, IOException {
}
@Override
Long getResultSize(Header contentTypeHeader, BigByteArrayOutputStream content) throws ParserConfigurationException, SAXException, ParseException, IOException{
}
@Override
long readResponse(InputStream inputStream, BigByteArrayOutputStream responseBody) throws IOException{
}
}
Query prefix
Set a query prefix which will be used in the result set, f.e. "sql"
@Override
public String getQueryPrefix() {
return "sql";
}
Generate Query Statistics
Generating query specific statistics (which will be added in the result file)
You will get the queries (containg of an ID and the query itself) a resourcePrefix you may use to create the URIs and the current taskID.
A basic pretty standard exmaple is
@Override
public Model generateTripleStats(List<QueryWrapper> queries, String resourcePrefix, String taskID) {
Model model = ModelFactory.createDefaultModel();
for(QueryWrapper wrappedQuery : queries) {
Resource subject = ResourceFactory.createResource(COMMON.RES_BASE_URI + resourcePrefix + "/" + wrappedQuery.getId());
model.add(subject, RDF.type, Vocab.queryClass);
model.add(subject, Vocab.rdfsID, wrappedQuery.getId().replace(queryPrefix, "").replace("sql", ""));
model.add(subject, RDFS.label, wrappedQuery.getQuery().toString());
//ADD YOUR TRIPLES HERE which contains query specific statistics
}
return model;
}
Get the result size
To generate the correct result size in the result file do the following
@Override
public Long getResultSize(CloseableHttpResponse response) throws ParserConfigurationException, SAXException, ParseException, IOException {
InputStream inStream = response.getEntity().getContent();
Long size = -1L;
//READ INSTREAM ACCORDINGLY
return size;
}
@Override
public Long getResultSize(Header contentTypeHeader, BigByteArrayOutputStream content) throws ParserConfigurationException, SAXException, ParseException, IOException {
//Read content from Byte Array instead of InputStream
InputStream is = new BigByteArrayInputStream(content);
Long size=-1L;
...
return size;
}
@Override
public long readResponse(InputStream inputStream, BigByteArrayOutputStream responseBody) throws IOException {
//simply moves content from inputStream to the byte array responseBody and returns the size;
//will be used for parsing the anwser in another thread.
return Streams.inputStream2ByteArrayOutputStream(inputStream, responseBody);
}