/* * 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 java.util.Collection ; import java.util.Set ; import org.apache.jena.graph.Graph ; import org.apache.jena.graph.Node ; 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 ; import org.apache.jena.sparql.util.NodeUtils ; public class DynamicDatasets { /** Given a Dataset and a query, form a Dataset that * is the dynamic dataset from the query. */ 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 DatasetGraph and a query, form a DatasetGraph that * is the dynamic dataset from the query. * Returns the original DatasetGraph if the dataset description is null. */ 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.getDefaultGraphURIs().size() == 0 && description.getNamedGraphURIs().size() == 0) { // return dsg; // } Set<Node> defaultGraphs = NodeUtils.convertToNodes(description.getDefaultGraphURIs()) ; Set<Node> namedGraphs = NodeUtils.convertToNodes(description.getNamedGraphURIs()) ; return dynamicDataset(defaultGraphs, namedGraphs, dsg, defaultUnionGraph) ; } /** Given a DatasetGraph and a query, form a DatasetGraph that * is the dynamic dataset from the collection of graphs from the dataset * that go to make up the default graph (union) and named graphs. */ public static DatasetGraph dynamicDataset(Collection<Node> defaultGraphs, Collection<Node> namedGraphs, DatasetGraph dsg, boolean defaultUnionGraph) { Graph dft = new GraphUnionRead(dsg, defaultGraphs) ; DatasetGraph dsg2 = new DatasetGraphMapLink(dft) ; // The named graphs. for ( Node gn : namedGraphs ) { Graph g = GraphOps.getGraph(dsg, gn) ; if ( g != null ) dsg2.addGraph(gn, g) ; } if ( dsg.getContext() != null ) dsg2.getContext().putAll(dsg.getContext()) ; if ( defaultUnionGraph && defaultGraphs.size() == 0 ) { // Create a union graph - there were no defaultGraphs explicitly named. Graph unionGraph = new GraphUnionRead(dsg, namedGraphs) ; dsg2.setDefaultGraph(unionGraph) ; } // read-only, <urn:x-arq:DefaultGraph> and <urn:x-arq:UnionGraph> processing. dsg2 = new DynamicDatasetGraph(dsg2) ; // 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 { public DynamicDatasetGraph(DatasetGraph dsg) { super(dsg) ; } private Graph unionGraph = null ; @Override public boolean containsGraph(Node graphNode) { if ( Quad.isUnionGraph(graphNode) ) return true ; if ( Quad.isDefaultGraphExplicit(graphNode)) return true ; return super.containsGraph(graphNode) ; } // See also the GraphOps @Override public Graph getGraph(Node graphNode) { if ( Quad.isUnionGraph(graphNode) ) { if ( unionGraph == null ) unionGraph = GraphOps.unionGraph(super.getWrapped()) ; return unionGraph ; } if ( Quad.isDefaultGraph(graphNode)) return getDefaultGraph() ; return super.getGraph(graphNode) ; } } }