From 65453eaed832f809e30ef7993bfd4e79007c9b01 Mon Sep 17 00:00:00 2001 From: ryounes Date: Wed, 13 Jul 2011 21:21:12 +0000 Subject: [PATCH] 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. --- .../DataPropertyStatementDaoFiltering.java | 46 +++++++++++++++++-- .../ObjectPropertyStatementDaoFiltering.java | 44 ++++++++++++++++-- 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/DataPropertyStatementDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/DataPropertyStatementDaoFiltering.java index 63540bd0f..c11a36d4c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/DataPropertyStatementDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/DataPropertyStatementDaoFiltering.java @@ -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 getDataPropertyValuesForIndividualByProperty(Individual subject, DataProperty property) { - return innerDataPropertyStatementDao.getDataPropertyValuesForIndividualByProperty(subject, property); + return getDataPropertyValuesForIndividualByProperty(subject.getURI(), property.getURI()); } @Override - // RY What about filtering? public List getDataPropertyValuesForIndividualByProperty(String subjectUri, String propertyUri) { - return innerDataPropertyStatementDao.getDataPropertyValuesForIndividualByProperty(subjectUri, propertyUri); + List 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 stmtsToLiterals = + new HashMap(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 stmtList = new ArrayList(stmtsToLiterals.keySet()); + + // Apply the filters to the list of statements + List filteredStatements = filter(stmtList, filters.getDataPropertyStatementFilter()); + + // Get the literals associated with the filtered statements out of the original list + List filteredLiterals = new ArrayList(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; + } } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java index 1d3fc1598..a4ab893d1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java @@ -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> 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> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, String objectKey, String query, Set queryStrings) { - return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, queryStrings); - } + + List> 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> stmtsToData = + new HashMap>(data.size()); + + for (Map map : data) { + String objectUri = map.get(objectKey); + ObjectPropertyStatement statement = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri); + stmtsToData.put(statement, map); + } + + List stmtList = new ArrayList(stmtsToData.keySet()); + + // Apply the filters to the list of statements + List filteredStatements = filterAndWrapList(stmtList, filters); + + // Get the data associated with the filtered statements out of the map + List> filteredData = new ArrayList>(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 getMostSpecificTypesForIndividual(String subjectUri) {