/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.tdb.store;
import java.util.function.Predicate;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.atlas.lib.tuple.Tuple ;
import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.query.* ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.sparql.sse.SSE ;
import org.apache.jena.tdb.TDB ;
import org.apache.jena.tdb.TDBFactory ;
import org.apache.jena.tdb.store.DatasetGraphTDB ;
import org.apache.jena.tdb.store.NodeId ;
import org.apache.jena.tdb.store.nodetable.NodeTable ;
import org.apache.jena.tdb.sys.SystemTDB ;
import org.junit.AfterClass ;
import org.junit.BeforeClass ;
import org.junit.Test ;
public class TestQuadFilter extends BaseTest
{
private static String graphToHide = "http://example/g2" ;
private static Dataset ds = setup() ;
@BeforeClass public static void beforeClass()
{
}
@AfterClass public static void afterClass() {}
/** Example setup - in-memory dataset with two graphs, one triple in each */
private static Dataset setup()
{
Dataset ds = TDBFactory.createDataset() ;
DatasetGraphTDB dsg = (DatasetGraphTDB)(ds.asDatasetGraph()) ;
Quad q1 = SSE.parseQuad("(<http://example/g1> <http://example/s> <http://example/p> <http://example/o1>)") ;
Quad q2 = SSE.parseQuad("(<http://example/g2> <http://example/s> <http://example/p> <http://example/o2>)") ;
dsg.add(q1) ;
dsg.add(q2) ;
return ds ;
}
/** Create a filter to exclude the graph http://example/g2 */
private static Predicate<Tuple<NodeId>> createFilter(Dataset ds)
{
DatasetGraphTDB dsg = (DatasetGraphTDB)(ds.asDatasetGraph()) ;
final NodeTable nodeTable = dsg.getQuadTable().getNodeTupleTable().getNodeTable() ;
final NodeId target = nodeTable.getNodeIdForNode(NodeFactory.createURI(graphToHide)) ;
return item -> !( item.len() == 4 && item.get(0).equals(target) );
}
@Test public void quad_filter_1() { test("SELECT * { GRAPH ?g { ?s ?p ?o } }", 1, 2) ; }
@Test public void quad_filter_2() { test("SELECT * { ?s ?p ?o }", 1, 2) ; }
@Test public void quad_filter_3() { test("SELECT * { GRAPH ?g { } }", 1, 2) ; }
private void test(String qs, int withFilter, int withoutFilter)
{
Predicate<Tuple<NodeId>> filter = createFilter(ds) ;
// private static void example(Dataset ds, Filter<Tuple<NodeId>> filter)
// {
// String[] x = {
// "SELECT * { GRAPH ?g { ?s ?p ?o } }",
// "SELECT * { ?s ?p ?o }",
// // THis filter does not hide the graph itself, just the quads associated with the graph.
// "SELECT * { GRAPH ?g {} }"
// } ;
Query query = QueryFactory.create(qs) ;
try(QueryExecution qExec = QueryExecutionFactory.create(query, ds)) {
// Install filter for this query only.
qExec.getContext().set(SystemTDB.symTupleFilter, filter) ;
qExec.getContext().setTrue(TDB.symUnionDefaultGraph) ;
long x1 = ResultSetFormatter.consume(qExec.execSelect()) ;
assertEquals(withFilter, x1) ;
}
// No filter.
try(QueryExecution qExec = QueryExecutionFactory.create(query, ds)) {
qExec.getContext().setTrue(TDB.symUnionDefaultGraph) ;
long x2 = ResultSetFormatter.consume(qExec.execSelect()) ;
assertEquals(withoutFilter, x2) ;
}
}
}