亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fromclause.java

?? hibernate-3.1.3-all-src.zip 面向對象的訪問數據庫工具
?? JAVA
字號:
// $Id: FromClause.java 7744 2005-08-03 22:53:34Z oneovthafew $
package org.hibernate.hql.ast.tree;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.hql.antlr.HqlSqlTokenTypes;
import org.hibernate.hql.ast.util.ASTIterator;
import org.hibernate.hql.ast.util.ASTUtil;

import antlr.SemanticException;
import antlr.collections.AST;

/**
 * Represents the 'FROM' part of a query or subquery, containing all mapped class references.
 *
 * @author josh
 */
public class FromClause extends HqlSqlWalkerNode implements HqlSqlTokenTypes, DisplayableNode {
	private static Log log = LogFactory.getLog( FromClause.class );
	public static final int ROOT_LEVEL = 1;

	private int level = ROOT_LEVEL;
	private Set fromElements = new HashSet();
	private Map fromElementByClassAlias = new HashMap();
	private Map fromElementByTableAlias = new HashMap();
	private Map fromElementsByPath = new HashMap();

	/**
	 * All of the implicit FROM xxx JOIN yyy elements that are the destination of a collection.  These are created from
	 * index operators on collection property references.
	 */
	private Map collectionJoinFromElementsByPath = new HashMap();
	/**
	 * Pointer to the parent FROM clause, if there is one.
	 */
	private FromClause parentFromClause;
	/**
	 * Collection of FROM clauses of which this is the parent.
	 */
	private Set childFromClauses;
	/**
	 * Counts the from elements as they are added.
	 */
	private int fromElementCounter = 0;
	/**
	 * Implied FROM elements to add onto the end of the FROM clause.
	 */
	private List impliedElements = new LinkedList();

	/**
	 * Adds a new from element to the from node.
	 *
	 * @param path  The reference to the class.
	 * @param alias The alias AST.
	 * @return FromElement - The new FROM element.
	 */
	public FromElement addFromElement(String path, AST alias) throws SemanticException {
		// The path may be a reference to an alias defined in the parent query.
		String classAlias = ( alias == null ) ? null : alias.getText();
		checkForDuplicateClassAlias( classAlias );
		FromElementFactory factory = new FromElementFactory( this, null, path, classAlias, null, false );
		return factory.addFromElement();
	}

	void registerFromElement(FromElement element) {
		fromElements.add( element );
		String classAlias = element.getClassAlias();
		if ( classAlias != null ) {
			// The HQL class alias refers to the class name.
			fromElementByClassAlias.put( classAlias, element );
		}
		// Associate the table alias with the element.
		String tableAlias = element.getTableAlias();
		if ( tableAlias != null ) {
			fromElementByTableAlias.put( tableAlias, element );
		}
	}

	void addDuplicateAlias(String alias, FromElement element) {
		fromElementByClassAlias.put( alias, element );
	}

	private void checkForDuplicateClassAlias(String classAlias) throws SemanticException {
		if ( classAlias != null && fromElementByClassAlias.containsKey( classAlias ) ) {
			throw new SemanticException( "Duplicate definition of alias '"
					+ classAlias + "'" );
		}
	}

	/**
	 * Retreives the from-element represented by the given alias.
	 *
	 * @param aliasOrClassName The alias by which to locate the from-element.
	 * @return The from-element assigned the given alias, or null if none.
	 */
	public FromElement getFromElement(String aliasOrClassName) {
		FromElement fromElement = ( FromElement ) fromElementByClassAlias.get( aliasOrClassName );
		if ( fromElement == null && parentFromClause != null ) {
			fromElement = parentFromClause.getFromElement( aliasOrClassName );
		}
		return fromElement;
	}

	/**
	 * Convenience method to check whether a given token represents a from-element alias.
	 *
	 * @param possibleAlias The potential from-element alias to check.
	 * @return True if the possibleAlias is an alias to a from-element visible
	 *         from this point in the query graph.
	 */
	public boolean isFromElementAlias(String possibleAlias) {
		boolean isAlias = fromElementByClassAlias.containsKey( possibleAlias );
		if ( !isAlias && parentFromClause != null ) {
			// try the parent FromClause...
			isAlias = parentFromClause.isFromElementAlias( possibleAlias );
		}
		return isAlias;
	}

	/**
	 * Returns the list of from elements in order.
	 *
	 * @return the list of from elements (instances of FromElement).
	 */
	public List getFromElements() {
		return ASTUtil.collectChildren( this, fromElementPredicate );
	}
	
