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

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

?? sqlgenerator.java

?? hibernate-3.1.3-all-src.zip 面向對象的訪問數據庫工具
?? JAVA
字號:
// $Id: SqlGenerator.java 8344 2005-10-06 20:12:09Z steveebersole $
package org.hibernate.hql.ast;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import antlr.RecognitionException;
import antlr.collections.AST;
import org.hibernate.QueryException;
import org.hibernate.dialect.function.SQLFunction;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.hql.antlr.SqlGeneratorBase;
import org.hibernate.hql.ast.tree.MethodNode;
import org.hibernate.hql.ast.tree.FromElement;
import org.hibernate.hql.ast.tree.ImpliedFromElement;

/**
 * Generates SQL by overriding callback methods in the base class, which does
 * the actual SQL AST walking.
 *
 * @author josh Jun 23, 2004 6:49:55 AM
 */
public class SqlGenerator extends SqlGeneratorBase implements ErrorReporter {
	/**
	 * Handles parser errors.
	 */
	private ParseErrorHandler parseErrorHandler;

	/**
	 * all append invocations on the buf should go through this Output instance variable.
	 * The value of this variable may be temporarily substitued by sql function processing code
	 * to catch generated arguments.
	 * This is because sql function templates need arguments as seperate string chunks
	 * that will be assembled into the target dialect-specific function call.
	 */
	private SqlWriter writer = new DefaultWriter();

	private SessionFactoryImplementor sessionFactory;

	private LinkedList outputStack = new LinkedList();

	protected void out(String s) {
		writer.clause( s );
	}

	protected void commaBetweenParameters(String comma) {
		writer.commaBetweenParameters( comma );
	}

	public void reportError(RecognitionException e) {
		parseErrorHandler.reportError( e ); // Use the delegate.
	}

	public void reportError(String s) {
		parseErrorHandler.reportError( s ); // Use the delegate.
	}

	public void reportWarning(String s) {
		parseErrorHandler.reportWarning( s );
	}

	public ParseErrorHandler getParseErrorHandler() {
		return parseErrorHandler;
	}

	public SqlGenerator(SessionFactoryImplementor sfi) {
		super();
		parseErrorHandler = new ErrorCounter();
		sessionFactory = sfi;
	}

	public String getSQL() {
		return getStringBuffer().toString();
	}

	protected void optionalSpace() {
		int c = getLastChar();
		switch ( c ) {
			case -1:
				return;
			case ' ':
				return;
			case ')':
				return;
			case '(':
				return;
			default:
				out( " " );
		}
	}

	protected void beginFunctionTemplate(AST m, AST i) {
		MethodNode methodNode = ( MethodNode ) m;
		SQLFunction template = methodNode.getSQLFunction();
		if ( template == null ) {
			// if template is null we just write the function out as it appears in the hql statement
			super.beginFunctionTemplate( m, i );
		}
		else {
			// this function has a template -> redirect output and catch the arguments
			outputStack.addFirst( writer );
			writer = new FunctionArguments();
		}
	}

	protected void endFunctionTemplate(AST m) {
		MethodNode methodNode = ( MethodNode ) m;
		SQLFunction template = methodNode.getSQLFunction();
		if ( template == null ) {
			super.endFunctionTemplate( m );
		}
		else {
			// this function has a template -> restore output, apply the template and write the result out
			FunctionArguments functionArguments = ( FunctionArguments ) writer;   // TODO: Downcast to avoid using an interface?  Yuck.
			writer = ( SqlWriter ) outputStack.removeFirst();
			out( template.render( functionArguments.getArgs(), sessionFactory ) );
		}
	}

	// --- Inner classes (moved here from sql-gen.g) ---

	/**
	 * Writes SQL fragments.
	 */
	interface SqlWriter {
		void clause(String clause);

		/**
		 * todo remove this hack
		 * The parameter is either ", " or " , ". This is needed to pass sql generating tests as the old
		 * sql generator uses " , " in the WHERE and ", " in SELECT.
		 *
		 * @param comma either " , " or ", "
		 */
		void commaBetweenParameters(String comma);
	}

	/**
	 * SQL function processing code redirects generated SQL output to an instance of this class
	 * which catches function arguments.
	 */
	class FunctionArguments implements SqlWriter {
		private int argInd;
		private final List args = new ArrayList( 3 );

		public void clause(String clause) {
			if ( argInd == args.size() ) {
				args.add( clause );
			}
			else {
				args.set( argInd, args.get( argInd ) + clause );
			}
		}

		public void commaBetweenParameters(String comma) {
			++argInd;
		}

		public List getArgs() {
			return args;
		}
	}

