Package org.beangle.model.query.builder

Source Code of org.beangle.model.query.builder.EntityQuery

/* Copyright c 2005-2012.
* Licensed under GNU  LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*/
package org.beangle.model.query.builder;

import java.util.Collection;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.beangle.collection.Order;
import org.beangle.collection.page.PageLimit;
import org.beangle.model.entity.Model;
import org.beangle.model.entity.types.EntityType;
import org.beangle.model.query.Lang;
import org.beangle.model.query.Query;

/**
* 实体类查询
*
* @author chaostone
* @deprecated use HqlBuilder
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public class EntityQuery extends OqlBuilder {

  protected String countStr;

  public EntityQuery() {
    super();
  }

  public EntityQuery(final String hql) {
    super();
    this.statement = hql;
  }

  public EntityQuery(final String entityName, final String alias) {
    EntityType type = Model.getEntityType(entityName);
    this.entityClass = type.getEntityClass();
    this.alias = alias;
    select = "select " + alias + " ";
    from = "from " + entityName + " " + alias;
  }

  public EntityQuery(final Class<?> entityClass, final String alias) {
    super();
    EntityType type = Model.getEntityType(entityClass.getName());
    if (null == type) {
      type = Model.getEntityType(entityClass);
    }
    this.entityClass = type.getEntityClass();
    this.alias = alias;
    select = "select " + alias + " ";
    from = "from " + type.getEntityName() + " " + alias;
  }

  public EntityQuery join(final String path, final String alias) {
    from += " join " + path + " " + alias;
    return this;
  }

  public EntityQuery join(final String joinMode, final String path, final String alias) {
    from += " " + joinMode + " join " + path + " " + alias;
    return this;
  }

  /**
   * 形成计数查询语句,如果不能形成,则返回""
   */
  public String toCountString() {
    if (StringUtils.isNotEmpty(countStr)) { return countStr; }
    StringBuilder countString = new StringBuilder("select count(*) ");
    // 原始查询语句
    final String genQueryStr = genQueryString(false);
    if (StringUtils.isEmpty(genQueryStr)) { return ""; }
    final String lowerCaseQueryStr = genQueryStr.toLowerCase();

    if (StringUtils.contains(lowerCaseQueryStr, " group ")) { return ""; }
    if (StringUtils.contains(lowerCaseQueryStr, " union ")) { return ""; }

    final int indexOfFrom = lowerCaseQueryStr.indexOf("from");
    final String selectWhat = lowerCaseQueryStr.substring(0, indexOfFrom);
    final int indexOfDistinct = selectWhat.indexOf("distinct");
    // select distinct a from table;
    if (-1 != indexOfDistinct) {
      if (StringUtils.contains(selectWhat, ",")) {
        return null;
      } else {
        countString = new StringBuilder("select count(");
        countString.append(genQueryStr.substring(indexOfDistinct, indexOfFrom)).append(')');
      }
    }
    countString.append(genQueryStr.substring(indexOfFrom));
    return countString.toString();
  }

  public String getAlias() {
    return alias;
  }

  public void setAlias(final String alias) {
    this.alias = alias;
  }

  public Class<?> getEntityClass() {
    return entityClass;
  }

  public void setEntityClass(final Class<?> entityClass) {
    this.entityClass = entityClass;
  }

  protected Lang getLang() {
    return Lang.HQL;
  }

  public PageLimit getLimit() {
    return limit;
  }

  public void setLimit(final PageLimit limit) {
    this.limit = limit;
  }

  public String getCountStr() {
    return countStr;
  }

  public void setCountStr(final String countStr) {
    this.countStr = countStr;
  }

  public String getQueryStr() {
    return statement;
  }

  public void setQueryStr(final String queryStr) {
    this.statement = queryStr;
  }

  public boolean isCacheable() {
    return cacheable;
  }

  public void setCacheable(final boolean cacheable) {
    this.cacheable = cacheable;
  }

  public EntityQuery add(final Condition condition) {
    conditions.add(condition);
    return this;
  }

  /**
   * 添加一组条件<br>
   * query中不能添加条件集合作为一个条件,因此这里命名没有采用有区别性的addAll
   *
   * @author
   * @param cons
   * @return
   */
  public EntityQuery add(final Collection<Condition> cons) {
    conditions.addAll(cons);
    return this;
  }

  public EntityQuery addOrder(final Order order) {
    if (null != order) {
      this.orders.add(order);
    }
    return this;
  }

  public EntityQuery addOrder(final List<Order> orders) {
    if (null != orders) {
      this.orders.addAll(orders);
    }
    return this;
  }

  public String getSelect() {
    return select;
  }

  public void setSelect(final String select) {
    if (null == select) {
      this.select = null;
    } else {
      if (StringUtils.contains(select.toLowerCase(), "select")) {
        this.select = select;
      } else {
        this.select = "select " + select;
      }
    }
  }

  public List<Condition> getConditions() {
    return conditions;
  }

  public void setConditions(final List<Condition> conditions) {
    this.conditions = conditions;
  }

  public String getFrom() {
    return from;
  }

  public void setFrom(final String from) {
    if (null == from) {
      this.from = null;
    } else {
      if (StringUtils.contains(from.toLowerCase(), "from")) {
        this.from = from;
      } else {
        this.from = " from " + from;
      }
    }
  }

  public List<Order> getOrders() {
    return orders;
  }

  public void setOrders(final List<Order> orders) {
    this.orders = orders;
  }

  public List<String> getGroups() {
    return groups;
  }

  public void setGroups(final List<String> groups) {
    this.groups = groups;
  }

  public EntityQuery groupBy(final String what) {
    if (StringUtils.isNotEmpty(what)) {
      groups.add(what);
    }
    return this;
  }

  /**
   * 生成查询语句(如果查询语句已经存在则不进行生成)
   */
  public String toQueryString() {
    if (StringUtils.isNotEmpty(statement)) {
      return statement;
    } else {
      return genQueryString(true);
    }
  }

  protected String genQueryString(final boolean hasOrder) {
    if (null == from) { return statement; }
    final StringBuilder buf = new StringBuilder(50);
    buf.append((select == null) ? "" : select).append(' ').append(from);
    if (!conditions.isEmpty()) {
      buf.append(" where ").append(ConditionUtils.toQueryString(conditions));
    }
    if (!groups.isEmpty()) {
      buf.append(" group by ");
      for (final String groupBy : getGroups()) {
        buf.append(groupBy).append(',');
      }
      buf.deleteCharAt(buf.length() - 1);
    }
    if (hasOrder && !CollectionUtils.isEmpty(orders)) {
      buf.append(' ').append(Order.toSortString(orders));
    }
    return buf.toString();
  }

  public Query<Object> build() {
    QueryBean<Object> queryBean = new QueryBean<Object>();
    queryBean.setStatement(toQueryString());
    queryBean.setParams(getParams());
    if (null != limit) {
      queryBean.setLimit(new PageLimit(limit.getPageNo(), limit.getPageSize()));
    }
    queryBean.setCountStatement(toCountString());
    queryBean.setCacheable(cacheable);
    queryBean.setLang(getLang());
    return queryBean;
  }

  public EntityQuery limit(PageLimit limit) {
    this.limit = limit;
    return this;
  }

}
TOP

Related Classes of org.beangle.model.query.builder.EntityQuery

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.