dmlstatment.java

来自「mysql集群」· Java 代码 · 共 145 行

JAVA
145
字号
/*
 * 	This program is free software; you can redistribute it and/or modify it under the terms of 
 * the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, 
 * or (at your option) any later version. 
 * 
 * 	This program 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 General Public License for more details. 
 * 	You should have received a copy of the GNU General Public License along with this program; 
 * if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package com.meidusa.amoeba.parser.statment;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.meidusa.amoeba.parser.dbobject.Column;
import com.meidusa.amoeba.parser.dbobject.Table;
import com.meidusa.amoeba.parser.expression.AndExpression;
import com.meidusa.amoeba.parser.expression.BaseExpressionList;
import com.meidusa.amoeba.parser.expression.ColumnExpression;
import com.meidusa.amoeba.parser.expression.Expression;
import com.meidusa.amoeba.sqljep.function.Comparative;
import com.meidusa.amoeba.sqljep.function.ComparativeAND;
import com.meidusa.amoeba.sqljep.function.ComparativeBaseList;
import com.meidusa.amoeba.sqljep.function.ComparativeOR;


/**
 * 
 * @author <a href=mailto:piratebase@sina.com>Struct chen</a>
 *
 */
public abstract class DMLStatment extends AbstractStatment {
	private static Logger logger = Logger.getLogger(DMLStatment.class);
	protected boolean preparedStatment;
	protected Table[] tables;
	protected Expression expression;
	private Map<Table,Map<Column,Comparative>> evaluatedTableMap;
	public abstract boolean isReadStatment();
	
	public void setExpression(Expression expression) {
		this.expression = expression;
	}
	
	public Expression getExpression() {
		return expression;
	}

	public Table[] getTables() {
		return tables;
	}

	public void setTables(Table[] tables) {
		this.tables = tables;
	}

	public boolean isPreparedStatment() {
		return preparedStatment;
	}

	public void setPreparedStatment(boolean preparedStatment) {
		this.preparedStatment = preparedStatment;
	}
	
	public Map<Table,Map<Column,Comparative>> evaluate(Object[] parameters){
		Map<Table,Map<Column,Comparative>> currentEvaluatedTableMap = null;
		if(this.evaluatedTableMap == null){
			currentEvaluatedTableMap = new HashMap<Table,Map<Column,Comparative>>();
			if(expression != null){
				evaluateExpression(expression,currentEvaluatedTableMap,parameters);
				if(logger.isDebugEnabled()){
					logger.debug("expression:["+expression +"] evaluated");
				}
			}else{
				for(Table table: getTables()){
					currentEvaluatedTableMap.put(table, null);
				}
			}
			
			if(expression == null || !expression.isRealtime()){
				this.evaluatedTableMap = currentEvaluatedTableMap;
			}
		}else{
			currentEvaluatedTableMap = this.evaluatedTableMap;
		}
		return currentEvaluatedTableMap;
	}
	
	protected static void evaluateExpression(Expression expression,Map<Table,Map<Column,Comparative>> tablesMap,Object[] parameters){
		if(expression instanceof BaseExpressionList){
			evaluateExpression((BaseExpressionList)expression,tablesMap,parameters);
		}else if(expression instanceof ColumnExpression){
			ColumnExpression colExpression = (ColumnExpression)expression;
			Table table = colExpression.getColumn().getTable();
			Map<Column,Comparative> columnMap = tablesMap.get(table);
			if(columnMap == null){
				columnMap = new HashMap<Column,Comparative>();
				tablesMap.put(table, columnMap);
			}
			columnMap.put(colExpression.getColumn(),(Comparative)colExpression.evaluate(parameters));
		}
	}

	protected static void evaluateExpression(BaseExpressionList elist,Map<Table,Map<Column,Comparative>> tablesMap,Object[] parameters){
		boolean and = false;
		if(elist instanceof AndExpression){
			and = true;
		}
		
		List<Expression> blist = elist.getAllExpression();
		for(Expression e:blist){
			if(e instanceof BaseExpressionList){
				evaluateExpression((BaseExpressionList)e,tablesMap,parameters);
			}else if(e instanceof ColumnExpression){
				ColumnExpression colExpression = (ColumnExpression)e;
				Table table = colExpression.getColumn().getTable();
				Map<Column,Comparative> columnMap = tablesMap.get(table);
				if(columnMap == null){
					columnMap = new HashMap<Column,Comparative>();
					tablesMap.put(table, columnMap);
				}
				Comparative col = columnMap.get(colExpression.getColumn());
				Comparative newComparative = (Comparative)colExpression.evaluate(parameters);
				if(col != null){
					
					ComparativeBaseList comparativeBaseList = null;
					if(and){
						comparativeBaseList = new ComparativeAND(col);
					}else{
						comparativeBaseList = new ComparativeOR(col);
					}
					comparativeBaseList.addComparative(newComparative);
					columnMap.put(colExpression.getColumn(), comparativeBaseList);
				}else{
					columnMap.put(colExpression.getColumn(), newComparative);
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?