Return-Path: X-Original-To: apmail-incubator-rave-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-rave-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 428BD7198 for ; Wed, 26 Oct 2011 09:55:17 +0000 (UTC) Received: (qmail 58730 invoked by uid 500); 26 Oct 2011 09:55:17 -0000 Delivered-To: apmail-incubator-rave-commits-archive@incubator.apache.org Received: (qmail 58680 invoked by uid 500); 26 Oct 2011 09:55:16 -0000 Mailing-List: contact rave-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: rave-dev@incubator.apache.org Delivered-To: mailing list rave-commits@incubator.apache.org Received: (qmail 58673 invoked by uid 99); 26 Oct 2011 09:55:16 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Oct 2011 09:55:16 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Oct 2011 09:55:14 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id AC3002388AA9; Wed, 26 Oct 2011 09:54:54 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1189099 - in /incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal: model/Widget.java repository/WidgetRepository.java repository/impl/JpaWidgetRepository.java Date: Wed, 26 Oct 2011 09:54:54 -0000 To: rave-commits@incubator.apache.org From: jasha@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111026095454.AC3002388AA9@eris.apache.org> Author: jasha Date: Wed Oct 26 09:54:53 2011 New Revision: 1189099 URL: http://svn.apache.org/viewvc?rev=1189099&view=rev Log: RAVE-301 prepare for dynamic sorting in Widget query. By default sort on title ASC in all lists. Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Widget.java incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetRepository.java incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetRepository.java Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Widget.java URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Widget.java?rev=1189099&r1=1189098&r2=1189099&view=diff ============================================================================== --- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Widget.java (original) +++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Widget.java Wed Oct 26 09:54:53 2011 @@ -50,24 +50,19 @@ import java.util.List; @Entity @Table(name="widget") @NamedQueries({ - @NamedQuery(name = Widget.WIDGET_GET_ALL, query = Widget.SELECT_W_FROM_WIDGET_W), + @NamedQuery(name = Widget.WIDGET_GET_ALL, query = Widget.SELECT_W_FROM_WIDGET_W + Widget.ORDER_BY_TITLE_ASC), @NamedQuery(name = Widget.WIDGET_COUNT_ALL, query = Widget.SELECT_COUNT_W_FROM_WIDGET_W), @NamedQuery(name = Widget.WIDGET_GET_BY_FREE_TEXT, - query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_FREE_TEXT), + query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_FREE_TEXT + Widget.ORDER_BY_TITLE_ASC), @NamedQuery(name = Widget.WIDGET_COUNT_BY_FREE_TEXT, query = Widget.SELECT_COUNT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_FREE_TEXT), @NamedQuery(name = Widget.WIDGET_GET_BY_STATUS, - query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_STATUS), + query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_STATUS + Widget.ORDER_BY_TITLE_ASC), @NamedQuery(name = Widget.WIDGET_COUNT_BY_STATUS, query = Widget.SELECT_COUNT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_STATUS), - @NamedQuery(name = Widget.WIDGET_GET_BY_STATUS_AND_TYPE_AND_FREE_TEXT, - query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_STATUS_TYPE_FREE_TEXT), - @NamedQuery(name = Widget.WIDGET_COUNT_BY_STATUS_AND_TYPE_AND_FREE_TEXT, - query = Widget.SELECT_COUNT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_STATUS_TYPE_FREE_TEXT), - @NamedQuery(name = Widget.WIDGET_GET_BY_URL, query = Widget.SELECT_W_FROM_WIDGET_W + Widget.WHERE_CLAUSE_URL) }) public class Widget implements BasicEntity, Serializable { @@ -75,7 +70,6 @@ public class Widget implements BasicEnti public static final String PARAM_SEARCH_TERM = "searchTerm"; public static final String PARAM_STATUS = "widgetStatus"; - public static final String PARAM_TYPE = "type"; public static final String PARAM_URL = "url"; public static final String WIDGET_GET_ALL = "Widget.getAll"; @@ -84,22 +78,16 @@ public class Widget implements BasicEnti public static final String WIDGET_COUNT_BY_FREE_TEXT = "Widget.countByFreeText"; public static final String WIDGET_GET_BY_STATUS = "Widget.getByStatus"; public static final String WIDGET_COUNT_BY_STATUS = "Widget.countByStatus"; - public static final String WIDGET_GET_BY_STATUS_AND_TYPE_AND_FREE_TEXT = "Widget.getByStatusAndTypeAndFreeText"; - public static final String WIDGET_COUNT_BY_STATUS_AND_TYPE_AND_FREE_TEXT = "Widget.countByStatusAndTypeAndFreeText"; public static final String WIDGET_GET_BY_URL = "Widget.getByUrl"; static final String SELECT_W_FROM_WIDGET_W = "SELECT w FROM Widget w "; static final String SELECT_COUNT_W_FROM_WIDGET_W = "SELECT count(w) FROM Widget w "; - static final String WHERE_CLAUSE_STATUS_TYPE_FREE_TEXT = - " WHERE (:widgetStatus is null OR :widgetStatus = '' or w.widgetStatus = :widgetStatus)" + - " AND (:type is null OR :type = '' OR w.type = :type)" + - " AND (:searchTerm is null OR :searchTerm = '' " + - " OR lower(w.title) LIKE :searchTerm OR w.description LIKE :description)"; static final String WHERE_CLAUSE_FREE_TEXT = " WHERE lower(w.title) LIKE :searchTerm OR w.description LIKE :description"; static final String WHERE_CLAUSE_STATUS = " WHERE w.widgetStatus = :widgetStatus"; static final String WHERE_CLAUSE_URL = " WHERE w.url = :url"; + static final String ORDER_BY_TITLE_ASC = " ORDER BY w.title ASC "; @Id @Column(name="entity_id") @GeneratedValue(strategy = GenerationType.TABLE, generator = "widgetIdGenerator") Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetRepository.java URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetRepository.java?rev=1189099&r1=1189098&r2=1189099&view=diff ============================================================================== --- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetRepository.java (original) +++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetRepository.java Wed Oct 26 09:54:53 2011 @@ -87,13 +87,14 @@ public interface WidgetRepository extend * Gets a List of {@link Widget}'s by performing a free text search filtering on status * * @param widgetStatus status of the widget (PREVIEW, PUBLISHED etc) + * @param type type of Widget (e.g. W3C, OpenSocial) * @param searchTerm free text search term * @param offset start point within the resultset (for paging) * @param pageSize maximum number of items to be returned (for paging) * @return valid list of widgets, can be empty */ List getByStatusAndTypeAndFreeTextSearch(WidgetStatus widgetStatus, String type, String searchTerm, - int offset, int pageSize); + int offset, int pageSize); /** @@ -101,6 +102,7 @@ public interface WidgetRepository extend * on status. Useful for paging. * * @param widgetStatus status of the widget (PREVIEW, PUBLISHED etc) + * @param type type of Widget (e.g. W3C, OpenSocial) * @param searchTerm free text search term * @return total number of {@link Widget}'s that match the search criteria */ Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetRepository.java URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetRepository.java?rev=1189099&r1=1189098&r2=1189099&view=diff ============================================================================== --- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetRepository.java (original) +++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetRepository.java Wed Oct 26 09:54:53 2011 @@ -31,6 +31,13 @@ import org.springframework.stereotype.Re import javax.persistence.Query; import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; import java.util.List; import static org.apache.rave.persistence.jpa.util.JpaUtil.getPagedResultList; @@ -100,24 +107,70 @@ public class JpaWidgetRepository extends @Override public List getByStatusAndTypeAndFreeTextSearch(WidgetStatus widgetStatus, String type, String searchTerm, int offset, int pageSize) { - TypedQuery query = manager.createNamedQuery(Widget.WIDGET_GET_BY_STATUS_AND_TYPE_AND_FREE_TEXT, - Widget.class); - query.setParameter(Widget.PARAM_STATUS, widgetStatus); - query.setParameter(Widget.PARAM_TYPE, type); - setFreeTextSearchTerm(query, searchTerm); - return getPagedResultList(query, offset, pageSize); + final CriteriaBuilder cb = manager.getCriteriaBuilder(); + final CriteriaQuery query = cb.createQuery(Widget.class); + final Root widgetType = query.from(Widget.class); + query.where(getStatusAndTypeAndFreeTextPredicates(cb, widgetType, widgetStatus, type, searchTerm)); + query.orderBy(getOrderByTitleAsc(cb, widgetType)); + + return getPagedResultList(manager.createQuery(query), offset, pageSize); } @Override public int getCountByStatusAndTypeAndFreeText(WidgetStatus widgetStatus, String type, String searchTerm) { - Query query = manager.createNamedQuery(Widget.WIDGET_COUNT_BY_STATUS_AND_TYPE_AND_FREE_TEXT); - query.setParameter(Widget.PARAM_STATUS, widgetStatus); - query.setParameter(Widget.PARAM_TYPE, type); - setFreeTextSearchTerm(query, searchTerm); - Number countResult = (Number) query.getSingleResult(); + final CriteriaBuilder cb = manager.getCriteriaBuilder(); + final CriteriaQuery query = cb.createQuery(Long.class); + final Root widgetType = query.from(Widget.class); + query.select(cb.count(widgetType)); + query.where(getStatusAndTypeAndFreeTextPredicates(cb, widgetType, widgetStatus, type, searchTerm)); + + final Long countResult = manager.createQuery(query).getSingleResult(); return countResult.intValue(); } + private Predicate[] getStatusAndTypeAndFreeTextPredicates(CriteriaBuilder cb, Root widgetType, + WidgetStatus widgetStatus, String type, + String searchTerm) { + List predicates = new ArrayList(); + if (StringUtils.isNotBlank(searchTerm)) { + predicates.add( + cb.or( + cb.like(cb.lower(getTitleField(widgetType)), getLowercaseWildcardSearchTerm(searchTerm)), + cb.like(cb.lower(getDescriptionField(widgetType)), getLowercaseWildcardSearchTerm(searchTerm)) + ) + ); + } + if (StringUtils.isNotBlank(type)) { + predicates.add(cb.and(cb.equal(getTypeField(widgetType), type))); + } + if (widgetStatus != null) { + predicates.add(cb.and(cb.equal(getWidgetStatusField(widgetType), widgetStatus))); + } + + return predicates.toArray(new Predicate[predicates.size()]); + } + + private Order getOrderByTitleAsc(CriteriaBuilder cb, Root widgetType) { + return cb.asc(getTitleField(widgetType)); + } + + private Path getTitleField(Root widgetType) { + return widgetType.get("title"); + } + + private Path getDescriptionField(Root widgetType) { + return widgetType.get("description"); + } + + private Path getTypeField(Root widgetType) { + return widgetType.get("type"); + } + + private Path getWidgetStatusField(Root widgetType) { + return widgetType.get("widgetStatus"); + } + + @Override public Widget getByUrl(String widgetUrl) { if (StringUtils.isBlank(widgetUrl)) { @@ -138,6 +191,13 @@ public class JpaWidgetRepository extends * @param searchTerm free text */ protected void setFreeTextSearchTerm(Query query, final String searchTerm) { - query.setParameter(Widget.PARAM_SEARCH_TERM, "%" + searchTerm.toLowerCase() + "%"); + query.setParameter(Widget.PARAM_SEARCH_TERM, getLowercaseWildcardSearchTerm(searchTerm)); + } + + private String getLowercaseWildcardSearchTerm(String searchTerm) { + if (StringUtils.isBlank(searchTerm)) { + return searchTerm; + } + return "%" + searchTerm.toLowerCase() + "%"; } }