package org.aksw.jena_sparql_api.concept_cache.main; import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.aksw.jena_sparql_api.backports.syntaxtransform.QueryTransformOps; import org.aksw.jena_sparql_api.concept_cache.core.CacheResult; import org.aksw.jena_sparql_api.concept_cache.core.SparqlCacheUtils; import org.aksw.jena_sparql_api.concept_cache.dirty.SparqlViewMatcherQfpc; import org.aksw.jena_sparql_api.concept_cache.dirty.SparqlViewMatcherQfpcImpl; import org.aksw.jena_sparql_api.concept_cache.domain.QuadFilterPatternCanonical; import org.aksw.jena_sparql_api.core.FluentQueryExecutionFactory; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.resources.sparqlqc.SparqlQcReader; import org.aksw.jena_sparql_api.stmt.SparqlQueryParser; import org.aksw.jena_sparql_api.stmt.SparqlQueryParserImpl; import org.aksw.jena_sparql_api.utils.Generator; import org.aksw.jena_sparql_api.utils.VarGeneratorBlacklist; import org.aksw.simba.lsq.vocab.LSQ; import org.apache.jena.graph.Node; import org.apache.jena.query.Query; import org.apache.jena.query.ResultSet; import org.apache.jena.query.Syntax; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.algebra.Table; import org.apache.jena.sparql.algebra.table.TableData; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry; import org.apache.jena.sparql.syntax.PatternVars; import org.apache.jena.system.JenaSystem; import org.junit.Test; import com.google.common.base.Stopwatch; public class TestSparqlViewCacheVariableRenaming { /** * Take a set of queries comprised of quads and filters, * * randomly shuffle their variables * @throws IOException * */ //@Test public void testSparqlViewCacheRenaming() throws IOException { JenaSystem.init(); PropertyFunctionRegistry.init(); //Reader reader = new InputStreamRnew FileInputStream(file) //new InputStreamReader(in); //List<String> lines = Files.readAllLines(Paths.get(""), encoding); //Resource r = new ClassPathResource("bgp-queries.json"); // Gson gson = new GsonBuilder().setPrettyPrinting().create(); // JsonReader jsonReader = new JsonReader(new InputStreamReader(r.getInputStream(), StandardCharsets.UTF_8)); // jsonReader.setLenient(true); // // Type listType = new TypeToken<ArrayList<String>>() {}.getType(); // List<String> queryStrs = gson.fromJson(jsonReader, listType); // CacheFrontend cacheFrontend = null; // QueryExecutionFactory qef = FluentQueryExecutionFactory // .http("http://dbpedia.org/sparql") // .config() // .withCache(cacheFrontend) // .end() // .create(); Model model = SparqlQcReader.readQueryFolder("sparqlqc/1.4/benchmark/noprojection/*"); SparqlQueryParser sparqlParser = SparqlQueryParserImpl.create(Syntax.syntaxARQ); Query testSuiteQuery = sparqlParser.apply("SELECT ?s ?c { ?s <" + LSQ.text + ">?c }"); //QueryUtils.injectFilter(testSuiteQuery, "?s = <http://ex.org/query/4-b>"); QueryExecutionFactory qef = FluentQueryExecutionFactory.from(model).create(); ResultSet rs = qef.createQueryExecution(testSuiteQuery).execSelect(); //List<String> queryStrs = new ArrayList<>(); Map<String, Query> idToQuery = new LinkedHashMap<>(); rs.forEachRemaining(b -> idToQuery.put(b.get("s").asResource().getURI(), sparqlParser.apply(b.get("c").asLiteral().getString()))); // model.write(System.out, "TURTLE"); for(int i = 0; i < 100; ++i) { Stopwatch sw = Stopwatch.createStarted(); for(Entry<String, Query> entry : idToQuery.entrySet()) { String id = entry.getKey(); Query query = entry.getValue(); //if(true) { // if("http://ex.org/query/4-a".equals(id)) { // too many candidates - fixed by grouping quads by their filters //if("http://ex.org/query/4-c".equals(id)) { // if("http://ex.org/query/8-b".equals(id)) { System.out.println("Testing " + id); testVariableRenaming(query); // } } System.out.println("Run [" + i + "] + took " + sw.stop().elapsed(TimeUnit.MILLISECONDS) + "ms"); } } public static void testVariableRenaming(Query userQuery) throws IOException { QuadFilterPatternCanonical userQfpc = SparqlCacheUtils.transform2(userQuery); Collection<Var> vars = PatternVars.vars(userQuery.getQueryPattern()); Generator<Var> gen = VarGeneratorBlacklist.create("v", vars); Map<Var, Node> varMap = vars.stream() .collect(Collectors.toMap( v -> v, v -> (Node)gen.next())); Query cacheQuery = QueryTransformOps.transform(userQuery, varMap); List<Var> cacheResultVars = cacheQuery.getProjectVars(); //List<Var> renamedVars = renamedQuery.getProjectVars(); QuadFilterPatternCanonical cacheQfpc = SparqlCacheUtils.transform2(cacheQuery); // Cache<Integer, String> cache = CacheBuilder // .newBuilder() // .removalListener(new RemovalListener<Integer, String>() { // @Override // public void onRemoval(RemovalNotification<Integer, String> notification) { // // } // }) // .maximumSize(1000) // .build(); SparqlViewMatcherQfpc sparqlViewCache = new SparqlViewMatcherQfpcImpl(); System.out.println("cache: " + cacheQfpc); System.out.println("user: " + userQfpc); System.out.println("cache: " + cacheQuery); System.out.println("user: " + userQuery); System.out.println("cache result vars: " + cacheResultVars); Table table = new TableData(cacheResultVars, Collections.emptyList()); //sparqlViewCache.index(cacheQfpc, table); CacheResult cr = null; // TODO possibly fix sparqlViewCache.lookup(userQfpc); if(cr == null) { System.out.println("FAIL: No cache candidates found where 1 expected"); } else { System.out.println("SUCCESS: Cache lookup - got " + cr.getTables().size() + " candidate tables"); } //SparqlViewCache. // SparqlV // public CacheResult lookup(QuadFilterPatternCanonical queryQfpc) { //PatternSummary queryPs) { //SparqlViewCache x; //x.lookup(queryQfpc); //x.index(qfp, rsp); //query. } }