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

com.avaje.ebeaninternal.server.query.SqlTreeAlias Maven / Gradle / Ivy

There is a newer version: 2.8.1
Show newest version
package com.avaje.ebeaninternal.server.query;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;

import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.ebeaninternal.server.el.ElPropertyDeploy;

/**
 * Special Map of the logical property joins to table alias.
 * 
 * @author rbygrave
 */
public class SqlTreeAlias {

    private int counter;
    
    private int manyWhereCounter;
    
	private TreeSet joinProps = new TreeSet();

    private HashSet embeddedPropertyJoins;

	private TreeSet manyWhereJoinProps = new TreeSet();

	private HashMap aliasMap = new HashMap();

    private HashMap manyWhereAliasMap = new HashMap();

	private final String rootTableAlias;
	
	public SqlTreeAlias(String rootTableAlias) {
		this.rootTableAlias = rootTableAlias;
	}

	/**
	 * Add joins to support where predicates 
	 * @param manyWhereJoins
	 */
    public void addManyWhereJoins(Set manyWhereJoins) {
        if (manyWhereJoins != null){
            for (String include : manyWhereJoins) {
                addPropertyJoin(include, manyWhereJoinProps);
            }
        }
    }
    
    private void addEmbeddedPropertyJoin(String embProp){
    	if (embeddedPropertyJoins == null){
    		embeddedPropertyJoins = new HashSet();
    	}
    	embeddedPropertyJoins.add(embProp);
    }
    
	/**
	 * Add joins.
	 */
	public void addJoin(Set propJoins, BeanDescriptor desc) {
		if (propJoins != null){
			for (String propJoin : propJoins) {
				ElPropertyDeploy elProp = desc.getElPropertyDeploy(propJoin);
	    		if (elProp != null && elProp.getBeanProperty().isEmbedded()) {
	    			String[] split = SplitName.split(propJoin);
	    			addPropertyJoin(split[0], joinProps);
	    			addEmbeddedPropertyJoin(propJoin);
	    			
	    		} else {
					addPropertyJoin(propJoin, joinProps);	    			
	    		}
			}
		}
	}
	

	
	private void addPropertyJoin(String include, TreeSet set){
		if (set.add(include)) {
			String[] split = SplitName.split(include);
			if (split[0] != null){
				addPropertyJoin(split[0], set);
			}
		}
	}
	
	/**
	 * Build a set of table alias for the given bean and fetch
	 * joined properties.
	 */
	public void buildAlias() {
				
		Iterator i = joinProps.iterator();
		while (i.hasNext()) {
			calcAlias(i.next());
		}

        i = manyWhereJoinProps.iterator();
        while (i.hasNext()) {
            calcAliasManyWhere(i.next());
        }
        
        mapEmbeddedPropertyAlias();
	}
	
	private void mapEmbeddedPropertyAlias() {
		if (embeddedPropertyJoins != null){
			for (String propJoin : embeddedPropertyJoins) {
				String[] split = SplitName.split(propJoin);
				// the table alias of the parent path
				String alias = getTableAlias(split[0]);
				aliasMap.put(propJoin, alias);
			}
		}
	}
	
	private String calcAlias(String prefix) {
		
		String alias = nextTableAlias();
		aliasMap.put(prefix, alias);
		return alias;
	}

    private String calcAliasManyWhere(String prefix) {

        String alias = nextManyWhereTableAlias();        
        manyWhereAliasMap.put(prefix, alias);
        return alias;
    }
	
	/**
	 * Return the table alias for a given property name.
	 */
	public String getTableAlias(String prefix){
		if (prefix == null){
			return rootTableAlias;
		} else {
			String s = aliasMap.get(prefix);
			if (s == null){
				return calcAlias(prefix);
			}
			return s;
		}
	}

    /**
     * Return an alias using "Many where joins".
     */
    public String getTableAliasManyWhere(String prefix) {
        if (prefix == null){
            return rootTableAlias;
        } 
        String s = manyWhereAliasMap.get(prefix);
        if (s == null){
            s = aliasMap.get(prefix);
        }
        if (s == null) {
            String msg = "Could not determine table alias for [" + prefix + "] manyMap["
                + manyWhereAliasMap + "] aliasMap[" + aliasMap + "]";
            throw new RuntimeException(msg);
        }
        return s;
    }

    /**
     * Parse for where clauses that uses "Many where joins"
     */
    public String parseWhere(String clause) {
        clause = parseRootAlias(clause);
        clause = parseAliasMap(clause, manyWhereAliasMap);
        return parseAliasMap(clause, aliasMap);
    }

    /**
     * Parse without using any extra "Many where joins".
     */
    public String parse(String clause) {
        clause = parseRootAlias(clause);
        return parseAliasMap(clause, aliasMap);
    }

    /**
     * Parse the clause replacing the table alias place holders.
     */
    private String parseRootAlias(String clause) {
    
        if (rootTableAlias == null){
            return clause.replace("${}", "");
        } else {
            return clause.replace("${}", rootTableAlias+".");         
        }
    }
    
	/**
	 * Parse the clause replacing the table alias place holders.
	 */
	private String parseAliasMap(String clause, HashMap parseAliasMap) {

		Iterator> i = parseAliasMap.entrySet().iterator();
		while (i.hasNext()) {
			Map.Entry e = i.next();
			String k = "${"+e.getKey()+"}";
			clause  = clause.replace(k, e.getValue()+".");
		}
		
		return clause;
	}
	

	/**
	 * Return the next valid table alias given the preferred table alias.
	 */
	private String nextTableAlias() {
	    return "t"+(++counter);
	}
	
	private String nextManyWhereTableAlias() {   
        return "u"+(++manyWhereCounter);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy