// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/Condition.java
// public class Condition extends LogicExpressionElement {
// 
// 	private ConditionElement left;
// 	private String operator;
// 	private ConditionElement right;
// 
// 	public Condition(QueryWords words) {
// 		this.left = ConditionElement.create(words);
// 		this.operator = words.next();
// 		this.right = ConditionElement.create(words);
// 	}
// 
// 	public boolean match(QueryResultRow row, Map<String, Object> parameters, boolean executingWhere) {
// 		Object leftObject = leftObject(row);
// 		Object rightObject = rightObject(row, parameters);
// 		
// 		// @BadSmell (When we are executing where in join process it could not have this one yet)
// 		if (leftObject == null || rightObject == null) {
// 			if (executingWhere) {
// 				return false;
// 			} else {
// 				return true;
// 			}
// 		}
// 		
// 		return ComparatorUtil.isTrue(leftObject, operator, rightObject);
// 	}
// 
// 	@BadSmell("1) right and left should be the same thing. 2) literal")
// 	private Object rightObject(QueryResultRow row, Map<String, Object> parameters) {
// 		if (right.isParameter()) {
// 			ConditionParameter conditionParameter = (ConditionParameter) right;
// 			if (Util.isInteger(conditionParameter.getParameterName())) {
// 				return new Integer(conditionParameter.getParameterName());
// 			}
// 			return parameters.get(conditionParameter.getParameterName());
// 		} else if (right.isPath()) {
// 			return row.getObject(((ConditionPath) right).getPath());
// 		} else if (right.isSubQuery()) {
// 			return ((ConditionSubQuery) right).getResultList(parameters);
// 		} else if (right.isNull()) {
// 			return "NULL";
// 		} else {
// 			throw new RuntimeException("Expression is neither parameter nor path nor subQuery");
// 		}
// 	}
// 
// 	private Object leftObject(QueryResultRow row) {
// 		return row.getObject(((ConditionPath) left).getPath());
// 	}
// 
// 	public boolean isExpression() {
// 		return true;
// 	}
// 
// 	public ConditionElement getLeft() {
// 		return left;
// 	}
// 
// 	public String getOperator() {
// 		return operator;
// 	}
// 
// 	public ConditionElement getRight() {
// 		return right;
// 	}
// 
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicExpression.java
// public class LogicExpression {
// 
// 	private List<LogicExpressionElement> elements = new ArrayList<LogicExpressionElement>();
// 
// 	public LogicExpression(QueryWords words) {
// 		while (words.isThereMoreWhereElements()) {
// 			addElement(words);
// 		}
// 	}
// 
// 	public List<LogicExpressionElement> getElements() {
// 		return elements;
// 	}
// 
// 	void addElementExpression(QueryWords words) {
// 		getElements().add(new Condition(words));
// 	}
// 
// 	void addElementLogicOperator(QueryWords words) {
// 		getElements().add(new LogicOperator(words.next()));
// 	}
// 
// 	@FixMe("Make it be the same to with") 
// 	void addElement(QueryWords words) {
// 		if (words.isLogicOperator()) {
// 			addElementLogicOperator(words);
// 		} else {
// 			addElementExpression(words);
// 		}
// 	}
// 	
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicExpressionElement.java
// public abstract class LogicExpressionElement {
// 
// 	public boolean isExpression() {
// 		return false;
// 	}
// 
// 	public boolean isLogicOperator() {
// 		return false;
// 	}
// 	
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicOperator.java
// public class LogicOperator extends LogicExpressionElement {
// 
// 	private String operator;
// 
// 	public LogicOperator(String operator) {
// 		this.operator = operator;
// 	}
// 	
// 	public boolean isLogicOperator() {
// 		return true;
// 	}
// 
// 	public String getOperator() {
// 		return operator;
// 	}
// 
// 	public Boolean evaluate(Boolean firstResult, Boolean secondResult) {
// 		if ("AND".equalsIgnoreCase(operator)) {
// 			return firstResult && secondResult;
// 		} else {
// 			throw new RuntimeException("Operator "  + operator + " not yet implemented");
// 		}
// 	}
// }


import java.util.List;
import java.util.Map;
import java.util.Stack;
import org.raidenjpa.query.parser.Condition;
import org.raidenjpa.query.parser.LogicExpression;
import org.raidenjpa.query.parser.LogicExpressionElement;
import org.raidenjpa.query.parser.LogicOperator;
import org.raidenjpa.util.BadSmell;
package org.raidenjpa.query.executor;



@BadSmell("Should we put it in LogicExpression")
public class LogicExpressionExecutor {