	/**
	 * The default SQL writer.
	 */
	class DefaultWriter implements SqlWriter {
		public void clause(String clause) {
			getStringBuffer().append( clause );
		}

		public void commaBetweenParameters(String comma) {
			getStringBuffer().append( comma );
		}
	}

    public static void panic() {
		throw new QueryException( "TreeWalker: panic" );
	}

	protected void fromFragmentSeparator(AST a) {
		// check two "adjecent" nodes at the top of the from-clause tree
		AST next = a.getNextSibling();
		if ( next == null || !hasText( a ) ) {
			return;
		}

		FromElement left = ( FromElement ) a;
		FromElement right = ( FromElement ) next;

		///////////////////////////////////////////////////////////////////////
		// HACK ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!
		// Attempt to work around "ghost" ImpliedFromElements that occasionally
		// show up between the actual things being joined.  This consistently
		// occurs from index nodes (at least against many-to-many).  Not sure
		// if there are other conditions
		//
		// Essentially, look-ahead to the next FromElement that actually
		// writes something to the SQL
		while ( right != null && !hasText( right ) ) {
			right = ( FromElement ) right.getNextSibling();
		}
		if ( right == null ) {
			return;
		}
		///////////////////////////////////////////////////////////////////////

		if ( !hasText( right ) ) {
			return;
		}

		if ( right.getRealOrigin() == left ||
		     ( right.getRealOrigin() != null && right.getRealOrigin() == left.getRealOrigin() ) ) {
			// right represents a joins originating from left; or
			// both right and left reprersent joins originating from the same FromElement
			if ( right.getJoinSequence() != null && right.getJoinSequence().isThetaStyle() ) {
				out( ", " );
			}
			else {
				out( " " );
			}
		}
		else {
			// these are just two unrelated table references
			out( ", " );
		}
	}

