From d821dbe5d7cdfdccdcd60ea0fa664c9e0c45ceb7 Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 20 Feb 2017 17:50:21 +0000 Subject: [PATCH] CCM NG/ccm-cms: FolderBrowser optimization and cleanup git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4585 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/folder/FolderBrowser.java | 26 +- .../ui/folder/FolderBrowserController.java | 281 +++++++++--------- .../FolderBrowserTableModelBuilder.java | 22 +- 3 files changed, 161 insertions(+), 168 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java index 4ddb2fe92..95b1ed29c 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java @@ -81,13 +81,13 @@ public class FolderBrowser extends Table { globalize("cms.ui.folder.creation_date"), globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action")}; - private static final String SORT_ACTION_UP = "sortActionUp"; - private static final String SORT_ACTION_DOWN = "sortActionDown"; - private final static String SORT_KEY_NAME = "name"; - private final static String SORT_KEY_TITLE = "title"; - private final static String SORT_KEY_TYPE = "type"; - private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; - private final static String SORT_KEY_CREATION_DATE = "creationDate"; + protected static final String SORT_ACTION_UP = "sortActionUp"; + protected static final String SORT_ACTION_DOWN = "sortActionDown"; + protected final static String SORT_KEY_NAME = "name"; + protected final static String SORT_KEY_TITLE = "title"; + protected final static String SORT_KEY_TYPE = "type"; + protected final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; + protected final static String SORT_KEY_CREATION_DATE = "creationDate"; private final FolderSelectionModel folderSelectionModel; private final TableActionListener folderChanger; @@ -126,13 +126,13 @@ public class FolderBrowser extends Table { nameColumn = getColumn(0); nameColumn.setCellRenderer(new NameCellRenderer()); - nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); +// nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); getColumn(1).setCellRenderer(new LanguagesCellRenderer()); - getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE)); - getColumn(5).setHeaderRenderer(new HeaderCellRenderer( - SORT_KEY_CREATION_DATE)); - getColumn(6).setHeaderRenderer(new HeaderCellRenderer( - SORT_KEY_LAST_MODIFIED_DATE)); +// getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE)); +// getColumn(5).setHeaderRenderer(new HeaderCellRenderer( +// SORT_KEY_CREATION_DATE)); +// getColumn(6).setHeaderRenderer(new HeaderCellRenderer( +// SORT_KEY_LAST_MODIFIED_DATE)); deleteColumn = getColumn(6); deleteColumn.setCellRenderer(new ActionCellRenderer()); deleteColumn.setAlign("center"); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java index 2bf41c4af..88617ed3e 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java @@ -22,6 +22,7 @@ import com.arsdigita.kernel.KernelConfig; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.libreccm.categorization.Categorization; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObjectRepository; @@ -30,6 +31,7 @@ import org.libreccm.l10n.LocalizedString; import org.librecms.CmsConstants; import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemL10NManager; +import org.librecms.contentsection.ContentItemVersion; import org.librecms.contentsection.ContentType; import org.librecms.contentsection.Folder; import org.librecms.contenttypes.ContentTypeInfo; @@ -41,6 +43,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Optional; + import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -48,6 +51,13 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; /** @@ -74,7 +84,7 @@ public class FolderBrowserController { @Inject private ContentItemL10NManager itemL10NManager; - + @Inject private ContentTypesManager typesManager; @@ -87,96 +97,26 @@ public class FolderBrowserController { defaultLocale = kernelConfig.getDefaultLocale(); } - public long countSubFolders(final Folder folder) { - return countSubFolders(folder, "%"); - } - - public long countSubFolders(final Folder folder, - final String filterTerm) { - final TypedQuery query = entityManager.createNamedQuery( - "Folder.countSubFolders", Long.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - - return query.getSingleResult(); - } - - public long countItems(final Folder folder) { - return countItems(folder, "%"); - } - - public long countItems(final Folder folder, - final String filterTerm) { - final TypedQuery query = entityManager.createNamedQuery( - "Folder.countItems", Long.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - - return query.getSingleResult(); - } - - public List findSubFolders(final Folder folder) { - return findSubFolders(folder, "%"); - } - - public List findSubFolders(final Folder folder, - final String filterTerm) { - final TypedQuery query = entityManager.createNamedQuery( - "Folder.findSubFolders", Folder.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - - return query.getResultList(); - } - - public List findItems(final Folder folder) { - return findItems(folder, "%"); - } - - public List findItems(final Folder folder, - final int first, - final int maxResults) { - return findItems(folder, "%", first, maxResults); - } - - public List findItems(final Folder folder, - final String filterTerm) { - return findItems(folder, filterTerm, -1, -1); - } - - public List findItems(final Folder folder, - final String filterTerm, - final int first, - final int maxResults) { - final TypedQuery query = entityManager.createNamedQuery( - "Folder.findItems", ContentItem.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - if (first > 0 && maxResults > 0) { - query.setFirstResult(first); - query.setMaxResults(maxResults); - } - - return query.getResultList(); - } - - public List findObjects(final Folder folder) { - return findObjects(folder, -1, -1); + public List findObjects(final Folder folder, final String orderBy) { + return findObjects(folder, orderBy, -1, -1); } public List findObjects(final Folder folder, + final String orderBy, final int first, final int maxResults) { - return findObjects(folder, "%", first, maxResults); - } - - public List findObjects(final Folder folder, - final String filterTerm) { - return findObjects(folder, filterTerm, -1, -1); + return findObjects(folder, "%", orderBy, first, maxResults); } public List findObjects(final Folder folder, final String filterTerm, + final String orderBy) { + return findObjects(folder, filterTerm, orderBy, -1, -1); + } + + public List findObjects(final Folder folder, + final String filterTerm, + final String orderBy, final int first, final int maxResults) { @@ -184,43 +124,21 @@ public class FolderBrowserController { LOGGER.debug("Trying to find objects in folder {}...", Objects.toString(folder)); -// final TypedQuery testQuery1 = entityManager.createQuery( -// "SELECT f FROM Folder f " -// + "WHERE f.parentCategory = :folder " -// + "AND LOWER(f.name) LIKE :term", -// CcmObject.class); -// testQuery1.setParameter("folder", folder); -// testQuery1.setParameter("term", filterTerm); -// final List testResult1 = testQuery1.getResultList(); -// LOGGER.debug("TestResult1: {}", -// Objects.toString(testResult1)); -// -// final TypedQuery testQuery2 = entityManager.createQuery( -// "SELECT i FROM ContentItem i JOIN i.categories c " -// + "WHERE c.category = :folder " -// + "AND c.type = '" + CmsConstants.CATEGORIZATION_TYPE_FOLDER -// + "' " -// + "AND i.version = " -// + "org.librecms.contentsection.ContentItemVersion.DRAFT " -// + "AND (LOWER(i.displayName) LIKE LOWER(:term))", -// CcmObject.class); -// testQuery2.setParameter("folder", folder); -// testQuery2.setParameter("term", filterTerm); -// final List testResult2 = testQuery2.getResultList(); -// LOGGER.debug("TestResult2: {}", -// Objects.toString(testResult2)); - - final TypedQuery query = entityManager.createNamedQuery( - "Folder.findObjects", CcmObject.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - - if (first > 0 && maxResults > 0) { - query.setFirstResult(first); - query.setMaxResults(maxResults); - } - - return query.getResultList(); + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(CcmObject.class); + final Root from = criteriaQuery.from(CcmObject.class); + + return entityManager.createQuery( + criteriaQuery + .select(from) + .where(builder.or( + from.in(findSubFolders(folder, filterTerm)), + from.in(findItemsInFolder(folder, filterTerm)))) + .orderBy(builder.asc(from.get("displayName")))) + .setFirstResult(first) + .setMaxResults(maxResults) + .getResultList(); } public long countObjects(final Folder folder) { @@ -229,39 +147,26 @@ public class FolderBrowserController { public long countObjects(final Folder folder, final String filterTerm) { - final TypedQuery query = entityManager.createNamedQuery( - "Folder.countObjects", Long.class); - query.setParameter("folder", folder); - query.setParameter("term", filterTerm); - return query.getSingleResult(); - } + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder.createQuery( + Long.class); + final Root from = criteriaQuery.from(CcmObject.class); - @Transactional(Transactional.TxType.REQUIRED) - List getObjectRows(final Folder folder) { - final List objects = findObjects(folder); - - return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); + return entityManager + .createQuery( + criteriaQuery + .select(builder.count(from)) + .where(builder.or( + from.in(findSubFolders(folder, filterTerm)), + from.in(findItemsInFolder(folder, filterTerm))))) + .getSingleResult(); } @Transactional(Transactional.TxType.REQUIRED) List getObjectRows(final Folder folder, - final String filterTerm) { - final List objects = findObjects(folder, - filterTerm); - - return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); - } - - @Transactional(Transactional.TxType.REQUIRED) - List getObjectRows(final Folder folder, - final int first, - final int maxResults) { - final List objects = findObjects(folder, first, maxResults); + final String orderBy) { + final List objects = findObjects(folder, orderBy); return objects.stream() .map(object -> buildRow(object)) @@ -271,10 +176,40 @@ public class FolderBrowserController { @Transactional(Transactional.TxType.REQUIRED) List getObjectRows(final Folder folder, final String filterTerm, + final String orderBy) { + final List objects = findObjects(folder, + filterTerm, + orderBy); + + return objects.stream() + .map(object -> buildRow(object)) + .collect(Collectors.toList()); + } + + @Transactional(Transactional.TxType.REQUIRED) + List getObjectRows(final Folder folder, + final String orderBy, + final int first, + final int maxResults) { + final List objects = findObjects(folder, + orderBy, + first, + maxResults); + + return objects.stream() + .map(object -> buildRow(object)) + .collect(Collectors.toList()); + } + + @Transactional(Transactional.TxType.REQUIRED) + List getObjectRows(final Folder folder, + final String filterTerm, + final String orderBy, final int first, final int maxResults) { final List objects = findObjects(folder, filterTerm, + orderBy, first, maxResults); @@ -318,7 +253,8 @@ public class FolderBrowserController { row.setTitle(item.getTitle().getValue(defaultLocale)); } final ContentType type = item.getContentType(); - final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type); + final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo( + type); row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelKey(typeInfo.getLabelKey()); row.setFolder(false); @@ -344,4 +280,55 @@ public class FolderBrowserController { } } + /** + * Creates a Criteria Query + * + * @param folder + * @param filterTerm + * + * @return + */ + private List findSubFolders(final Folder folder, + final String filterTerm) { + final CriteriaBuilder builder = entityManager + .getCriteriaBuilder(); + + final CriteriaQuery query = builder.createQuery( + Folder.class); + final Root from = query.from(Folder.class); + + return entityManager.createQuery( + query.where(builder.and( + builder.equal(from.get("parentCategory"), folder), + builder.like(builder.lower(from.get("name")), filterTerm)))) + .getResultList(); + + } + + private List findItemsInFolder( + final Folder folder, + final String filterTerm) { + + final CriteriaBuilder builder = entityManager + .getCriteriaBuilder(); + + final CriteriaQuery query = builder.createQuery( + ContentItem.class); + final Root fromItem = query.from(ContentItem.class); + final Join join = fromItem.join( + "categories"); + + return entityManager.createQuery(query + .select(fromItem) + .where(builder.and( + builder.equal(join.get("category"), folder), + builder.equal(join.get("type"), + CmsConstants.CATEGORIZATION_TYPE_FOLDER), + builder.equal(fromItem.get("version"), + ContentItemVersion.DRAFT), + builder.like(fromItem.get("displayName"), + filterTerm)))) + .getResultList(); + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java index e59417a0d..92976b3b4 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java @@ -39,8 +39,9 @@ import java.util.List; class FolderBrowserTableModelBuilder extends LockableImpl implements TableModelBuilder { - private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class); - + private final static Logger LOGGER = LogManager.getLogger( + FolderBrowserTableModelBuilder.class); + @Override public TableModel makeModel(final Table table, final PageState state) { @@ -78,17 +79,22 @@ class FolderBrowserTableModelBuilder extends LockableImpl LOGGER.debug("Retrieving table rows..."); final List rows; if (filterTerm == null) { - rows = controller.getObjectRows(folder, first -1, pageSize); + rows = controller.getObjectRows(folder, + "name", + first - 1, + pageSize); } else { - rows = controller.getObjectRows(folder, filter, first- 1, pageSize); + rows = controller.getObjectRows(folder, + filter, + "name", + first - 1, + pageSize); } - - LOGGER.debug("Retrieve table rows in {} ms.", + + LOGGER.debug("Retrieve table rows in {} ms.", System.currentTimeMillis() - start); return new FolderBrowserTableModel(rows); } } - - }