[VIVO-1403] Improve update performance by ensuring the bulk updater can be exposed correctly

This commit is contained in:
Graham Triggs 2017-10-19 11:21:04 +01:00
parent 4da85f0d82
commit 0ef3018ae3
4 changed files with 71 additions and 26 deletions

View file

@ -26,26 +26,35 @@ public class BulkUpdatingModel extends AbstractModelDecorator {
protected BulkUpdatingModel(Model m) { protected BulkUpdatingModel(Model m) {
super(m); super(m);
Graph graph = m.getGraph(); if (m instanceof BulkUpdatingModel) {
this.updater = ((BulkUpdatingModel) m).updater;
} else {
Graph graph = GraphUtils.unwrapUnionGraphs(m.getGraph());
if (graph instanceof RDFServiceGraph) { if (graph instanceof RDFServiceGraph) {
updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph);
} else if (graph instanceof SparqlGraph) { } else if (graph instanceof SparqlGraph) {
updater = new SparqlBulkUpdater((SparqlGraph)graph); updater = new SparqlBulkUpdater((SparqlGraph) graph);
} else { } else {
updater = null; updater = null;
} }
} }
}
protected BulkUpdatingModel(Model m, Graph graph) { protected BulkUpdatingModel(Model m, Model baseModel) {
super(m); super(m);
if (baseModel instanceof BulkUpdatingModel) {
this.updater = ((BulkUpdatingModel) baseModel).updater;
} else {
Graph graph = GraphUtils.unwrapUnionGraphs(baseModel.getGraph());
if (graph instanceof RDFServiceGraph) { if (graph instanceof RDFServiceGraph) {
updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph);
} else if (graph instanceof SparqlGraph) { } else if (graph instanceof SparqlGraph) {
updater = new SparqlBulkUpdater((SparqlGraph)graph); updater = new SparqlBulkUpdater((SparqlGraph) graph);
} else { } else {
updater = null; updater = null;
} }
} }
}
@Override @Override
public Model add(StmtIterator iter) { public Model add(StmtIterator iter) {

View file

@ -27,26 +27,35 @@ public class BulkUpdatingOntModel extends AbstractOntModelDecorator {
protected BulkUpdatingOntModel(OntModel m) { protected BulkUpdatingOntModel(OntModel m) {
super(m); super(m);
Graph graph = m.getGraph(); if (m instanceof BulkUpdatingOntModel) {
this.updater = ((BulkUpdatingOntModel) m).updater;
} else {
Graph graph = GraphUtils.unwrapUnionGraphs(m.getGraph());
if (graph instanceof RDFServiceGraph) { if (graph instanceof RDFServiceGraph) {
updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph);
} else if (graph instanceof SparqlGraph) { } else if (graph instanceof SparqlGraph) {
updater = new SparqlBulkUpdater((SparqlGraph)graph); updater = new SparqlBulkUpdater((SparqlGraph) graph);
} else { } else {
updater = null; updater = null;
} }
} }
}
protected BulkUpdatingOntModel(OntModel m, Graph graph) { protected BulkUpdatingOntModel(OntModel m, OntModel baseModel) {
super(m); super(m);
if (baseModel instanceof BulkUpdatingOntModel) {
this.updater = ((BulkUpdatingOntModel) baseModel).updater;
} else {
Graph graph = GraphUtils.unwrapUnionGraphs(baseModel.getGraph());
if (graph instanceof RDFServiceGraph) { if (graph instanceof RDFServiceGraph) {
updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph);
} else if (graph instanceof SparqlGraph) { } else if (graph instanceof SparqlGraph) {
updater = new SparqlBulkUpdater((SparqlGraph)graph); updater = new SparqlBulkUpdater((SparqlGraph) graph);
} else { } else {
updater = null; updater = null;
} }
} }
}
@Override @Override
public Model add(StmtIterator iter) { public Model add(StmtIterator iter) {

View file

@ -0,0 +1,21 @@
/* $This file is distributed under the terms of the license in LICENSE$ */
package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.compose.MultiUnion;
import java.util.List;
final public class GraphUtils {
public static Graph unwrapUnionGraphs(Graph graph) {
if (graph != null && graph instanceof MultiUnion) {
List<Graph> subGraphs = ((MultiUnion)graph).getSubGraphs();
if (subGraphs == null || subGraphs.isEmpty()) {
return ((MultiUnion)graph).getBaseGraph();
}
}
return graph;
}
}

View file

@ -4,10 +4,13 @@ package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters;
import static org.apache.jena.ontology.OntModelSpec.OWL_MEM; import static org.apache.jena.ontology.OntModelSpec.OWL_MEM;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph;
import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlGraph;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.jena.graph.Graph; import org.apache.jena.graph.Graph;
import org.apache.jena.graph.compose.MultiUnion;
import org.apache.jena.graph.compose.Union; import org.apache.jena.graph.compose.Union;
import org.apache.jena.ontology.OntModel; import org.apache.jena.ontology.OntModel;
import org.apache.jena.ontology.impl.OntModelImpl; import org.apache.jena.ontology.impl.OntModelImpl;
@ -17,6 +20,8 @@ import org.apache.jena.rdf.model.impl.ModelCom;
import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString; import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
import java.util.List;
/** /**
* Make models that will do proper bulk updates. * Make models that will do proper bulk updates.
*/ */
@ -46,7 +51,7 @@ public class VitroModelFactory {
Model unionModel = ModelFactory.createModelForGraph(unionGraph); Model unionModel = ModelFactory.createModelForGraph(unionGraph);
return new BulkUpdatingModel(unionModel, baseGraph); return new BulkUpdatingModel(unionModel, baseModel);
} }
public static OntModel createUnion(OntModel baseModel, OntModel plusModel) { public static OntModel createUnion(OntModel baseModel, OntModel plusModel) {
@ -58,7 +63,8 @@ public class VitroModelFactory {
Model unionModel = ModelFactory.createModelForGraph(unionGraph); Model unionModel = ModelFactory.createModelForGraph(unionGraph);
OntModel unionOntModel = ModelFactory.createOntologyModel(OWL_MEM, unionModel); OntModel unionOntModel = ModelFactory.createOntologyModel(OWL_MEM, unionModel);
return new BulkUpdatingOntModel(unionOntModel, baseGraph);
return new BulkUpdatingOntModel(unionOntModel, baseModel);
} }
public static Model createModelForGraph(Graph g) { public static Model createModelForGraph(Graph g) {