You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ja...@apache.org on 2011/10/26 11:54:54 UTC
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
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<Widget> 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<Widget> getByStatusAndTypeAndFreeTextSearch(WidgetStatus widgetStatus, String type, String searchTerm,
int offset, int pageSize) {
- TypedQuery<Widget> 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<Widget> query = cb.createQuery(Widget.class);
+ final Root<Widget> 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<Long> query = cb.createQuery(Long.class);
+ final Root<Widget> 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<Widget> widgetType,
+ WidgetStatus widgetStatus, String type,
+ String searchTerm) {
+ List<Predicate> predicates = new ArrayList<Predicate>();
+ 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<Widget> widgetType) {
+ return cb.asc(getTitleField(widgetType));
+ }
+
+ private Path<String> getTitleField(Root<Widget> widgetType) {
+ return widgetType.get("title");
+ }
+
+ private Path<String> getDescriptionField(Root<Widget> widgetType) {
+ return widgetType.get("description");
+ }
+
+ private Path<String> getTypeField(Root<Widget> widgetType) {
+ return widgetType.get("type");
+ }
+
+ private Path<WidgetStatus> getWidgetStatusField(Root<Widget> 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() + "%";
}
}