package net.enilink.komma.internal.rdf4j;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.query.Dataset;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.query.QueryLanguage;
import org.eclipse.rdf4j.query.UnsupportedQueryLanguageException;
import org.eclipse.rdf4j.query.algebra.UpdateExpr;
import org.eclipse.rdf4j.query.parser.ParsedUpdate;
import org.eclipse.rdf4j.query.parser.QueryParserUtil;
import com.google.inject.Inject;
import net.enilink.komma.core.IReference;
import net.enilink.komma.core.IValue;
import net.enilink.komma.core.KommaException;
import net.enilink.komma.core.LinkedHashBindings;
import net.enilink.komma.dm.IDataManager;
import net.enilink.komma.dm.IDataManagerUpdate;
import net.enilink.komma.rdf4j.RDF4JValueConverter;
/**
* Implements {@link IDataManagerUpdate} for {@link RDF4JRepositoryDataManager}
* .
*/
public class RDF4JUpdate implements IDataManagerUpdate {
@Inject
RDF4JValueConverter valueConverter;
@Inject
ValueFactory vf;
final IDataManager dm;
final ParsedUpdate parsedUpdate;
final String baseURI;
final boolean includeInferred;
final LinkedHashBindings<IValue> bindings = new LinkedHashBindings<>();
final IReference[] readContexts;
final IReference[] modifyContexts;
public RDF4JUpdate(IDataManager dm, String update, String baseURI,
boolean includeInferred, IReference[] readContexts,
IReference[] modifyContexts) {
this.dm = dm;
try {
this.parsedUpdate = QueryParserUtil.parseUpdate(
QueryLanguage.SPARQL, update, baseURI);
} catch (MalformedQueryException e) {
throw new KommaException(e);
} catch (UnsupportedQueryLanguageException e) {
throw new KommaException(e);
}
this.baseURI = baseURI;
this.includeInferred = includeInferred;
this.readContexts = readContexts;
this.modifyContexts = modifyContexts;
}
@Override
public void execute() {
SparqlUpdateExecutor updateExecutor = new SparqlUpdateExecutor(dm,
valueConverter, vf);
boolean localTransaction = !dm.getTransaction().isActive();
try {
if (localTransaction) {
dm.getTransaction().begin();
}
for (UpdateExpr updateExpr : parsedUpdate.getUpdateExprs()) {
// TODO use and filter dataset
Dataset dataset = parsedUpdate.getDatasetMapping().get(
updateExpr);
updateExecutor.executeUpdate(updateExpr, baseURI, readContexts,
modifyContexts, bindings, includeInferred);
}
if (localTransaction) {
dm.getTransaction().commit();
}
} catch (RuntimeException e) {
if (localTransaction && dm.getTransaction().isActive()) {
dm.getTransaction().rollback();
}
throw new RuntimeException(e);
}
}
@Override
public IDataManagerUpdate setParameter(String name, IValue value) {
bindings.put(name, value);
return this;
}
}