package won.matcher.utils.tensor;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.LinkedList;
import java.util.stream.Collectors;
/**
* Loads all SPARQL "*.rq" files from a specified directory and executes them (using time range parameters) on a
* SPARQL endpoint. The result {@link TensorEntry} objects from all queries are returned.
*
* Created by hfriedrich on 21.04.2017.
*/
public class TensorEntryAllGenerator implements TensorEntryGenerator {
private String sparqlEndpoint;
private String queryDirectory;
private long from;
private long to;
public TensorEntryAllGenerator(String queryDirectory, String sparqlEndpoint, long fromDate, long toDate) {
this.queryDirectory = queryDirectory;
this.sparqlEndpoint = sparqlEndpoint;
from = fromDate;
to = toDate;
}
@Override
public Collection<TensorEntry> generateTensorEntries() throws IOException {
Collection<TensorEntry> tensorEntries = new LinkedList<>();
Collection<TensorEntrySparqlGenerator> queryGenerators = new LinkedList<>();
// read all sparql queries from target directory and configure them with variable bindings
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:" + queryDirectory + "/*.rq");
for (Resource resource : resources) {
String query = readFromInputStream(resource.getInputStream());
TensorEntrySparqlGenerator queryGen = new TensorEntrySparqlGenerator(sparqlEndpoint, query);
queryGen.addVariableBinding("from", Long.valueOf(from));
queryGen.addVariableBinding("to", Long.valueOf(to));
queryGenerators.add(queryGen);
}
// execute all sparql query generators
for (TensorEntrySparqlGenerator queryGen : queryGenerators) {
tensorEntries.addAll(queryGen.generateTensorEntries());
}
return tensorEntries;
}
public static String readFromInputStream(InputStream input) throws IOException {
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input, "UTF-8"))) {
return buffer.lines().collect(Collectors.joining("\n"));
}
}
}