From 9e2f8439ef0272115411710c81646bfdfa789364 Mon Sep 17 00:00:00 2001 From: Graham Triggs Date: Fri, 7 Apr 2017 15:25:48 -0600 Subject: [PATCH] Cumulative publications graph --- .../CumulativeCountRequestHandler.java | 144 ++++++++++++++++++ .../PersonPublicationCountQueryRunner.java | 12 +- .../visualization/valueobjects/Activity.java | 5 + .../visualizations-beans-injection-fm.xml | 7 + .../individual-visualizationFoafPerson.ftl | 123 +++++++++++++-- 5 files changed, 275 insertions(+), 16 deletions(-) create mode 100644 api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/CumulativeCountRequestHandler.java diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/CumulativeCountRequestHandler.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/CumulativeCountRequestHandler.java new file mode 100644 index 00000000..4ffa5a3d --- /dev/null +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/CumulativeCountRequestHandler.java @@ -0,0 +1,144 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.visualization.personpubcount; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; +import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException; +import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Activity; +import edu.cornell.mannlib.vitro.webapp.visualization.visutils.QueryRunner; +import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VisualizationRequestHandler; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.jena.query.Dataset; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +public class CumulativeCountRequestHandler implements VisualizationRequestHandler { + @Override + public AuthorizationRequest getRequiredPrivileges() { + return null; + } + + @Override + public ResponseValues generateStandardVisualization(VitroRequest vitroRequest, Log log, Dataset dataSource) throws MalformedQueryParametersException { + return null; + } + + @Override + public ResponseValues generateVisualizationForShortURLRequests(Map parameters, VitroRequest vitroRequest, Log log, Dataset dataSource) throws MalformedQueryParametersException { + return null; + } + + @Override + public Object generateAjaxVisualization(VitroRequest vitroRequest, Log log, Dataset dataSource) throws MalformedQueryParametersException { + String personURI = vitroRequest.getParameter("uri"); + + QueryRunner> queryManager = new PersonPublicationCountQueryRunner( + personURI, + vitroRequest.getRDFService(), + log); + + Set authorDocuments = queryManager.getQueryResult(); + + Map> yearToTypeCount = new TreeMap>(); + for (Activity currentActivity : authorDocuments) { + String activityYearStr = currentActivity.getParsedActivityYear(); + Integer activityYear; + try { + activityYear = Integer.parseInt(activityYearStr, 10); + } catch (NumberFormatException nfe) { + activityYear = 0; + } + + Map typeCounts; + if (yearToTypeCount.containsKey(activityYear)) { + typeCounts = yearToTypeCount.get(activityYear); + } else { + typeCounts = new TreeMap(); + yearToTypeCount.put(activityYear, typeCounts); + } + + String activityType = currentActivity.getActivityType(); + if (StringUtils.isEmpty(activityType)) { + activityType = "http://purl.org/ontology/bibo/Document"; + } + + if (typeCounts.containsKey(activityType)) { + typeCounts.put(activityType, typeCounts.get(activityType) + 1); + + } else { + typeCounts.put(activityType, 1); + } + } + + StringBuilder csv = new StringBuilder(); + + csv.append("Year,Previous,Other,Books,Articles\n"); + + int currentYear = Calendar.getInstance().get(Calendar.YEAR); + + List years = new ArrayList(yearToTypeCount.keySet()); + for (int year = currentYear - 9; year < currentYear + 1; year++) { + if (!years.contains(year)) { + years.add(year); + } + } + + Collections.sort(years); + int publicationCount = 0; + for (Integer year : years) { + if (year < currentYear - 9) { + if (yearToTypeCount.containsKey(year)) { + Map typeCounts = yearToTypeCount.get(year); + for (Map.Entry entry : typeCounts.entrySet()) { + publicationCount += entry.getValue(); + } + } + } else { + int articleCount = 0; + int bookCount = 0; + int otherCount = 0; + + if (yearToTypeCount.containsKey(year)) { + Map typeCounts = yearToTypeCount.get(year); + for (Map.Entry entry : typeCounts.entrySet()) { + if ("http://purl.org/ontology/bibo/AcademicArticle".equalsIgnoreCase(entry.getKey()) || + "http://purl.org/ontology/bibo/Article".equalsIgnoreCase(entry.getKey()) ) { + articleCount += entry.getValue(); + } else if ("http://purl.org/ontology/bibo/Book".equalsIgnoreCase(entry.getKey()) || + "http://purl.org/ontology/bibo/BookSection".equalsIgnoreCase(entry.getKey()) || + "http://purl.org/ontology/bibo/Chapter".equalsIgnoreCase(entry.getKey()) || + "http://purl.org/ontology/bibo/EditedBook".equalsIgnoreCase(entry.getKey()) ) { + bookCount += entry.getValue(); + } else { + otherCount += entry.getValue(); + } + } + } + + csv.append(year).append(",") + .append(publicationCount).append(",") + .append(otherCount).append(",") + .append(bookCount).append(",") + .append(articleCount).append("\n"); + + publicationCount += articleCount + bookCount + otherCount; + } + } + + return csv.toString(); + } + + @Override + public Map generateDataVisualization(VitroRequest vitroRequest, Log log, Dataset dataset) throws MalformedQueryParametersException { + return null; + } +} diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/PersonPublicationCountQueryRunner.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/PersonPublicationCountQueryRunner.java index 8af4dbb9..544423e6 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/PersonPublicationCountQueryRunner.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/visualization/personpubcount/PersonPublicationCountQueryRunner.java @@ -75,6 +75,7 @@ public class PersonPublicationCountQueryRunner implements QueryRunner rdfs:label ?authorName .\n" + " <" + queryURI + "> core:authorOf ?document .\n" + + " ?document vitro:mostSpecificType ?publicationType .\n" + " ?document core:publicationDate ?publicationDate .\n" + "}\n" + "WHERE" @@ -86,7 +87,8 @@ public class PersonPublicationCountQueryRunner implements QueryRunner rdf:type foaf:Person ;\n" + " core:relatedBy ?authorshipNode . \n" @@ -106,9 +108,10 @@ public class PersonPublicationCountQueryRunner implements QueryRunner core:authorOf ?document . \n" + + " OPTIONAL { ?document vitro:mostSpecificType ?publicationType . } .\n" + " OPTIONAL { ?document core:publicationDate ?publicationDate . } .\n" + "}\n"; @@ -172,6 +175,11 @@ public class PersonPublicationCountQueryRunner implements QueryRunner + + @@ -53,6 +56,10 @@ + + + + diff --git a/webapp/src/main/webapp/themes/tenderfoot/templates/body/partials/individual/individual-visualizationFoafPerson.ftl b/webapp/src/main/webapp/themes/tenderfoot/templates/body/partials/individual/individual-visualizationFoafPerson.ftl index 1af7cad3..c7729982 100644 --- a/webapp/src/main/webapp/themes/tenderfoot/templates/body/partials/individual/individual-visualizationFoafPerson.ftl +++ b/webapp/src/main/webapp/themes/tenderfoot/templates/body/partials/individual/individual-visualizationFoafPerson.ftl @@ -18,16 +18,120 @@ <#assign standardVisualizationURLRoot ="/visualization"> <#if isAuthor> + ${scripts.add('')} + <#assign coAuthorIcon = "${urls.images}/visualization/coauthorship/co_author_icon.png"> <#assign mapOfScienceIcon = "${urls.images}/visualization/mapofscience/scimap_icon.png"> <#assign coAuthorVisUrl = individual.coAuthorVisUrl()> <#assign mapOfScienceVisUrl = individual.mapOfScienceUrl()> - <#assign googleJSAPI = "https://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22packages%22%3A%5B%22imagesparkline%22%5D%7D%5D%7D"> - - ${i18n().publications_in_vivo} - -
 
+ ${i18n().publications_in_vivo} + + + + + - - ${scripts.add('', - '', - '')} - - <#if isInvestigator>