	@BadSmell("It is a field, but match is that one which set it")
	private Stack<Element> stack;

// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/Condition.java
// public class Condition extends LogicExpressionElement {
// 
// 	private ConditionElement left;
// 	private String operator;
// 	private ConditionElement right;
// 
// 	public Condition(QueryWords words) {
// 		this.left = ConditionElement.create(words);
// 		this.operator = words.next();
// 		this.right = ConditionElement.create(words);
// 	}
// 
// 	public boolean match(QueryResultRow row, Map<String, Object> parameters, boolean executingWhere) {
// 		Object leftObject = leftObject(row);
// 		Object rightObject = rightObject(row, parameters);
// 		
// 		// @BadSmell (When we are executing where in join process it could not have this one yet)
// 		if (leftObject == null || rightObject == null) {
// 			if (executingWhere) {
// 				return false;
// 			} else {
// 				return true;
// 			}
// 		}
// 		
// 		return ComparatorUtil.isTrue(leftObject, operator, rightObject);
// 	}
// 
// 	@BadSmell("1) right and left should be the same thing. 2) literal")
// 	private Object rightObject(QueryResultRow row, Map<String, Object> parameters) {
// 		if (right.isParameter()) {
// 			ConditionParameter conditionParameter = (ConditionParameter) right;
// 			if (Util.isInteger(conditionParameter.getParameterName())) {
// 				return new Integer(conditionParameter.getParameterName());
// 			}
// 			return parameters.get(conditionParameter.getParameterName());
// 		} else if (right.isPath()) {
// 			return row.getObject(((ConditionPath) right).getPath());
// 		} else if (right.isSubQuery()) {
// 			return ((ConditionSubQuery) right).getResultList(parameters);
// 		} else if (right.isNull()) {
// 			return "NULL";
// 		} else {
// 			throw new RuntimeException("Expression is neither parameter nor path nor subQuery");
// 		}
// 	}
// 
// 	private Object leftObject(QueryResultRow row) {
// 		return row.getObject(((ConditionPath) left).getPath());
// 	}
// 
// 	public boolean isExpression() {
// 		return true;
// 	}
// 
// 	public ConditionElement getLeft() {
// 		return left;
// 	}
// 
// 	public String getOperator() {
// 		return operator;
// 	}
// 
// 	public ConditionElement getRight() {
// 		return right;
// 	}
// 
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicExpression.java
// public class LogicExpression {
// 
// 	private List<LogicExpressionElement> elements = new ArrayList<LogicExpressionElement>();
// 
// 	public LogicExpression(QueryWords words) {
// 		while (words.isThereMoreWhereElements()) {
// 			addElement(words);
// 		}
// 	}
// 
// 	public List<LogicExpressionElement> getElements() {
// 		return elements;
// 	}
// 
// 	void addElementExpression(QueryWords words) {
// 		getElements().add(new Condition(words));
// 	}
// 
// 	void addElementLogicOperator(QueryWords words) {
// 		getElements().add(new LogicOperator(words.next()));
// 	}
// 
// 	@FixMe("Make it be the same to with") 
// 	void addElement(QueryWords words) {
// 		if (words.isLogicOperator()) {
// 			addElementLogicOperator(words);
// 		} else {
// 			addElementExpression(words);
// 		}
// 	}
// 	
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicExpressionElement.java
// public abstract class LogicExpressionElement {
// 
// 	public boolean isExpression() {
// 		return false;
// 	}
// 
// 	public boolean isLogicOperator() {
// 		return false;
// 	}
// 	
// }
// 
// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/parser/LogicOperator.java
// public class LogicOperator extends LogicExpressionElement {
// 
// 	private String operator;
// 
// 	public LogicOperator(String operator) {
// 		this.operator = operator;
// 	}
// 	
// 	public boolean isLogicOperator() {
// 		return true;
// 	}
// 
// 	public String getOperator() {
// 		return operator;
// 	}
// 
// 	public Boolean evaluate(Boolean firstResult, Boolean secondResult) {
// 		if ("AND".equalsIgnoreCase(operator)) {
// 			return firstResult && secondResult;
// 		} else {
// 			throw new RuntimeException("Operator "  + operator + " not yet implemented");
// 		}
// 	}
// }


// Path: raidenjpa-core/src/main/java/org/raidenjpa/query/executor/LogicExpressionExecutor.java
import java.util.List;
import java.util.Map;
import java.util.Stack;
import org.raidenjpa.query.parser.Condition;
import org.raidenjpa.query.parser.LogicExpression;
import org.raidenjpa.query.parser.LogicExpressionElement;
import org.raidenjpa.query.parser.LogicOperator;
import org.raidenjpa.util.BadSmell;

package org.raidenjpa.query.executor;



@BadSmell("Should we put it in LogicExpression")
public class LogicExpressionExecutor {

	@BadSmell("It is a field, but match is that one which set it")
	private Stack<Element> stack;

	private LogicExpression logicExpression;