Package org.nutz.dao.impl

Source Code of org.nutz.dao.impl.EntityOperator

package org.nutz.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.nutz.dao.Chain;
import org.nutz.dao.Condition;
import org.nutz.dao.FieldMatcher;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.impl.sql.pojo.InsertByChainPItem;
import org.nutz.dao.sql.DaoStatement;
import org.nutz.dao.sql.Pojo;
import org.nutz.dao.sql.PojoMaker;
import org.nutz.dao.sql.SqlType;
import org.nutz.dao.util.Pojos;
import org.nutz.lang.Each;
import org.nutz.lang.ExitLoop;
import org.nutz.lang.Lang;
import org.nutz.lang.LoopException;

public class EntityOperator {

  Entity<?> entity;

  NutDao dao;

  Object myObj;

  List<Pojo> pojoList = new ArrayList<Pojo>();

  private int updateCount;

  /**
   * 批量执行准备好的 Dao 语句
   *
   * @return 自身
   */
  public EntityOperator exec() {
    /*
     * 为每个语句检查一遍参数状态
     */
    if (null != entity) {
      for (Pojo pojo : pojoList) {
        if (null == pojo.getOperatingObject())
          pojo.setOperatingObject(myObj);
        if (pojo.params().isEmpty())
          pojo.addParamsBy(pojo.getOperatingObject());
      }
      updateCount = dao._exec(pojoList.toArray(new DaoStatement[pojoList.size()]));
    }
    return this;
  }

  public Pojo addUpdate() {
    return addUpdate(entity, myObj);
  }

  public Pojo addUpdate(Chain chain, Condition cnd) {
    Pojo pojo = dao.pojoMaker.makePojo(SqlType.UPDATE);
    pojo.setEntity(entity);
    pojo.append(Pojos.Items.entityTableName());
    pojo.append(Pojos.Items.updateFieldsBy(chain));
    pojo.append(Pojos.Items.cnd(cnd));
    pojoList.add(pojo);
    return pojo;
  }

  public Pojo addUpdate(final Entity<?> en, final Object obj) {
    if (null == en)
      return null;

    Pojo pojo = dao.pojoMaker.makeUpdate(en, null)
                  .append(Pojos.Items.cndAuto(en, Lang.first(obj)))
                  .setOperatingObject(obj);
    pojoList.add(pojo);
    return pojo;
  }

  public List<Pojo> addUpdateForIgnoreNullfinal Entity<?> en,
                        final Object obj,
                        final FieldMatcher fm) {

    if (null == en)
      return null;

    final FieldMatcher newFM;
    if (null == fm)
      newFM = FieldMatcher.make(null, null, true);
    else {
      newFM = fm;
      newFM.setIgnoreNull(true);
    }
    final List<Pojo> re = new ArrayList<Pojo>(Lang.length(obj));
    Lang.each(obj, new Each<Object>() {
      public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException {
        Pojo pojo = dao.pojoMaker.makeUpdate(en, ele)
                      .append(Pojos.Items.cndAuto(en, ele))
                      .setOperatingObject(ele);
        pojo.getContext().setFieldMatcher(newFM);
        re.add(pojo);
      }
    });
    pojoList.addAll(re);

    return re;
  }

  public Pojo addUpdate(Condition cnd) {
    if (null == entity)
      return null;

    Pojo pojo = dao.pojoMaker.makeUpdate(entity, null).append(Pojos.Items.cnd(cnd));
    pojoList.add(pojo);
    return pojo;
  }

  public Pojo addDeleteSelfOnly(long id) {
    if (null == entity)
      return null;

    Pojo pojo = dao.pojoMaker.makeDelete(entity);
    pojo.append(Pojos.Items.cndAuto(entity, myObj));
    pojo.addParamsBy(myObj);
    pojoList.add(pojo);
    return pojo;
  }

  public Pojo addDeleteSelfOnly(String name) {
    if (null == entity)
      return null;

    Pojo pojo = dao.pojoMaker.makeDelete(entity);
    pojo.append(Pojos.Items.cndName(entity, name));
    pojo.addParamsBy(name);
    pojoList.add(pojo);
    return pojo;
  }

  public Pojo addDeleteSelfOnly() {
    if (null == entity)
      return null;

    Pojo pojo = dao.pojoMaker.makeDelete(entity);
    pojo.append(Pojos.Items.cndAuto(entity, myObj));
    pojo.addParamsBy(myObj);
    pojoList.add(pojo);
    return pojo;
  }

  public List<Pojo> addInsert() {
    return addInsert(entity, myObj);
  }

  public List<Pojo> addInsert(Entity<?> en, Object obj) {
    if (null == en)
      return null;

    int len = Lang.length(obj);
    List<Pojo> re = new ArrayList<Pojo>(len);
    if (len > 0) {
      if (len == 1) {
        for (Pojo pojo : en.cloneBeforeInsertMacroes())
          re.add(pojo.setOperatingObject(obj));
      }
      re.add(dao.pojoMaker.makeInsert(en).setOperatingObject(obj));
      if (len == 1) {
        for (Pojo pojo : en.cloneAfterInsertMacroes())
          re.add(pojo.setOperatingObject(obj));
      }
      pojoList.addAll(re);
    }
    return re;
  }

  public Pojo addInsertSelfOnly() {
    return addInsertSelfOnly(entity, myObj);
  }

  public Pojo addInsertSelfOnly(Entity<?> en, Object obj) {
    if (null == entity)
      return null;

    Pojo pojo;

    if (obj instanceof Chain) {
      pojo = dao.pojoMaker.makePojo(SqlType.INSERT);
      pojo.append(Pojos.Items.entityTableName());
      pojo.append(new InsertByChainPItem((Chain)obj));
      pojo.setEntity(en);
    } else {
      pojo = dao.pojoMaker.makeInsert(en).setOperatingObject(obj);
    }
    pojoList.add(pojo);
    return pojo;
  }

  public EntityOperator add(Pojo pojo) {
    pojoList.add(pojo);
    return this;
  }

  public int getUpdateCount() {
    return updateCount;
  }

  public PojoMaker maker() {
    return dao.pojoMaker;
  }

  public Entity<?> getEntityBy(Object obj) {
    return dao.holder.getEntityBy(obj);
  }

  public Entity<?> getEntity(Class<?> type) {
    return dao.holder.getEntity(type);
  }

  public Entity<?> makeEntity(String tableName, Map<String, Object> map) {
    return dao.holder.makeEntity(tableName, map);
  }

}
TOP

Related Classes of org.nutz.dao.impl.EntityOperator

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.