	public FromElement getFromElement() {
		// TODO: not sure about this one
//		List fromElements = getFromElements();
//		if ( fromElements == null || fromElements.isEmpty() ) {
//			throw new QueryException( "Unable to locate from element" );
//		}
		return (FromElement) getFromElements().get(0);
	}

	/**
	 * Returns the list of from elements that will be part of the result set.
	 *
	 * @return the list of from elements that will be part of the result set.
	 */
	public List getProjectionList() {
		return ASTUtil.collectChildren( this, projectionListPredicate );
	}

	public List getCollectionFetches() {
		return ASTUtil.collectChildren( this, collectionFetchPredicate );
	}

	public boolean hasCollectionFecthes() {
		return getCollectionFetches().size() > 0;
	}

	public List getExplicitFromElements() {
		return ASTUtil.collectChildren( this, explicitFromPredicate );
	}

	private static ASTUtil.FilterPredicate fromElementPredicate = new ASTUtil.IncludePredicate() {
		public boolean include(AST node) {
			FromElement fromElement = ( FromElement ) node;
			return fromElement.isFromOrJoinFragment();
		}
	};

	private static ASTUtil.FilterPredicate projectionListPredicate = new ASTUtil.IncludePredicate() {
		public boolean include(AST node) {
			FromElement fromElement = ( FromElement ) node;
			return fromElement.inProjectionList();
		}
	};

	private static ASTUtil.FilterPredicate collectionFetchPredicate = new ASTUtil.IncludePredicate() {
		public boolean include(AST node) {
			FromElement fromElement = ( FromElement ) node;
			return fromElement.isFetch() && fromElement.getQueryableCollection() != null;
		}
	};

	private static ASTUtil.FilterPredicate explicitFromPredicate = new ASTUtil.IncludePredicate() {
		public boolean include(AST node) {
			final FromElement fromElement = ( FromElement ) node;
			return !fromElement.isImplied();
		}
	};

	FromElement findCollectionJoin(String path) {
		return ( FromElement ) collectionJoinFromElementsByPath.get( path );
	}

	/**
	 * Look for an existing implicit or explicit join by the
	 * given path.
	 */
	FromElement findJoinByPath(String path) {
		FromElement elem = findJoinByPathLocal( path );
		if ( elem == null && parentFromClause != null ) {
			elem = parentFromClause.findJoinByPath( path );
		}
		return elem;
	}

	FromElement findJoinByPathLocal(String path) {
		Map joinsByPath = fromElementsByPath;
		return ( FromElement ) joinsByPath.get( path );
	}

	void addJoinByPathMap(String path, FromElement destination) {
		if ( log.isDebugEnabled() ) {
			log.debug( "addJoinByPathMap() : " + path + " -> " + destination );
		}
		fromElementsByPath.put( path, destination );
	}

	/**
	 * Returns true if the from node contains the class alias name.
	 *
	 * @param alias The HQL class alias name.
	 * @return true if the from node contains the class alias name.
	 */
	public boolean containsClassAlias(String alias) {
		return fromElementByClassAlias.keySet().contains( alias );
	}

	/**
	 * Returns true if the from node contains the table alias name.
	 *
	 * @param alias The SQL table alias name.
	 * @return true if the from node contains the table alias name.
	 */
	public boolean containsTableAlias(String alias) {
		return fromElementByTableAlias.keySet().contains( alias );
	}

	public String getDisplayText() {
		return "FromClause{" +
				"level=" + level +
				", fromElementCounter=" + fromElementCounter +
				", fromElements=" + fromElements.size() +
				", fromElementByClassAlias=" + fromElementByClassAlias.keySet() +
				", fromElementByTableAlias=" + fromElementByTableAlias.keySet() +
				", fromElementsByPath=" + fromElementsByPath.keySet() +
				", collectionJoinFromElementsByPath=" + collectionJoinFromElementsByPath.keySet() +
				", impliedElements=" + impliedElements +
				"}";
	}

	public void setParentFromClause(FromClause parentFromClause) {
		this.parentFromClause = parentFromClause;
		if ( parentFromClause != null ) {
			level = parentFromClause.getLevel() + 1;
			parentFromClause.addChild( this );
		}
	}

	private void addChild(FromClause fromClause) {
		if ( childFromClauses == null ) {
			childFromClauses = new HashSet();
		}
		childFromClauses.add( fromClause );
	}

