org.apache.jena.sdb.graph.GraphSDB Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-sdb Show documentation
Show all versions of jena-sdb Show documentation
SDB is a persistence layer for use with Apache Jena that uses an SQL database to store triples/quads.
/*
* 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.sdb.graph;
import java.util.Iterator ;
import org.apache.jena.graph.* ;
import org.apache.jena.graph.impl.AllCapabilities ;
import org.apache.jena.graph.impl.GraphBase ;
import org.apache.jena.sdb.SDB ;
import org.apache.jena.sdb.Store ;
import org.apache.jena.sdb.sql.SDBConnection ;
import org.apache.jena.sdb.store.DatasetGraphSDB ;
import org.apache.jena.sdb.store.LibSDB ;
import org.apache.jena.sdb.store.StoreLoader ;
import org.apache.jena.sdb.store.StoreLoaderPlus ;
import org.apache.jena.shared.PrefixMapping ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.util.iterator.ExtendedIterator ;
import org.apache.jena.util.iterator.WrappedIterator ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
public class GraphSDB extends GraphBase implements Graph
{
private static Logger log = LoggerFactory.getLogger(GraphSDB.class) ;
protected Store store = null ;
// ARP buffers, which results in nested updates from our prespective
protected int inBulkUpdate = 0 ;
protected Node graphNode = Quad.defaultGraphNodeGenerated ;
protected DatasetGraphSDB datasetStore = null ;
public GraphSDB(Store store, String uri) {
this(store, NodeFactory.createURI(uri));
}
public GraphSDB(Store store) {
this(store, (Node)null);
}
public GraphSDB(Store store, Node graphNode) {
if ( graphNode == null )
graphNode = Quad.defaultGraphNodeGenerated;
this.store = store;
this.graphNode = graphNode;
// Avoid looping here : DatasetStoreGraph can make GraphSDB's
datasetStore = new DatasetGraphSDB(store, this, SDB.getContext().copy());
// readPrefixMapping() ;
}
/* We don't support value tests, hence handlesLiteralTyping is false */
@Override
public Capabilities getCapabilities() {
if (capabilities == null)
capabilities = new AllCapabilities()
{ @Override public boolean handlesLiteralTyping() { return false; } };
return capabilities;
}
public Store getStore() { return store ; }
public SDBConnection getConnection() { return store.getConnection() ; }
@Override
public PrefixMapping createPrefixMapping() {
try {
String graphURI = null;
if ( Quad.isDefaultGraphGenerated(graphNode) )
graphURI = "";
else if ( graphNode.isURI() )
graphURI = graphNode.getURI();
else {
log.warn("Not a URI for graph name");
graphURI = graphNode.toString();
}
return new PrefixMappingSDB(graphURI, store.getConnection());
}
catch (Exception ex) {
log.warn("Failed to get prefixes: " + ex.getMessage());
return null;
}
}
@Override
protected ExtendedIterator graphBaseFind(Triple m) {
Iterator iter = LibSDB.findTriples(datasetStore, graphNode, m.getSubject(), m.getPredicate(), m.getObject());
return WrappedIterator.create(iter);
}
public StoreLoader getBulkLoader() { return store.getLoader() ; }
@Override
public GraphEventManager getEventManager() {
if ( gem == null )
gem = new EventManagerSDB();
return gem;
}
@Override
public void performAdd(Triple triple) {
if ( inBulkUpdate == 0 )
store.getLoader().startBulkUpdate();
if ( Quad.isDefaultGraphGenerated(graphNode) )
store.getLoader().addTriple(triple);
else {
// XXX
StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader();
x.addQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject());
}
if ( inBulkUpdate == 0 )
store.getLoader().finishBulkUpdate();
}
@Override
public void performDelete(Triple triple) {
if ( inBulkUpdate == 0 )
store.getLoader().startBulkUpdate();
if ( Quad.isDefaultGraphGenerated(graphNode) )
store.getLoader().deleteTriple(triple);
else {
// XXX
StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader();
x.deleteQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject());
}
if ( inBulkUpdate == 0 )
store.getLoader().finishBulkUpdate();
}
public void startBulkUpdate() { inBulkUpdate += 1 ; if (inBulkUpdate == 1) store.getLoader().startBulkUpdate();}
public void finishBulkUpdate() { inBulkUpdate -= 1 ; if (inBulkUpdate == 0) store.getLoader().finishBulkUpdate();}
@Override
public TransactionHandler getTransactionHandler() { return store.getConnection().getTransactionHandler() ; }
@Override
public int graphBaseSize() { return (int) (Quad.isDefaultGraphGenerated(graphNode) ? store.getSize() : store.getSize(graphNode)); }
public void deleteAll() {
if (inBulkUpdate == 0) store.getLoader().startBulkUpdate();
if ( Quad.isDefaultGraphGenerated(graphNode) )
store.getLoader().deleteAll();
else
((StoreLoaderPlus) store.getLoader()).deleteAll(graphNode);
if (inBulkUpdate == 0) store.getLoader().finishBulkUpdate();
}
}