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> addUpdateForIgnoreNull(    final 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.