	protected void nestedFromFragment(AST d, AST parent) {
		// check a set of parent/child nodes in the from-clause tree
		// to determine if a comma is required between them
		if ( d != null && hasText( d ) ) {
			if ( parent != null && hasText( parent ) ) {
				// again, both should be FromElements
				FromElement left = ( FromElement ) parent;
				FromElement right = ( FromElement ) d;
				if ( right.getRealOrigin() == left ) {
					// right represents a joins originating from left...
					if ( right.getJoinSequence() != null && right.getJoinSequence().isThetaStyle() ) {
						out( ", " );
					}
					else {
						out( " " );
					}
				}
				else {
					// not so sure this is even valid subtree.  but if it was, it'd
					// represent two unrelated table references...
					out( ", " );
				}
			}
			out( d );
		}
	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av中文在线观看| 天堂va蜜桃一区二区三区漫画版| 欧美一级精品在线| 欧美精选在线播放| 欧美高清hd18日本| 这里只有精品99re| 日韩免费看的电影| 国产亚洲欧美一级| 国产精品久久久久久亚洲伦| 中文字幕中文字幕一区二区| 国产精品久久看| 国产精品乱子久久久久| 亚洲欧洲一区二区三区| 一级精品视频在线观看宜春院 | 亚洲成av人片www| 亚洲成人激情综合网| 裸体在线国模精品偷拍| 国产精品一区三区| 99精品国产一区二区三区不卡| 99re这里只有精品视频首页| 欧美性生活一区| 在线不卡中文字幕播放| 久久亚洲影视婷婷| 亚洲人成精品久久久久久| 亚洲成人一区二区| 韩国av一区二区| 97久久精品人人做人人爽| 欧美日韩精品欧美日韩精品一 | 国产精品网站在线| 一区二区久久久久| 精品一区精品二区高清| 成人国产视频在线观看| 欧美精品乱码久久久久久| 精品国产伦一区二区三区免费| 国产精品全国免费观看高清| 午夜精品一区在线观看| 国产精品一二三四五| 欧洲亚洲国产日韩| 久久一区二区视频| 亚洲一区二区三区视频在线播放 | 亚洲大片免费看| 国产成人福利片| 欧美区一区二区三区| 国产拍揄自揄精品视频麻豆| 一片黄亚洲嫩模| 成人av电影免费观看| 日韩欧美一区二区不卡| 亚洲黄色录像片| 成人午夜视频免费看| 日韩一区二区三区在线观看| 亚洲精品免费看| 丁香桃色午夜亚洲一区二区三区| 欧美精品久久99| 亚洲美女在线一区| 成人免费观看av| 久久综合色天天久久综合图片| 亚洲成人动漫在线免费观看| 成人高清视频在线| 国产日韩av一区二区| 麻豆精品一区二区av白丝在线| 欧美日韩一级二级三级| 亚洲人成在线观看一区二区| 国产99久久久久| 久久精品人人做| 国产制服丝袜一区| 日韩精品一区二区三区中文不卡| 日韩专区欧美专区| 91精品国产91久久综合桃花| 天堂蜜桃一区二区三区| 欧美视频在线观看一区| 洋洋成人永久网站入口| 一本在线高清不卡dvd| ㊣最新国产の精品bt伙计久久| 成人蜜臀av电影| 国产精品成人免费精品自在线观看| 国产高清精品网站| 国产三级久久久| 成人丝袜视频网| 一区免费观看视频| 色视频欧美一区二区三区| 亚洲婷婷综合久久一本伊一区| 91女人视频在线观看| 亚洲精品成人悠悠色影视| 91久久精品日日躁夜夜躁欧美| 亚洲理论在线观看| 欧美三级午夜理伦三级中视频| 亚洲午夜国产一区99re久久| 欧美日本在线播放| 免费成人深夜小野草| 亚洲精品一区二区三区福利 | 欧美日韩三级一区| 天堂资源在线中文精品| 欧美一区二区观看视频| 国产一区二区三区久久久| 亚洲国产精品精华液ab| 99久久免费精品高清特色大片| 亚洲综合激情另类小说区| 91精品免费在线| 高清不卡一区二区在线| 夜夜精品浪潮av一区二区三区| 91精品国产色综合久久久蜜香臀| 久久国产精品72免费观看| 日本一区二区三区四区| 欧美三级蜜桃2在线观看| 日本中文字幕一区二区视频 | 亚洲黄色小说网站| 日韩欧美视频一区| av在线这里只有精品| 亚洲成人精品一区| 亚洲国产精品二十页| 在线观看91精品国产入口| 捆绑调教美女网站视频一区| 国产精品国产自产拍在线| 欧美一区二区三区在线视频| 成人精品国产一区二区4080| 亚洲成人av免费| 国产精品久久久久久久久果冻传媒 | 亚洲一区在线看| 精品va天堂亚洲国产| 91久久精品一区二区三| 国产精品18久久久久久久久久久久 | 欧美在线视频日韩| 国产一区二区三区美女| 亚洲二区在线观看| 国产日韩欧美综合一区| 欧美一区二区黄| 在线精品观看国产| 成人av网址在线| 国产美女久久久久| 天堂一区二区在线免费观看| 亚洲欧洲中文日韩久久av乱码| 久久网站最新地址| 日韩欧美一二三| 91精品中文字幕一区二区三区| 91一区二区在线观看| 国产呦萝稀缺另类资源| 蜜臀av性久久久久蜜臀aⅴ流畅 | 色悠悠久久综合| 国产99久久久国产精品免费看| 久久精品国产免费| 另类小说视频一区二区| 日本女优在线视频一区二区| 亚洲成av人片在线观看| 亚洲在线一区二区三区| 亚洲乱码国产乱码精品精的特点| 国产精品免费免费| 亚洲国产精品成人久久综合一区| 日韩一区二区免费高清| 91精品国产综合久久久久久久久久| 欧美亚洲综合色| 欧美性猛交xxxx黑人交| 欧美日韩一二三区| 91精品婷婷国产综合久久性色| 欧美美女视频在线观看| 欧美精品高清视频| 精品少妇一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 欧美一级国产精品| 精品国产123| 国产女人aaa级久久久级| 中文字幕精品综合| 亚洲欧美怡红院| 亚洲一区二区3| 视频一区中文字幕国产| 午夜精品一区二区三区三上悠亚| 天天综合日日夜夜精品| 日韩激情中文字幕| 激情综合网av| 成人免费观看男女羞羞视频| 91久久精品一区二区三区| 欧美精品自拍偷拍| 日韩一区二区三区精品视频| 欧美精品一区二区三区很污很色的| 久久久久久久久久久久久久久99| 中文字幕第一区第二区| 亚洲精品乱码久久久久久久久| 亚洲va欧美va国产va天堂影院| 蜜臀av性久久久久蜜臀av麻豆| 国产在线精品国自产拍免费| 91香蕉视频在线| 91麻豆精品国产91久久久久久久久 | 欧美午夜一区二区三区免费大片| 91精品国产欧美一区二区成人| www欧美成人18+| 一区二区在线观看免费| 日本91福利区| 成人美女视频在线看| 777奇米四色成人影色区| 国产精品丝袜91| 天天操天天综合网| 成人av网址在线| 日韩一卡二卡三卡四卡| 中文字幕中文在线不卡住| 日本欧美在线观看| 不卡电影免费在线播放一区| 欧美一级片在线观看| 综合在线观看色| 韩国毛片一区二区三区| 欧美性感一类影片在线播放| 欧美国产一区二区|