	public FromClause locateChildFromClauseWithJoinByPath(String path) {
		if ( childFromClauses != null && !childFromClauses.isEmpty() ) {
			Iterator children = childFromClauses.iterator();
			while ( children.hasNext() ) {
				FromClause child = ( FromClause ) children.next();
				if ( child.findJoinByPathLocal( path ) != null ) {
					return child;
				}
			}
		}
		return null;
	}

	public void promoteJoin(FromElement elem) {
		if ( log.isDebugEnabled() ) {
			log.debug( "Promoting [" + elem + "] to [" + this + "]" );
		}
		//TODO: implement functionality
		//  this might be painful to do here, as the "join post processing" for
		//  the subquery has already been performed (meaning that for
		//  theta-join dialects, the join conditions have already been moved
		//  over to the where clause).  A "simple" solution here might to
		//  perform "join post processing" once for the entire query (including
		//  any subqueries) at one fell swoop
	}

	public boolean isSubQuery() {
		// TODO : this is broke for subqueries in statements other than selects...
		return parentFromClause != null;
	}

	void addCollectionJoinFromElementByPath(String path, FromElement destination) {
		if ( log.isDebugEnabled() ) {
			log.debug( "addCollectionJoinFromElementByPath() : " + path + " -> " + destination );
		}
		collectionJoinFromElementsByPath.put( path, destination );	// Add the new node to the map so that we don't create it twice.
	}

	public FromClause getParentFromClause() {
		return parentFromClause;
	}

	public int getLevel() {
		return level;
	}

	public int nextFromElementCounter() {
		return fromElementCounter++;
	}

	public void resolve() {
		// Make sure that all from elements registered with this FROM clause are actually in the AST.
		ASTIterator iter = new ASTIterator( this.getFirstChild() );
		Set childrenInTree = new HashSet();
		while ( iter.hasNext() ) {
			childrenInTree.add( iter.next() );
		}
		for ( Iterator iterator = fromElements.iterator(); iterator.hasNext(); ) {
			FromElement fromElement = ( FromElement ) iterator.next();
			if ( !childrenInTree.contains( fromElement ) ) {
				throw new IllegalStateException( "Element not in AST: " + fromElement );
			}
		}
	}

	public void addImpliedFromElement(FromElement element) {
		impliedElements.add( element );
	}

