play.modules.resteasy.crud.PagedQuery.java Source code

Java tutorial

Introduction

Here is the source code for play.modules.resteasy.crud.PagedQuery.java

Source

/*
This file is part of resteasy-crud-play-module.
    
Copyright Lunatech Research 2010
    
resteasy-crud-play-module is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
resteasy-crud-play-module is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.
    
You should have received a copy of the GNU General Lesser Public License
along with resteasy-crud-play-module.  If not, see <http://www.gnu.org/licenses/>.
*/
package play.modules.resteasy.crud;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.persistence.Query;

import org.apache.commons.lang.StringUtils;

import play.Logger;
import play.db.jpa.JPA;

/**
 * Builds paged queries.
 * 
 * @author Stphane pardaud <stef@epardaud.fr>
 * @param <T> The type of entity returned
 */
public class PagedQuery<T> {
    private String hql;
    public String order;
    public String group;
    public Map<String, Object> parameters = new HashMap<String, Object>();
    public String search;
    public List<String> searchFields = new ArrayList<String>();
    public Long start;
    public Long limit;
    private Long count;

    public PagedQuery(String hql) {
        this.hql = hql;
    }

    public PagedQuery<T> searchFields(String... searchFields) {
        this.searchFields.clear();
        Collections.addAll(this.searchFields, searchFields);
        return this;
    }

    public PagedQuery<T> searchFields(Set<String> searchFields) {
        this.searchFields.clear();
        this.searchFields.addAll(searchFields);
        return this;
    }

    private String getHQLQuery(boolean forSelect) {
        String hql = this.hql;
        if (!StringUtils.isEmpty(search) && !searchFields.isEmpty()) {
            if (hql.toLowerCase().contains(" where ")) {
                hql += " AND (";
            } else {
                hql += " WHERE (";
            }
            boolean first = true;
            for (String field : searchFields) {
                if (!first) {
                    hql += " OR ";
                } else
                    first = false;
                hql += "LOCATE(lower(:_search), lower(" + field + ")) > 0";
            }
            hql += ")";
            parameters.put("_search", search);
        }
        if (forSelect && !StringUtils.isEmpty(group))
            hql += " GROUP BY " + group;
        if (forSelect && !StringUtils.isEmpty(order))
            hql += " ORDER BY " + order;
        return hql;
    }

    private Query getCountQuery() {
        String hql = getHQLQuery(false);
        hql = hql.trim();
        // FIXME: make this safe
        int fromClause = hql.toLowerCase().indexOf("from ");
        String count;
        if (StringUtils.isEmpty(group))
            count = "COUNT(*) ";
        else {
            count = "COUNT(DISTINCT " + group + ") ";
        }
        hql = "SELECT " + count + hql.substring(fromClause);
        return getQuery(hql);
    }

    private Query getQuery() {
        return getQuery(getHQLQuery(true));
    }

    private Query getQuery(String hql) {
        Logger.info("Making HQL query: %s", hql);
        Query query = JPA.em().createQuery(hql);
        for (Entry<String, Object> entry : parameters.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
            Logger.info(" Query param %s => %s", entry.getKey(), entry.getValue());
        }
        return query;
    }

    public long getCount() {
        if (count == null) {
            Query query = getCountQuery();
            count = (Long) query.getSingleResult();
        }
        return count;
    }

    public List<T> getResultList() {
        Query query = getQuery();
        if (start != null)
            query.setFirstResult(start.intValue());
        if (limit != null)
            query.setMaxResults(limit.intValue());
        return query.getResultList();
    }
}