blob: 6a2499a9f58eac90038a837065cab9ec7544be08 [file] [log] [blame]
/*
* 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.sparql.core;
import static org.apache.jena.sparql.util.NodeUtils.convertToSetNodes;
import java.util.Collection;
import java.util.Set;
import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.compose.Union;
import org.apache.jena.query.Dataset ;
import org.apache.jena.query.DatasetFactory ;
import org.apache.jena.sparql.ARQConstants ;
import org.apache.jena.sparql.graph.GraphOps ;
import org.apache.jena.sparql.graph.GraphUnionRead ;
public class DynamicDatasets
{
/**
* Given a DatasetDescription, form a Dataset that is the dynamic dataset over the
* base dataset. Returns the original Dataset if the dataset description is null or
* empty.
*/
public static Dataset dynamicDataset(DatasetDescription description, Dataset ds, boolean defaultUnionGraph)
{
DatasetGraph dsg = ds.asDatasetGraph() ;
DatasetGraph dsg2 = dynamicDataset(description, dsg, defaultUnionGraph) ;
if ( dsg == dsg2 )
return ds ;
return DatasetFactory.wrap(dsg2) ;
}
/**
* Given a DatasetDescription, form a Dataset that is the dynamic dataset over the
* base dataset. Returns the original DatasetGraph if the dataset description is null
* or empty.
*/
public static DatasetGraph dynamicDataset(DatasetDescription description, DatasetGraph dsg, boolean defaultUnionGraph)
{
if ( description == null )
return dsg ;
//An empty description means leave the dataset as-is
if (description.isEmpty() )
return dsg;
Set<Node> defaultGraphs = convertToSetNodes(description.getDefaultGraphURIs()) ;
Set<Node> namedGraphs = convertToSetNodes(description.getNamedGraphURIs()) ;
return dynamicDataset(defaultGraphs, namedGraphs, dsg, defaultUnionGraph) ;
}
/**
* Form a {@link DatasetGraph} that is the dynamic dataset from the collections of
* graphs from the dataset that go to make up the default graph and named graphs.
*/
public static DatasetGraph dynamicDataset(Collection<Node> defaultGraphs, Collection<Node> namedGraphs, DatasetGraph dsg, boolean defaultUnionGraph)
{
Graph dft;
if ( defaultUnionGraph || defaultGraphs.contains(Quad.unionGraph) ) {
if ( defaultGraphs.contains(Quad.defaultGraphIRI) )
dft = new Union(dsg.getUnionGraph(), dsg.getDefaultGraph());
else
// Any other FROM graphs don't matter - they are in the union graph.
dft = dsg.getUnionGraph();
} else
dft = new GraphUnionRead(dsg, defaultGraphs);
DatasetGraph dsg2 = new DatasetGraphMapLink(dft);
// The named graphs.
for ( Node gn : namedGraphs )
{
if ( Quad.isUnionGraph(gn) ) {
// Special case - don't put an explicitly named union graph into the name
// graphs because union is an operation over all named graphs ... which
// includes itself.
// In practical terms, it can lead to stackoveflow in execution.
continue;
}
Graph g = GraphOps.getGraph(dsg, gn) ;
if ( g != null )
dsg2.addGraph(gn, g) ;
}
if ( dsg.getContext() != null )
dsg2.getContext().putAll(dsg.getContext()) ;
dsg2 = new DynamicDatasetGraph(dsg2, dsg);
// Record what we've done.
// c.f. "ARQConstants.sysDatasetDescription" which is used to pass in a DatasetDescription
dsg2.getContext().set(ARQConstants.symDatasetDefaultGraphs, defaultGraphs) ;
dsg2.getContext().set(ARQConstants.symDatasetNamedGraphs, namedGraphs) ;
return dsg2 ;
}
public static class DynamicDatasetGraph extends DatasetGraphReadOnly implements DatasetGraphWrapperView {
private final DatasetGraph projected;
public DynamicDatasetGraph(DatasetGraph viewDSG, DatasetGraph baseDSG) {
super(viewDSG, baseDSG.getContext().copy());
this.projected = baseDSG;
}
private DatasetGraph getProjected() {
return projected;
}
}
}