	public String toString() {
		return "FromClause{" +
				"level=" + level +
				"}";
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九视频精品免费| 日韩av电影免费观看高清完整版| 欧美色中文字幕| 91精品福利在线| 色8久久人人97超碰香蕉987| 91色.com| 欧美综合亚洲图片综合区| 91婷婷韩国欧美一区二区| 91热门视频在线观看| 色综合久久综合网欧美综合网| 99久久婷婷国产综合精品电影 | 国产精品国产成人国产三级 | 一区二区三区精品久久久| 亚洲欧洲www| 一区二区三区视频在线观看| 亚洲综合在线五月| 午夜视频一区二区| 麻豆国产精品777777在线| 国产91综合网| 日本久久电影网| 日韩一卡二卡三卡国产欧美| 日韩欧美成人激情| 国产精品视频一二三区| 一区二区三区 在线观看视频| 亚洲成av人片www| 激情综合色丁香一区二区| 国产suv精品一区二区6| 日本丰满少妇一区二区三区| 欧美高清视频在线高清观看mv色露露十八 | 国产精品久久久久精k8 | 久久先锋资源网| ●精品国产综合乱码久久久久| 亚洲一区二区在线播放相泽| 精品一区二区在线观看| 91亚洲精品久久久蜜桃网站| 欧美日韩精品一二三区| 国产精品免费人成网站| 午夜欧美在线一二页| 成人黄色综合网站| 日韩精品一区二区三区三区免费| 一区精品在线播放| 美女国产一区二区| 在线看日本不卡| 久久精品一区二区三区不卡| 一区二区三区欧美激情| 国产999精品久久久久久| 欧美精品少妇一区二区三区| 国产精品二三区| 国产一区二区不卡在线| 欧美精品在线一区二区三区| 中文字幕一区二区三区视频| 久久99精品久久久久婷婷| 91丨九色丨黑人外教| 国产亚洲一区字幕| 久久激情五月婷婷| 欧美三级视频在线播放| 最近日韩中文字幕| 成人涩涩免费视频| 国产校园另类小说区| 毛片一区二区三区| 91精品国产综合久久福利| 美腿丝袜在线亚洲一区| 91成人网在线| 亚洲三级免费电影| 成人av在线影院| 国产精品网站在线| 国产91精品一区二区| 久久综合狠狠综合久久综合88| 日韩精品成人一区二区三区| 91行情网站电视在线观看高清版| 国产精品久久久久久久久图文区| 国产在线日韩欧美| 久久精品人人做| 国产精品一二三在| 国产精品日产欧美久久久久| 国产**成人网毛片九色| 中文字幕乱码久久午夜不卡| 国产精品亚洲专一区二区三区| 久久影视一区二区| 福利视频网站一区二区三区| 欧美精彩视频一区二区三区| 国产suv精品一区二区6| 综合色中文字幕| 欧美专区亚洲专区| 日韩电影在线免费| 欧美精品一区二区三区高清aⅴ| 国产尤物一区二区| 日本一二三不卡| 色偷偷88欧美精品久久久| 夜夜亚洲天天久久| 欧美一卡二卡三卡| 国产美女久久久久| 亚洲日本va午夜在线影院| 欧美系列日韩一区| 久久精品国产一区二区三区免费看 | 91久久人澡人人添人人爽欧美 | 91精品视频网| 国产一区二区电影| 亚洲乱码精品一二三四区日韩在线| 91国内精品野花午夜精品| 午夜成人在线视频| 久久只精品国产| 色婷婷精品大在线视频| 日本午夜精品一区二区三区电影| 精品99一区二区三区| 色综合久久99| 国模大尺度一区二区三区| 中文字幕日韩一区| 欧美大片国产精品| 成人黄色777网| 秋霞电影网一区二区| 欧美激情艳妇裸体舞| 欧美性大战久久久久久久| 黄页视频在线91| 亚洲男人天堂av网| 久久亚洲一区二区三区明星换脸 | 日韩视频免费直播| 成年人国产精品| 久久精品免费看| 亚洲精品伦理在线| 国产欧美一二三区| 日韩视频一区二区三区在线播放 | 亚洲国产精品影院| 久久久久成人黄色影片| 欧美三级视频在线播放| jlzzjlzz国产精品久久| 美国一区二区三区在线播放| 亚洲女同一区二区| 国产精品欧美久久久久无广告| 日本乱人伦aⅴ精品| 国产1区2区3区精品美女| 免费三级欧美电影| 亚洲国产婷婷综合在线精品| 国产精品国产三级国产| 久久青草欧美一区二区三区| 69p69国产精品| 欧美怡红院视频| 色94色欧美sute亚洲13| 本田岬高潮一区二区三区| 国产麻豆成人精品| 久久aⅴ国产欧美74aaa| 日韩1区2区日韩1区2区| 五月综合激情婷婷六月色窝| 亚洲黄网站在线观看| 成人免费在线播放视频| 国产精品初高中害羞小美女文| 久久久综合视频| 国产亚洲一区字幕| 国产欧美一区在线| 国产欧美日产一区| 国产精品毛片a∨一区二区三区| 日韩欧美国产综合在线一区二区三区| 欧美挠脚心视频网站| 在线观看91视频| 欧美日韩国产免费一区二区| 欧美色中文字幕| 欧美老女人在线| 日韩一区二区三区电影在线观看 | 日韩精品中文字幕在线不卡尤物| 欧美男生操女生| 欧美一区二区免费观在线| 欧美久久一二三四区| 欧美高清视频不卡网| 在线不卡的av| 精品区一区二区| 国产精品视频第一区| 一区二区中文字幕在线| 亚洲另类色综合网站| 亚洲第一精品在线| 久久精品二区亚洲w码| 国产一区久久久| 99精品黄色片免费大全| 欧美视频在线观看一区| 欧美一区二区三区视频免费播放| 欧美成人video| 国产精品美女一区二区在线观看| 亚洲男同性恋视频| 日韩精品久久理论片| 国内精品在线播放| 99re成人在线| 欧美一区二区三区在线视频| 精品999在线播放| 日韩一区欧美一区| 蜜臀精品一区二区三区在线观看 | 亚洲欧美在线观看| 日韩二区三区四区| 成人教育av在线| 欧美日韩大陆一区二区| 国产欧美1区2区3区| 亚洲综合一二三区| 国产在线麻豆精品观看| 91极品视觉盛宴| 精品88久久久久88久久久| 中文字幕日韩av资源站| 美女久久久精品| 欧洲在线/亚洲| 中文字幕亚洲在| 狠狠色丁香婷综合久久| 欧美揉bbbbb揉bbbbb| 国产精品三级视频|