[VIVO-1031] Improve logged in performance by handling a bulk of faux properties statements at once, rather than one-by-one.

This commit is contained in:
grahamtriggs 2015-09-29 17:02:50 +01:00
parent 4883621236
commit 15cd6a8ac0
11 changed files with 87 additions and 67 deletions

View file

@ -109,6 +109,7 @@ public interface Individual extends ResourceBean, Comparable<Individual> {
* This is crap. It was put in so IndividualFiltering could filter object properties properly, * This is crap. It was put in so IndividualFiltering could filter object properties properly,
* but what we really need is either: filters have a reference to a webappDaoFactory, or * but what we really need is either: filters have a reference to a webappDaoFactory, or
* all ObjectPropertyStatements are resolved when they are created. See VIVO-946 and VIVO-984. * all ObjectPropertyStatements are resolved when they are created. See VIVO-946 and VIVO-984.
* @param list
*/ */
void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt); void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list);
} }

View file

@ -347,7 +347,7 @@ public class IndividualImpl extends BaseResourceBean implements Individual, Comp
} }
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
// No webappDaoFactory, so nothing to do. // No webappDaoFactory, so nothing to do.
} }

View file

@ -62,6 +62,6 @@ public interface ObjectPropertyStatementDao {
* If that is so, then set the domain and range (and the domainURI and * If that is so, then set the domain and range (and the domainURI and
* rangeURI) of the property of this statement to match the faux property. * rangeURI) of the property of this statement to match the faux property.
*/ */
void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt); void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list);
} }

View file

@ -20,7 +20,6 @@ import org.apache.commons.logging.LogFactory;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.RequestedAction;
import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean;
import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
@ -185,9 +184,7 @@ public class IndividualFiltering implements Individual {
if (opStmts == null) { if (opStmts == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
for(ObjectPropertyStatement opStmt: opStmts) { _innerIndividual.resolveAsFauxPropertyStatements(opStmts);
_innerIndividual.resolveAsFauxPropertyStatement(opStmt);
}
ArrayList<ObjectPropertyStatement> filtered = new ArrayList<ObjectPropertyStatement>(); ArrayList<ObjectPropertyStatement> filtered = new ArrayList<ObjectPropertyStatement>();
Filter.filter(opStmts, _filters.getObjectPropertyStatementFilter(), filtered); Filter.filter(opStmts, _filters.getObjectPropertyStatementFilter(), filtered);
return filtered; return filtered;
@ -563,8 +560,8 @@ public class IndividualFiltering implements Individual {
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
_innerIndividual.resolveAsFauxPropertyStatement(stmt); _innerIndividual.resolveAsFauxPropertyStatements(list);
} }
} }

View file

@ -37,9 +37,7 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec
private List<ObjectPropertyStatement> filterAndWrapList(List<ObjectPropertyStatement> list){ private List<ObjectPropertyStatement> filterAndWrapList(List<ObjectPropertyStatement> list){
if( ( list ) != null ){ if( ( list ) != null ){
for (ObjectPropertyStatement stmt: list) { innerObjectPropertyStatementDao.resolveAsFauxPropertyStatements(list);
innerObjectPropertyStatementDao.resolveAsFauxPropertyStatement(stmt);
}
ArrayList<ObjectPropertyStatement> ctemp = new ArrayList<ObjectPropertyStatement>(); ArrayList<ObjectPropertyStatement> ctemp = new ArrayList<ObjectPropertyStatement>();
Filter.filter(list,filters.getObjectPropertyStatementFilter(),ctemp); Filter.filter(list,filters.getObjectPropertyStatementFilter(),ctemp);
@ -142,8 +140,8 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
innerObjectPropertyStatementDao.resolveAsFauxPropertyStatement(stmt); innerObjectPropertyStatementDao.resolveAsFauxPropertyStatements(list);
} }
} }

View file

@ -99,12 +99,12 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
@Override @Override
public List<FauxProperty> getFauxPropertiesForBaseUri(String uri) { public List<FauxProperty> getFauxPropertiesForBaseUri(String uri) {
try (LockedOntModel displayModel = models.getDisplayModel().read()) { if (uri == null) {
if (uri == null) { return Collections.emptyList();
return Collections.emptyList(); }
}
List<String> contextUris = new ArrayList<>(); try (LockedOntModel displayModel = models.getDisplayModel().read()) {
Set<String> contextUris = new HashSet<>();
ResIterator contextResources = displayModel ResIterator contextResources = displayModel
.listSubjectsWithProperty(CONFIG_CONTEXT_FOR, .listSubjectsWithProperty(CONFIG_CONTEXT_FOR,
createResource(uri)); createResource(uri));
@ -131,11 +131,11 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
*/ */
@Override @Override
public FauxProperty getFauxPropertyFromContextUri(String contextUri) { public FauxProperty getFauxPropertyFromContextUri(String contextUri) {
try (LockedOntModel displayModel = models.getDisplayModel().read()) { if (contextUri == null) {
if (contextUri == null) { return null;
return null; }
}
try (LockedOntModel displayModel = models.getDisplayModel().read()) {
OntResource context = displayModel.createOntResource(contextUri); OntResource context = displayModel.createOntResource(contextUri);
if (!displayModel.contains(context, RDF.type, CONFIG_CONTEXT)) { if (!displayModel.contains(context, RDF.type, CONFIG_CONTEXT)) {
log.debug("'" + contextUri + "' is not a CONFIG_CONTEXT"); log.debug("'" + contextUri + "' is not a CONFIG_CONTEXT");
@ -634,5 +634,4 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
} }
} }
} }

View file

@ -618,8 +618,8 @@ public class IndividualJena extends IndividualImpl implements Individual {
} }
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatement(stmt); webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatements(list);
} }
} }

View file

@ -1088,8 +1088,8 @@ public class IndividualSDB extends IndividualImpl implements Individual {
} }
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatement(stmt); webappDaoFactory.getObjectPropertyStatementDao().resolveAsFauxPropertyStatements(list);
} }
} }

View file

@ -559,47 +559,72 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec
* accordingly. * accordingly.
*/ */
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
if (stmt == null) { if (list == null || list.size() == 0) {
return; return;
} }
ObjectProperty prop = obtainObjectPropertyFromStatement(stmt); Map<String, List<FauxProperty>> fauxPropMap = new HashMap<String, List<FauxProperty>>();
if (prop == null) { Map<String, List<VClass>> subjectTypeMap = new HashMap<String, List<VClass>>();
return; Map<String, List<VClass>> objectTypeMap = new HashMap<String, List<VClass>>();
}
List<FauxProperty> fauxProps = getWebappDaoFactory() for (ObjectPropertyStatement stmt : list) {
.getFauxPropertyDao() ObjectProperty prop = obtainObjectPropertyFromStatement(stmt);
.getFauxPropertiesForBaseUri(prop.getURI()); if (prop != null) {
if (fauxProps.isEmpty()) { List<FauxProperty> fauxProps = fauxPropMap.get(prop.getURI());
return; if (fauxProps == null) {
} fauxProps = getWebappDaoFactory()
.getFauxPropertyDao()
.getFauxPropertiesForBaseUri(prop.getURI());
Individual subject = obtainSubjectFromStatement(stmt); fauxPropMap.put(prop.getURI(), fauxProps);
if (subject == null) { }
return;
}
Individual object = obtainObjectFromStatement(stmt); if (fauxProps != null && !fauxProps.isEmpty()) {
if (object == null) { List<VClass> subjectTypes = null;
return; List<VClass> objectTypes = null;
}
List<VClass> subjectTypes = subject.getVClasses(); if (stmt.getSubjectURI() != null) {
List<VClass> objectTypes = object.getVClasses(); subjectTypes = subjectTypeMap.get(stmt.getSubjectURI());
for (FauxProperty fauxProp : fauxProps) { }
VClass subjectType = selectType(subjectTypes,
fauxProp.getDomainURI()); if (stmt.getObjectURI() != null) {
VClass objectType = selectType(objectTypes, fauxProp.getRangeURI()); objectTypes = objectTypeMap.get(stmt.getObjectURI());
if (subjectType != null && objectType != null) { }
prop.setDomainVClass(subjectType);
prop.setDomainVClassURI(subjectType.getURI()); if (subjectTypes == null) {
prop.setRangeVClass(objectType); Individual subject = obtainSubjectFromStatement(stmt);
prop.setRangeVClassURI(objectType.getURI()); if (subject != null) {
return; subjectTypes = subject.getVClasses();
} subjectTypeMap.put(stmt.getSubjectURI(), subjectTypes);
} }
}
if (objectTypes == null) {
Individual object = obtainObjectFromStatement(stmt);
if (object != null) {
objectTypes = object.getVClasses();
objectTypeMap.put(stmt.getObjectURI(), objectTypes);
}
}
if (subjectTypes != null && objectTypes != null) {
for (FauxProperty fauxProp : fauxProps) {
VClass subjectType = selectType(subjectTypes, fauxProp.getDomainURI());
VClass objectType = selectType(objectTypes, fauxProp.getRangeURI());
if (subjectType != null && objectType != null) {
prop.setDomainVClass(subjectType);
prop.setDomainVClassURI(subjectType.getURI());
prop.setRangeVClass(objectType);
prop.setRangeVClassURI(objectType.getURI());
break;
}
}
}
}
}
}
} }
private ObjectProperty obtainObjectPropertyFromStatement( private ObjectProperty obtainObjectPropertyFromStatement(

View file

@ -209,7 +209,7 @@ public class IndividualStub implements Individual {
} }
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
// Nothing to do: no associated webappDaoFactory // Nothing to do: no associated webappDaoFactory
} }

View file

@ -231,9 +231,9 @@ public class ObjectPropertyStatementDaoStub implements
} }
@Override @Override
public void resolveAsFauxPropertyStatement(ObjectPropertyStatement stmt) { public void resolveAsFauxPropertyStatements(List<ObjectPropertyStatement> list) {
throw new RuntimeException( throw new RuntimeException(
"ObjectPropertyStatementDaoStub.resolveAsFauxPropertyStatement() not implemented."); "ObjectPropertyStatementDaoStub.resolveAsFauxPropertyStatements() not implemented.");
} }
} }