All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.esfinge.querybuilder.jpa1.JPAQLQueryVisitor Maven / Gradle / Ivy

Go to download

The Esfinge QueryBuilder JPA1 is the persistence framework for Esfinge QueryBuilder using JPA1.

The newest version!
package net.sf.esfinge.querybuilder.jpa1;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.el.lang.EvaluationContext;

import net.sf.esfinge.querybuilder.methodparser.ComparisonType;
import net.sf.esfinge.querybuilder.methodparser.OrderingDirection;
import net.sf.esfinge.querybuilder.methodparser.QueryElement;
import net.sf.esfinge.querybuilder.methodparser.QueryOrder;
import net.sf.esfinge.querybuilder.methodparser.QueryRepresentation;
import net.sf.esfinge.querybuilder.methodparser.QueryVisitor;
import net.sf.esfinge.querybuilder.methodparser.conditions.NullOption;
import net.sf.esfinge.querybuilder.utils.ELUtils;

public class JPAQLQueryVisitor implements QueryVisitor{
	
	private String query;
	private String entity;
	private List conditions = new ArrayList();
	private List order = new ArrayList();

	@Override
	public void visitEntity(String entity) {
		this.entity = entity;
	}

	@Override
	public void visitConector(String conector) {
		conditions.get(conditions.size()-1).setNextConector(conector);
	}

	@Override
	public void visitCondition(String propertyName, ComparisonType op) {
		ConditionDescription cond = new ConditionDescription(propertyName, op);
		conditions.add(cond);
	}

	protected String getParamName(String propertyName) {
		return propertyName.substring(propertyName.lastIndexOf(".")+1);
	}

	public String getQuery() {
		return query;
	}

	@Override
	public void visitCondition(String propertyName, ComparisonType operator, Object fixedValue) {
		ConditionDescription cond = new ConditionDescription(propertyName, operator);
		cond.setFixedValue(fixedValue);
		conditions.add(cond);
	}
	
	@Override
	public void visitOrderBy(String property, OrderingDirection dir) {
		QueryOrder qo = new QueryOrder(property, dir);
		order.add(qo);
	}

	@Override
	public Object getFixParameterValue(String param) {
		throw new UnsupportedOperationException();
	}

	@Override
	public Set getFixParameters() {
		throw new UnsupportedOperationException();
	}

	@Override
	public void visitCondition(String propertyName, ComparisonType op, NullOption nullOption) {
		ConditionDescription cond = new ConditionDescription(propertyName, op);
		cond.setNullOption(nullOption);
		conditions.add(cond);
	}

	public boolean isDynamic() {
		for(ConditionDescription cond : conditions){
			if(cond.getNullOption() != NullOption.NONE){
				return true;
			}
		}
		return false;
	}

	public String getQuery(Map params) {
		throw new UnsupportedOperationException();
	}

	@Override
	public void visitEnd() {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT o FROM "+entity+ " o");
		addWhere(sb);
		addConditions(sb);
		addOrderBy(sb);
		
		query = sb.toString();
	}

	protected void addConditions(StringBuilder sb) {
		boolean hasOnlyIgnorableBefore = true;
		List previousIgnorableParams = new ArrayList();
		for(int i=0; i < conditions.size(); i++){
			ConditionDescription cond = conditions.get(i);
			if(i != 0){
				addConector(sb, hasOnlyIgnorableBefore,	previousIgnorableParams, i, cond);
			}
			
			sb.append(cond.getConditionString());
			if(hasOnlyIgnorableBefore && cond.getNullOption() != NullOption.IGNORE_WHEN_NULL){
				hasOnlyIgnorableBefore = false;
			}else if(cond.getNullOption() == NullOption.IGNORE_WHEN_NULL){
				previousIgnorableParams.add(cond.getParamName());
			}
		}
	}

	protected void addOrderBy(StringBuilder sb) {
		for(int i=0; i < order.size(); i++){
			if(i == 0){
				sb.append(" ORDER BY");
			}else{
				sb.append(",");
			}
			sb.append(" o."+order.get(i).getProperty()+" "+order.get(i).getDiretion().name());
		}
	}

	protected void addConector(StringBuilder sb,
			boolean hasOnlyIgnorableBefore,
			List previousIgnorableParams, int i,
			ConditionDescription cond) {
		if(hasOnlyIgnorableBefore || cond.getNullOption() == NullOption.IGNORE_WHEN_NULL){
			sb.append("#{((");
			if(hasOnlyIgnorableBefore){
				for(int j=0; j < previousIgnorableParams.size(); j++){
					if(j!=0){
						sb.append(" &&");
					}
					sb.append(" "+previousIgnorableParams.get(j)+" == null");
				}
			}
			if(cond.getNullOption() == NullOption.IGNORE_WHEN_NULL){
				if(hasOnlyIgnorableBefore){
					sb.append(") || (");
				}
				sb.append(cond.getParamName()+" == null");
			}
			sb.append(")) ? '' : ' " + conditions.get(i-1).getNextConector() + "'}");
		}else{
			sb.append(" " + conditions.get(i-1).getNextConector());
		}
	}
	
	private void addWhere(StringBuilder sb){
		if(conditions.size() == 0){
			return;
		}else if(hasOneNoIgnorableProperty()){
			sb.append(" WHERE");
		}else{
			sb.append("#{(onlyNullValues(map))? '' : ' WHERE'}");
		}
	}
	
	private boolean hasOneNoIgnorableProperty(){
		for(ConditionDescription cond : conditions){
			if(cond.getNullOption() != NullOption.IGNORE_WHEN_NULL){
				return true;
			}
		}
		return false;
	}
	
	private Map getFixParameterMap(){
		Map fixParameters = new HashMap();
		for(ConditionDescription cond : conditions){
			if(cond.getFixedValue() != null){
				fixParameters.put(cond.getParamName(), cond.getFixedValue());
			}
		}
		return fixParameters;
	}

	@Override
	public QueryRepresentation getQueryRepresentation() {
		JPAQueryRepresentation qr = new JPAQueryRepresentation(getQuery(), isDynamic(), getFixParameterMap());
		return qr;
	}



}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy