From 662aa2145214b13c91a63fde176665a718605830 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 26 Aug 2017 14:27:55 +0000 Subject: [PATCH] User configurable sorting for Native SQL Publications List git-svn-id: https://svn.libreccm.org/ccm/trunk@4934 8810af33-2d31-482b-a856-94f89814c4df --- .../navigation/PublicationList.java | 251 +++++++++++------- 1 file changed, 150 insertions(+), 101 deletions(-) diff --git a/ccm-sci-publications-navigation/src/com/arsdigita/cms/scipublications/navigation/PublicationList.java b/ccm-sci-publications-navigation/src/com/arsdigita/cms/scipublications/navigation/PublicationList.java index d73278da5..1269425ec 100644 --- a/ccm-sci-publications-navigation/src/com/arsdigita/cms/scipublications/navigation/PublicationList.java +++ b/ccm-sci-publications-navigation/src/com/arsdigita/cms/scipublications/navigation/PublicationList.java @@ -31,8 +31,50 @@ import javax.servlet.http.HttpServletResponse; */ public class PublicationList extends AbstractComponent { - private final PreparedStatement publicationsQueryStatement; + private final static String PUBLIATIONS_QUERY_TEMPLATE + = "SELECT cms_items.item_id, name, version, language, object_type, " + + "master_id, parent_id, title, cms_pages.description, " + + "year, abstract, misc, reviewed, authors, firstPublished, lang, " + + "isbn, ct_publication_with_publisher.volume, number_of_volumes, _number_of_pages, ct_publication_with_publisher.edition, " + + "nameofconference, place_of_conference, date_from_of_conference, date_to_of_conference, " + + "ct_article_in_collected_volume.pages_from AS collvol_pages_from, ct_article_in_collected_volume.pages_to AS collvol_pages_to, chapter, " + + "ct_article_in_journal.pages_from AS journal_pages_from, ct_article_in_journal.pages_to AS journal_pages_to, ct_article_in_journal.volume AS journal_volume, issue, publication_date, " + + "ct_expertise.place AS expertise_place, ct_expertise.number_of_pages AS expertise_number_of_pages, " + + "ct_inproceedings.pages_from AS inproceedings_pages_from, ct_inproceedings.pages_to AS inproceedings_pages_to, " + + "ct_internet_article.place AS internet_article_place, " + + "ct_internet_article.number AS internet_article_number, " + + "ct_internet_article.number_of_pages AS internet_article_number_of_pages, " + + "ct_internet_article.edition AS internet_article_edition, " + + "ct_internet_article.issn AS internet_article_issn, " + + "ct_internet_article.last_accessed AS internet_article_last_accessed, " + + "ct_internet_article.publicationdate AS internet_article_publication_date, " + + "ct_internet_article.url AS internet_article_url, " + + "ct_internet_article.urn AS internet_article_urn, " + + "ct_internet_article.doi AS internet_article_doi, " + + "ct_unpublished.place AS unpublished_place, " + + "ct_unpublished.number AS unpublished_number, " + + "ct_unpublished.number_of_pages AS unpublished_number_of_pages, " + + "ct_grey_literature.pagesfrom AS grey_literature_pages_from, " + + "ct_grey_literature.pagesto AS grey_literature_pages_to " + + "FROM cms_items " + + "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id " + + "JOIN content_types ON cms_items.type_id = content_types.type_id " + + "JOIN ct_publications ON cms_items.item_id = ct_publications.publication_id " + + "LEFT JOIN ct_publication_with_publisher ON ct_publications.publication_id = ct_publication_with_publisher.publication_with_publisher_id " + + "LEFT JOIN ct_proceedings ON ct_publications.publication_id = ct_proceedings.proceedings_id " + + "LEFT JOIN ct_article_in_collected_volume ON ct_publications.publication_id = ct_article_in_collected_volume.article_id " + + "LEFT JOIN ct_article_in_journal ON ct_publications.publication_id = ct_article_in_journal.article_in_journal_id " + + "LEFT JOIN ct_expertise ON ct_publications.publication_id = ct_expertise.expertise_id " + + "LEFT JOIN ct_inproceedings ON ct_publications.publication_id = ct_inproceedings.inproceedings_id " + + "LEFT JOIN ct_internet_article ON ct_publications.publication_id = ct_internet_article.internet_article_id " + + "LEFT JOIN ct_unpublished ON ct_publications.publication_id = ct_unpublished.unpublished_id " + + "LEFT JOIN ct_grey_literature ON ct_unpublished.unpublished_id = ct_grey_literature.grey_literature_id " + + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " + + "%s " + + "LIMIT ? OFFSET ?"; +// private final PreparedStatement publicationsQueryStatement; private final PreparedStatement countPublicationsQueryStatement; + private final PreparedStatement availableYearsQueryStatement; private final PreparedStatement authorsQueryStatement; private final PreparedStatement publisherQueryStatement; private final PreparedStatement journalQueryStatement; @@ -46,48 +88,49 @@ public class PublicationList extends AbstractComponent { final Connection connection = SessionManager .getSession() .getConnection(); - publicationsQueryStatement = connection - .prepareStatement( - "SELECT cms_items.item_id, name, version, language, object_type, " - + "master_id, parent_id, title, cms_pages.description, " - + "year, abstract, misc, reviewed, authors, firstPublished, lang, " - + "isbn, ct_publication_with_publisher.volume, number_of_volumes, _number_of_pages, ct_publication_with_publisher.edition, " - + "nameofconference, place_of_conference, date_from_of_conference, date_to_of_conference, " - + "ct_article_in_collected_volume.pages_from AS collvol_pages_from, ct_article_in_collected_volume.pages_to AS collvol_pages_to, chapter, " - + "ct_article_in_journal.pages_from AS journal_pages_from, ct_article_in_journal.pages_to AS journal_pages_to, ct_article_in_journal.volume AS journal_volume, issue, publication_date, " - + "ct_expertise.place AS expertise_place, ct_expertise.number_of_pages AS expertise_number_of_pages, " - + "ct_inproceedings.pages_from AS inproceedings_pages_from, ct_inproceedings.pages_to AS inproceedings_pages_to, " - + "ct_internet_article.place AS internet_article_place, " - + "ct_internet_article.number AS internet_article_number, " - + "ct_internet_article.number_of_pages AS internet_article_number_of_pages, " - + "ct_internet_article.edition AS internet_article_edition, " - + "ct_internet_article.issn AS internet_article_issn, " - + "ct_internet_article.last_accessed AS internet_article_last_accessed, " - + "ct_internet_article.publicationdate AS internet_article_publication_date, " - + "ct_internet_article.url AS internet_article_url, " - + "ct_internet_article.urn AS internet_article_urn, " - + "ct_internet_article.doi AS internet_article_doi, " - + "ct_unpublished.place AS unpublished_place, " - + "ct_unpublished.number AS unpublished_number, " - + "ct_unpublished.number_of_pages AS unpublished_number_of_pages, " - + "ct_grey_literature.pagesfrom AS grey_literature_pages_from, " - + "ct_grey_literature.pagesto AS grey_literature_pages_to " - + "FROM cms_items " - + "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id " - + "JOIN content_types ON cms_items.type_id = content_types.type_id " - + "JOIN ct_publications ON cms_items.item_id = ct_publications.publication_id " - + "LEFT JOIN ct_publication_with_publisher ON ct_publications.publication_id = ct_publication_with_publisher.publication_with_publisher_id " - + "LEFT JOIN ct_proceedings ON ct_publications.publication_id = ct_proceedings.proceedings_id " - + "LEFT JOIN ct_article_in_collected_volume ON ct_publications.publication_id = ct_article_in_collected_volume.article_id " - + "LEFT JOIN ct_article_in_journal ON ct_publications.publication_id = ct_article_in_journal.article_in_journal_id " - + "LEFT JOIN ct_expertise ON ct_publications.publication_id = ct_expertise.expertise_id " - + "LEFT JOIN ct_inproceedings ON ct_publications.publication_id = ct_inproceedings.inproceedings_id " - + "LEFT JOIN ct_internet_article ON ct_publications.publication_id = ct_internet_article.internet_article_id " - + "LEFT JOIN ct_unpublished ON ct_publications.publication_id = ct_unpublished.unpublished_id " - + "LEFT JOIN ct_grey_literature ON ct_unpublished.unpublished_id = ct_grey_literature.grey_literature_id " - + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " - + "ORDER BY year DESC, authors, title " - + "LIMIT ? OFFSET ?"); +// publicationsQueryStatement = connection +// .prepareStatement( +// "SELECT cms_items.item_id, name, version, language, object_type, " +// + "master_id, parent_id, title, cms_pages.description, " +// + "year, abstract, misc, reviewed, authors, firstPublished, lang, " +// + "isbn, ct_publication_with_publisher.volume, number_of_volumes, _number_of_pages, ct_publication_with_publisher.edition, " +// + "nameofconference, place_of_conference, date_from_of_conference, date_to_of_conference, " +// + "ct_article_in_collected_volume.pages_from AS collvol_pages_from, ct_article_in_collected_volume.pages_to AS collvol_pages_to, chapter, " +// + "ct_article_in_journal.pages_from AS journal_pages_from, ct_article_in_journal.pages_to AS journal_pages_to, ct_article_in_journal.volume AS journal_volume, issue, publication_date, " +// + "ct_expertise.place AS expertise_place, ct_expertise.number_of_pages AS expertise_number_of_pages, " +// + "ct_inproceedings.pages_from AS inproceedings_pages_from, ct_inproceedings.pages_to AS inproceedings_pages_to, " +// + "ct_internet_article.place AS internet_article_place, " +// + "ct_internet_article.number AS internet_article_number, " +// + "ct_internet_article.number_of_pages AS internet_article_number_of_pages, " +// + "ct_internet_article.edition AS internet_article_edition, " +// + "ct_internet_article.issn AS internet_article_issn, " +// + "ct_internet_article.last_accessed AS internet_article_last_accessed, " +// + "ct_internet_article.publicationdate AS internet_article_publication_date, " +// + "ct_internet_article.url AS internet_article_url, " +// + "ct_internet_article.urn AS internet_article_urn, " +// + "ct_internet_article.doi AS internet_article_doi, " +// + "ct_unpublished.place AS unpublished_place, " +// + "ct_unpublished.number AS unpublished_number, " +// + "ct_unpublished.number_of_pages AS unpublished_number_of_pages, " +// + "ct_grey_literature.pagesfrom AS grey_literature_pages_from, " +// + "ct_grey_literature.pagesto AS grey_literature_pages_to " +// + "FROM cms_items " +// + "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id " +// + "JOIN content_types ON cms_items.type_id = content_types.type_id " +// + "JOIN ct_publications ON cms_items.item_id = ct_publications.publication_id " +// + "LEFT JOIN ct_publication_with_publisher ON ct_publications.publication_id = ct_publication_with_publisher.publication_with_publisher_id " +// + "LEFT JOIN ct_proceedings ON ct_publications.publication_id = ct_proceedings.proceedings_id " +// + "LEFT JOIN ct_article_in_collected_volume ON ct_publications.publication_id = ct_article_in_collected_volume.article_id " +// + "LEFT JOIN ct_article_in_journal ON ct_publications.publication_id = ct_article_in_journal.article_in_journal_id " +// + "LEFT JOIN ct_expertise ON ct_publications.publication_id = ct_expertise.expertise_id " +// + "LEFT JOIN ct_inproceedings ON ct_publications.publication_id = ct_inproceedings.inproceedings_id " +// + "LEFT JOIN ct_internet_article ON ct_publications.publication_id = ct_internet_article.internet_article_id " +// + "LEFT JOIN ct_unpublished ON ct_publications.publication_id = ct_unpublished.unpublished_id " +// + "LEFT JOIN ct_grey_literature ON ct_unpublished.unpublished_id = ct_grey_literature.grey_literature_id " +// + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " +// + "ORDER BY year DESC, authors, title " +// + "LIMIT ? OFFSET ?"; +// ); countPublicationsQueryStatement = connection.prepareStatement( "SELECT COUNT(*) " @@ -107,6 +150,15 @@ public class PublicationList extends AbstractComponent { + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " ); + availableYearsQueryStatement = connection.prepareStatement( + "SELECT DISTINCT year " + + "FROM cms_items " + + "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id " + + "JOIN content_types ON cms_items.type_id = content_types.type_id " + + "JOIN ct_publications ON cms_items.item_id = ct_publications.publication_id " + + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " + + "ORDER BY year DESC"); + authorsQueryStatement = connection.prepareStatement( "SELECT surname, givenname, titlepre, titlepost, editor, authorship_order " + "FROM cms_persons " @@ -190,60 +242,48 @@ public class PublicationList extends AbstractComponent { final String categoryId = getCategory().getID().toString(); + final Element listElem = Navigation.newElement( + "sci-publication-list"); + final Element filtersElem = listElem.newChildElement("filters"); + final Element sortElem = filtersElem.newChildElement("sort"); + + final PreparedStatement publicationsQueryStatement; + final int page; + final int offset; try { -// final PreparedStatement mainQuery; -// -// mainQuery = connection -// .prepareStatement( -// "SELECT cms_items.item_id, name, version, language, object_type, " -// + "master_id, parent_id, title, cms_pages.description, " -// + "year, abstract, misc, reviewed, authors, firstPublished, lang, " -// + "isbn, ct_publication_with_publisher.volume, number_of_volumes, _number_of_pages, ct_publication_with_publisher.edition, " -// + "nameofconference, place_of_conference, date_from_of_conference, date_to_of_conference, " -// + "ct_article_in_collected_volume.pages_from AS collvol_pages_from, ct_article_in_collected_volume.pages_to AS collvol_pages_to, chapter, " -// + "ct_article_in_journal.pages_from AS journal_pages_from, ct_article_in_journal.pages_to AS journal_pages_to, ct_article_in_journal.volume AS journal_volume, issue, publication_date, " -// + "ct_expertise.place AS expertise_place, ct_expertise.number_of_pages AS expertise_number_of_pages, " -// + "ct_inproceedings.pages_from AS inproceedings_pages_from, ct_inproceedings.pages_to AS inproceedings_pages_to, " -// + "ct_internet_article.place AS internet_article_place, " -// + "ct_internet_article.number AS internet_article_number, " -// + "ct_internet_article.number_of_pages AS internet_article_number_of_pages, " -// + "ct_internet_article.edition AS internet_article_edition, " -// + "ct_internet_article.issn AS internet_article_issn, " -// + "ct_internet_article.last_accessed AS internet_article_last_accessed, " -// + "ct_internet_article.publicationdate AS internet_article_publication_date, " -// + "ct_internet_article.url AS internet_article_url, " -// + "ct_internet_article.urn AS internet_article_urn, " -// + "ct_internet_article.doi AS internet_article_doi, " -// + "ct_unpublished.place AS unpublished_place, " -// + "ct_unpublished.number AS unpublished_number, " -// + "ct_unpublished.number_of_pages AS unpublished_number_of_pages, " -// + "ct_grey_literature.pagesfrom AS grey_literature_pages_from, " -// + "ct_grey_literature.pagesto AS grey_literature_pages_to " -// + "FROM cms_items " -// + "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id " -// + "JOIN content_types ON cms_items.type_id = content_types.type_id " -// + "JOIN ct_publications ON cms_items.item_id = ct_publications.publication_id " -// + "LEFT JOIN ct_publication_with_publisher ON ct_publications.publication_id = ct_publication_with_publisher.publication_with_publisher_id " -// + "LEFT JOIN ct_proceedings ON ct_publications.publication_id = ct_proceedings.proceedings_id " -// + "LEFT JOIN ct_article_in_collected_volume ON ct_publications.publication_id = ct_article_in_collected_volume.article_id " -// + "LEFT JOIN ct_article_in_journal ON ct_publications.publication_id = ct_article_in_journal.article_in_journal_id " -// + "LEFT JOIN ct_expertise ON ct_publications.publication_id = ct_expertise.expertise_id " -// + "LEFT JOIN ct_inproceedings ON ct_publications.publication_id = ct_inproceedings.inproceedings_id " -// + "LEFT JOIN ct_internet_article ON ct_publications.publication_id = ct_internet_article.internet_article_id " -// + "LEFT JOIN ct_unpublished ON ct_publications.publication_id = ct_unpublished.unpublished_id " -// + "LEFT JOIN ct_grey_literature ON ct_unpublished.unpublished_id = ct_grey_literature.grey_literature_id " -// + "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' " -// + "ORDER BY year DESC, authors, title LIMIT 20" -// ); -// mainQuery.setString(1, categoryId); -// -// final ResultSet mainQueryResult = mainQuery.executeQuery(); + final String orderByParam; + if (request.getParameter("sort") == null) { + orderByParam = "yearDesc"; + } else { + orderByParam = request.getParameter("sort"); + } + final String orderBy; + switch (orderByParam) { + case "title": + orderBy = "ORDER BY title, authors, year DESC "; + sortElem.setText("title"); + break; + case "authors": + orderBy = "ORDER BY authors, title, year DESC "; + sortElem.setText("authors"); + break; + case "yearAsc": + orderBy = "ORDER BY year ASC, authors, title "; + sortElem.setText("yearAsc"); + break; + default: + orderBy = "ORDER BY year DESC, authors, title "; + sortElem.setText("yearDesc"); + break; + } + + publicationsQueryStatement = connection + .prepareStatement(String.format(PUBLIATIONS_QUERY_TEMPLATE, + orderBy)); publicationsQueryStatement.setString(1, categoryId); publicationsQueryStatement.setInt(2, limit); - final int page; - final int offset; if (request.getParameter("page") == null) { page = 1; publicationsQueryStatement.setInt(3, 0); @@ -255,10 +295,24 @@ public class PublicationList extends AbstractComponent { publicationsQueryStatement.setInt(3, offset); } - final ResultSet mainQueryResult = publicationsQueryStatement - .executeQuery(); + } catch (SQLException ex) { + throw new UncheckedWrapperException(ex); + } - final Element listElem = Navigation.newElement("sci-publication-list"); + try (final ResultSet mainQueryResult = publicationsQueryStatement + .executeQuery()) { + + availableYearsQueryStatement.setString(1, categoryId); + final ResultSet availableYearsResultSet + = availableYearsQueryStatement.executeQuery(); + final Element availableYearsElem = filtersElem + .newChildElement("available-years"); + while (availableYearsResultSet.next()) { + final Element yearElem = availableYearsElem + .newChildElement("year"); + yearElem.setText(Integer.toString(availableYearsResultSet + .getInt("year"))); + } final Element paginatorElem = listElem.newChildElement("paginator"); @@ -274,24 +328,19 @@ public class PublicationList extends AbstractComponent { } final int maxPages = (int) Math - .ceil((double) count / (double) limit); + .ceil(count / (double) limit); paginatorElem.addAttribute("maxPages", Integer.toString(maxPages)); paginatorElem.addAttribute("currentPage", Integer.toString(page)); paginatorElem.addAttribute("offset", Integer.toString(offset)); paginatorElem.addAttribute("limit", Integer.toString(limit)); -// long count = 0; while (mainQueryResult.next()) { -// count++; generateResultEntry(mainQueryResult, listElem); } -// listElem.addAttribute("count", Long.toString(count)); - mainQueryResult.close(); - return listElem; } catch (SQLException ex) {