NIHVIVO-2476 Filtering on object and data property statement data returned from sparql queries. Filters not working yet on properties with display or update level self-authenticated, but results are no worse than previously.

This commit is contained in:
ryounes 2011-07-13 21:21:12 +00:00
parent 4c55db1ac6
commit 65453eaed8
2 changed files with 83 additions and 7 deletions

View file

@ -2,14 +2,20 @@
package edu.cornell.mannlib.vitro.webapp.dao.filtering;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.hp.hpl.jena.rdf.model.Literal;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
@ -94,15 +100,47 @@ class DataPropertyStatementDaoFiltering extends BaseFiltering implements DataPro
}
@Override
// RY What about filtering?
public List<Literal> getDataPropertyValuesForIndividualByProperty(Individual subject, DataProperty property) {
return innerDataPropertyStatementDao.getDataPropertyValuesForIndividualByProperty(subject, property);
return getDataPropertyValuesForIndividualByProperty(subject.getURI(), property.getURI());
}
@Override
// RY What about filtering?
public List<Literal> getDataPropertyValuesForIndividualByProperty(String subjectUri, String propertyUri) {
return innerDataPropertyStatementDao.getDataPropertyValuesForIndividualByProperty(subjectUri, propertyUri);
List<Literal> literals = innerDataPropertyStatementDao.getDataPropertyValuesForIndividualByProperty(subjectUri, propertyUri);
/* Filter the data
*
* Filtering is applied to a list of DataPropertyStatement. Create these statements, mapped
* to the literal that they are built from, apply filtering to the statements, then get
* the associated literals out of the original list.
*/
Map<DataPropertyStatement, Literal> stmtsToLiterals =
new HashMap<DataPropertyStatement, Literal>(literals.size());
for (Literal literal : literals) {
String value = literal.getLexicalForm();
DataPropertyStatement statement = new DataPropertyStatementImpl(subjectUri, propertyUri, value);
statement.setDatatypeURI(literal.getDatatypeURI());
statement.setLanguage(literal.getLanguage());
stmtsToLiterals.put(statement, literal);
}
List<DataPropertyStatement> stmtList = new ArrayList<DataPropertyStatement>(stmtsToLiterals.keySet());
// Apply the filters to the list of statements
List<DataPropertyStatement> filteredStatements = filter(stmtList, filters.getDataPropertyStatementFilter());
// Get the literals associated with the filtered statements out of the original list
List<Literal> filteredLiterals = new ArrayList<Literal>(filteredStatements.size());
for (DataPropertyStatement dps : filteredStatements) {
if (dps instanceof DataPropertyStatementFiltering) {
dps = ((DataPropertyStatementFiltering)dps).innerStmt;
}
filteredLiterals.add(stmtsToLiterals.get(dps));
}
// Return the filtered list of literals
return filteredLiterals;
}
}

View file

@ -3,6 +3,8 @@
package edu.cornell.mannlib.vitro.webapp.dao.filtering;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -11,6 +13,7 @@ import net.sf.jga.algorithms.Filter;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
@ -85,14 +88,49 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec
@Override
public List<Map<String, String>> getObjectPropertyStatementsForIndividualByProperty(
String subjectUri, String propertyUri, String objectKey, String query) {
return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query);
return getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, null);
}
@Override
public List<Map<String, String>> getObjectPropertyStatementsForIndividualByProperty(
String subjectUri, String propertyUri, String objectKey, String query, Set<String> queryStrings) {
return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, queryStrings);
}
List<Map<String, String>> data = innerObjectPropertyStatementDao.
getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, queryStrings);
/* Filter the data
*
* Filtering is applied to a list of ObjectPropertyStatements. Create these statements, mapped
* to the item in data that they are built from, apply filtering to the statements, then get
* the associated data out of the original list.
*/
Map<ObjectPropertyStatement, Map<String, String>> stmtsToData =
new HashMap<ObjectPropertyStatement, Map<String, String>>(data.size());
for (Map<String, String> map : data) {
String objectUri = map.get(objectKey);
ObjectPropertyStatement statement = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri);
stmtsToData.put(statement, map);
}
List<ObjectPropertyStatement> stmtList = new ArrayList<ObjectPropertyStatement>(stmtsToData.keySet());
// Apply the filters to the list of statements
List<ObjectPropertyStatement> filteredStatements = filterAndWrapList(stmtList, filters);
// Get the data associated with the filtered statements out of the map
List<Map<String, String>> filteredData = new ArrayList<Map<String, String>>(filteredStatements.size());
for (ObjectPropertyStatement ops : filteredStatements) {
if (ops instanceof ObjectPropertyStatementFiltering) {
ops = ((ObjectPropertyStatementFiltering)ops).innerStmt;
}
filteredData.add(stmtsToData.get(ops));
}
// Return the filtered list of data
return filteredData;
}
@Override
public Map<String, String> getMostSpecificTypesForIndividual(String subjectUri) {