From 3d8f5d921cda4a9cdb7faf80dbcecdeec9c1f095 Mon Sep 17 00:00:00 2001 From: cdtank Date: Mon, 10 Jan 2011 23:48:47 +0000 Subject: [PATCH] 1. Added temporal graph link for the highest organization code for "organizations" page. 2. Cleaned up some query runners. 3. Made GenericQueryRunner to accept sparql queries that does not depend on URIs. 4. Adde style for temporal graph link to wilma.css --- .../menupage--classgroup-organizations.ftl | 34 +++++- .../VisualizationFrameworkConstants.java | 1 + .../PersonPublicationCountQueryRunner.java | 23 +--- .../utilities/UtilitiesRequestHandler.java | 102 +++++++++++++++++- .../visutils/AllPropertiesQueryRunner.java | 20 +--- .../visutils/GenericQueryRunner.java | 66 ++++-------- themes/wilma/css/wilma.css | 5 + 7 files changed, 161 insertions(+), 90 deletions(-) diff --git a/productMods/templates/freemarker/body/menupage/menupage--classgroup-organizations.ftl b/productMods/templates/freemarker/body/menupage/menupage--classgroup-organizations.ftl index f8124f39..6cb4ea6a 100644 --- a/productMods/templates/freemarker/body/menupage/menupage--classgroup-organizations.ftl +++ b/productMods/templates/freemarker/body/menupage/menupage--classgroup-organizations.ftl @@ -1,7 +1,37 @@ <#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#assign visualizationLink> - <#-- Chintan...place your markup for the visualization link here --> - Temporal Graph + + <#assign temporalGraphIcon = '${urls.images}/visualization/temporal_vis_small_icon.jpg'> + + + + ${stylesheets.add("css/visualization/visualization.css")} + + + + <#include "menupage.ftl"> \ No newline at end of file diff --git a/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java index 26fce924..c4176367 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java +++ b/src/edu/cornell/mannlib/vitro/webapp/controller/visualization/freemarker/VisualizationFrameworkConstants.java @@ -87,6 +87,7 @@ public class VisualizationFrameworkConstants { public static final String UNIVERSITY_COMPARISON_VIS_MODE = "UNIVERSITY"; public static final String SCHOOL_COMPARISON_VIS_MODE = "SCHOOL"; public static final String DEPARTMENT_COMPARISON_VIS_MODE = "DEPARTMENT"; + public static final String HIGHEST_LEVEL_ORGANIZATION_VIS_MODE = "HIGHEST_LEVEL_ORGANIZATION"; /* diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountQueryRunner.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountQueryRunner.java index f370a811..957a0ec0 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountQueryRunner.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/personpubcount/PersonPublicationCountQueryRunner.java @@ -151,28 +151,12 @@ public class PersonPublicationCountQueryRunner implements QueryRunner \n" + sparqlQuery); return sparqlQuery; } diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java index 4de53f41..7311d25d 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/utilities/UtilitiesRequestHandler.java @@ -96,11 +96,11 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler { QueryRunner imageQueryHandler = - new GenericQueryRunner(individualURI, - fieldLabelToOutputFieldLabel, + new GenericQueryRunner(fieldLabelToOutputFieldLabel, + "", whereClause, - dataSource, - log); + "", + dataSource, log); return getThumbnailInformation(imageQueryHandler.getQueryResult(), fieldLabelToOutputFieldLabel); @@ -155,6 +155,48 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler { return UrlBuilder.getUrl(VisualizationFrameworkConstants.FREEMARKERIZED_VISUALIZATION_URL_PREFIX, personLevelURLParams); + } else if (VisualizationFrameworkConstants.HIGHEST_LEVEL_ORGANIZATION_VIS_MODE + .equalsIgnoreCase(visMode)) { + + Map fieldLabelToOutputFieldLabel = new HashMap(); + fieldLabelToOutputFieldLabel.put("organization", + QueryFieldLabels.ORGANIZATION_URL); + fieldLabelToOutputFieldLabel.put("organizationLabel", QueryFieldLabels.ORGANIZATION_LABEL); + + String aggregationRules = "(count(?organization) AS ?numOfChildren)"; + + String whereClause = "?organization rdf:type foaf:Organization ; rdfs:label ?organizationLabel . \n" + + "OPTIONAL { ?organization core:hasSubOrganization ?subOrg } . \n" + + "OPTIONAL { ?organization core:subOrganizationWithin ?parent } . \n" + + "FILTER ( !bound(?parent) ). \n"; + + String groupOrderClause = "GROUP BY ?organization ?organizationLabel \n" + + "ORDER BY DESC(?numOfChildren)\n" + + "LIMIT 1\n"; + + QueryRunner highestLevelOrganizationQueryHandler = + new GenericQueryRunner(fieldLabelToOutputFieldLabel, + aggregationRules, + whereClause, + groupOrderClause, + dataSource, log); + + return getHighestLevelOrganizationTemporalGraphVisURL( + highestLevelOrganizationQueryHandler.getQueryResult(), + fieldLabelToOutputFieldLabel); + + /* + + GenericQueryMap highestLevelOrganizationToValues = getHighestLevelOrganizationInformation( + highestLevelOrganizationQueryHandler.getQueryResult(), + fieldLabelToOutputFieldLabel); + + Gson highestLevelOrganizationInformation = new Gson(); + + return highestLevelOrganizationInformation.toJson(highestLevelOrganizationToValues); + + */ + } else { ParamMap individualProfileURLParams = new ParamMap(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY, @@ -166,6 +208,58 @@ public class UtilitiesRequestHandler implements VisualizationRequestHandler { } + private String getHighestLevelOrganizationTemporalGraphVisURL(ResultSet resultSet, + Map fieldLabelToOutputFieldLabel) { + + GenericQueryMap queryResult = new GenericQueryMap(); + + + while (resultSet.hasNext()) { + QuerySolution solution = resultSet.nextSolution(); + + + RDFNode organizationNode = solution.get( + fieldLabelToOutputFieldLabel + .get("organization")); + + if (organizationNode != null) { + queryResult.addEntry(fieldLabelToOutputFieldLabel.get("organization"), organizationNode.toString()); + + ParamMap highestLevelOrganizationTemporalGraphVisURLParams = new ParamMap(VisualizationFrameworkConstants.INDIVIDUAL_URI_KEY, + organizationNode.toString(), + VisualizationFrameworkConstants.VIS_TYPE_KEY, + VisualizationFrameworkConstants.ENTITY_COMPARISON_VIS, + + /* Remove this hard-coded vis_mode once Deepak fixes the Temporal Graph Vis + * front-end to work without vis_modes. */ + VisualizationFrameworkConstants.VIS_MODE_KEY, + "University"); + + return UrlBuilder.getUrl(VisualizationFrameworkConstants.FREEMARKERIZED_VISUALIZATION_URL_PREFIX, + highestLevelOrganizationTemporalGraphVisURLParams); + + + } + + RDFNode organizationLabelNode = solution.get( + fieldLabelToOutputFieldLabel + .get("organizationLabel")); + + if (organizationLabelNode != null) { + queryResult.addEntry(fieldLabelToOutputFieldLabel.get("organizationLabel"), organizationLabelNode.toString()); + } + + RDFNode numberOfChildrenNode = solution.getLiteral("numOfChildren"); + + if (numberOfChildrenNode != null) { + queryResult.addEntry("numOfChildren", String.valueOf(numberOfChildrenNode.asLiteral().getInt())); + } + } + +// return queryResult; + return ""; + } + private String getThumbnailInformation(ResultSet resultSet, Map fieldLabelToOutputFieldLabel) { diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/AllPropertiesQueryRunner.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/AllPropertiesQueryRunner.java index 6ab93ee7..fa5f8be5 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/AllPropertiesQueryRunner.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/AllPropertiesQueryRunner.java @@ -77,24 +77,10 @@ public class AllPropertiesQueryRunner implements QueryRunner { DataSource dataSource) { QueryExecution queryExecution = null; -// try { - Query query = QueryFactory.create(queryText, SYNTAX); + Query query = QueryFactory.create(queryText, SYNTAX); -// QuerySolutionMap qs = new QuerySolutionMap(); -// qs.add("authPerson", queryParam); // bind resource to s - - queryExecution = QueryExecutionFactory.create(query, dataSource); - - // if (query.isSelectType()) { - return queryExecution.execSelect(); -// } -// } finally { -// if (queryExecution != null) { -// queryExecution.close(); -// } -// -// } -// return null; + queryExecution = QueryExecutionFactory.create(query, dataSource); + return queryExecution.execSelect(); } private String generateGenericSparqlQuery(String queryURI, String filterRule) { diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/GenericQueryRunner.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/GenericQueryRunner.java index b9a52641..ba89016a 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/GenericQueryRunner.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/freemarker/visutils/GenericQueryRunner.java @@ -4,12 +4,8 @@ package edu.cornell.mannlib.vitro.webapp.visualization.freemarker.visutils; import java.util.Map; -import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; -import com.hp.hpl.jena.iri.IRI; -import com.hp.hpl.jena.iri.IRIFactory; -import com.hp.hpl.jena.iri.Violation; import com.hp.hpl.jena.query.DataSource; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; @@ -33,22 +29,27 @@ public class GenericQueryRunner implements QueryRunner { protected static final Syntax SYNTAX = Syntax.syntaxARQ; - private String whereClause, individualURLParam; + private String whereClause; private DataSource dataSource; private Log log; private Map fieldLabelToOutputFieldLabel; - public GenericQueryRunner(String individualURLParam, - Map fieldLabelToOutputFieldLabel, - String whereClause, - DataSource dataSource, - Log log) { + private String groupOrderClause; + + private String aggregationRules; + + public GenericQueryRunner(Map fieldLabelToOutputFieldLabel, + String aggregationRules, + String whereClause, + String groupOrderClause, + DataSource dataSource, Log log) { - this.individualURLParam = individualURLParam; this.fieldLabelToOutputFieldLabel = fieldLabelToOutputFieldLabel; + this.aggregationRules = aggregationRules; this.whereClause = whereClause; + this.groupOrderClause = groupOrderClause; this.dataSource = dataSource; this.log = log; @@ -58,30 +59,12 @@ public class GenericQueryRunner implements QueryRunner { DataSource dataSource) { QueryExecution queryExecution = null; -// try { - Query query = QueryFactory.create(queryText, SYNTAX); - -// QuerySolutionMap qs = new QuerySolutionMap(); -// qs.add("authPerson", queryParam); // bind resource to s - - queryExecution = QueryExecutionFactory.create(query, dataSource); - - - //remocve this if loop after knowing what is describe & construct sparql stuff. -// if (query.isSelectType()) { - return queryExecution.execSelect(); -// } -// } finally { -// if (queryExecution != null) { -// queryExecution.close(); -// } -// -// } -// return null; + Query query = QueryFactory.create(queryText, SYNTAX); + queryExecution = QueryExecutionFactory.create(query, dataSource); + return queryExecution.execSelect(); } private String generateGenericSparqlQuery() { -// Resource uri1 = ResourceFactory.createResource(queryURI); StringBuilder sparqlQuery = new StringBuilder(); sparqlQuery.append(QueryConstants.getSparqlPrefixQuery()); @@ -96,32 +79,21 @@ public class GenericQueryRunner implements QueryRunner { } + sparqlQuery.append("\n" + this.aggregationRules + "\n"); + sparqlQuery.append("WHERE {\n"); sparqlQuery.append(this.whereClause); sparqlQuery.append("}\n"); + sparqlQuery.append(this.groupOrderClause); + return sparqlQuery.toString(); } public ResultSet getQueryResult() throws MalformedQueryParametersException { - if (StringUtils.isNotBlank(this.individualURLParam)) { - /* - * To test for the validity of the URI submitted. - * */ - IRIFactory iRIFactory = IRIFactory.jenaImplementation(); - IRI iri = iRIFactory.create(this.individualURLParam); - if (iri.hasViolation(false)) { - String errorMsg = ((Violation) iri.violations(false).next()).getShortMessage(); - log.error("Generic Query " + errorMsg); - throw new MalformedQueryParametersException( - "URI provided for an individual is malformed."); - } - } else { - throw new MalformedQueryParametersException("URI parameter is either null or empty."); - } ResultSet resultSet = executeQuery(generateGenericSparqlQuery(), this.dataSource); diff --git a/themes/wilma/css/wilma.css b/themes/wilma/css/wilma.css index acee4502..d2683e54 100644 --- a/themes/wilma/css/wilma.css +++ b/themes/wilma/css/wilma.css @@ -837,6 +837,11 @@ ul#foaf-person-childClasses .count-classes { font-size: .75em; } /* VISUAL GRAPH CLASS:GENERIC (ORGANIZATION, RESEARCH, EVENT) ------> */ +#temporal-graph-link-container { + display: none; + float: right; + width: 128px; +} #content-generic-class { width: 900px; }