⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hqlsqlwalker.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
			insertStatement.getIntoClause().prependVersionColumnSpec();		}		if ( insertStatement.getIntoClause().isDiscriminated() ) {			String sqlValue = insertStatement.getIntoClause().getQueryable().getDiscriminatorSQLValue();			AST discrimValue = getASTFactory().create( HqlSqlTokenTypes.SQL_TOKEN, sqlValue );			insertStatement.getSelectClause().addChild( discrimValue );		}	}	private boolean isDatabaseGeneratedTimestamp(Type type) {		// currently only the Hibernate-supplied DbTimestampType is supported here		return DbTimestampType.class.isAssignableFrom( type.getClass() );	}	private boolean isIntegral(Type type) {		return Long.class.isAssignableFrom( type.getReturnedClass() )		       || Integer.class.isAssignableFrom( type.getReturnedClass() )		       || long.class.isAssignableFrom( type.getReturnedClass() )		       || int.class.isAssignableFrom( type.getReturnedClass() );	}	private void useSelectClause(AST select) throws SemanticException {		selectClause = ( SelectClause ) select;		selectClause.initializeExplicitSelectClause( currentFromClause );	}	private void createSelectClauseFromFromClause(QueryNode qn) throws SemanticException {		AST select = astFactory.create( SELECT_CLAUSE, "{derived select clause}" );		AST sibling = qn.getFromClause();		qn.setFirstChild( select );		select.setNextSibling( sibling );		selectClause = ( SelectClause ) select;		selectClause.initializeDerivedSelectClause( currentFromClause );		if ( log.isDebugEnabled() ) {			log.debug( "Derived SELECT clause created." );		}	}	protected void resolve(AST node) throws SemanticException {		if ( node != null ) {			// This is called when it's time to fully resolve a path expression.			ResolvableNode r = ( ResolvableNode ) node;			if ( isInFunctionCall() ) {				r.resolveInFunctionCall( false, true );			}			else {				r.resolve( false, true );	// Generate implicit joins, only if necessary.			}		}	}	protected void resolveSelectExpression(AST node) throws SemanticException {		// This is called when it's time to fully resolve a path expression.		int type = node.getType();		switch ( type ) {			case DOT:				DotNode dot = ( DotNode ) node;				dot.resolveSelectExpression();				break;			case ALIAS_REF:				// Notify the FROM element that it is being referenced by the select.				FromReferenceNode aliasRefNode = ( FromReferenceNode ) node;				//aliasRefNode.resolve( false, false, aliasRefNode.getText() ); //TODO: is it kosher to do it here?				aliasRefNode.resolve( false, false ); //TODO: is it kosher to do it here?				FromElement fromElement = aliasRefNode.getFromElement();				if ( fromElement != null ) {					fromElement.setIncludeSubclasses( true );				}			default:				break;		}	}	protected void beforeSelectClause() throws SemanticException {		// Turn off includeSubclasses on all FromElements.		FromClause from = getCurrentFromClause();		List fromElements = from.getFromElements();		for ( Iterator iterator = fromElements.iterator(); iterator.hasNext(); ) {			FromElement fromElement = ( FromElement ) iterator.next();			fromElement.setIncludeSubclasses( false );		}	}	protected AST generatePositionalParameter(AST inputNode) throws SemanticException {		if ( namedParameters.size() > 0 ) {			throw new SemanticException( "cannot define positional parameter after any named parameters have been defined" );		}		ParameterNode parameter = ( ParameterNode ) astFactory.create( PARAM, "?" );		PositionalParameterSpecification paramSpec = new PositionalParameterSpecification(				( ( Node ) inputNode ).getLine(),		        ( ( Node ) inputNode ).getColumn(),				positionalParameterCount++		);		parameter.setHqlParameterSpecification( paramSpec );		parameters.add( paramSpec );		return parameter;	}	protected AST generateNamedParameter(AST delimiterNode, AST nameNode) throws SemanticException {		String name = nameNode.getText();		trackNamedParameterPositions( name );		// create the node initially with the param name so that it shows		// appropriately in the "original text" attribute		ParameterNode parameter = ( ParameterNode ) astFactory.create( NAMED_PARAM, name );		parameter.setText( "?" );		NamedParameterSpecification paramSpec = new NamedParameterSpecification(				( ( Node ) delimiterNode ).getLine(),		        ( ( Node ) delimiterNode ).getColumn(),				name		);		parameter.setHqlParameterSpecification( paramSpec );		parameters.add( paramSpec );		return parameter;	}	private void trackNamedParameterPositions(String name) {		Integer loc = new Integer( parameterCount++ );		Object o = namedParameters.get( name );		if ( o == null ) {			namedParameters.put( name, loc );		}		else if ( o instanceof Integer ) {			ArrayList list = new ArrayList( 4 );			list.add( o );			list.add( loc );			namedParameters.put( name, list );		}		else {			( ( ArrayList ) o ).add( loc );		}	}	protected void processConstant(AST constant) throws SemanticException {		literalProcessor.processConstant( constant, true );  // Use the delegate, resolve identifiers as FROM element aliases.	}	protected void processBoolean(AST constant) throws SemanticException {		literalProcessor.processBoolean( constant );  // Use the delegate.	}	protected void processNumericLiteral(AST literal) {		literalProcessor.processNumeric( literal );	}	protected void processIndex(AST indexOp) throws SemanticException {		IndexNode indexNode = ( IndexNode ) indexOp;		indexNode.resolve( true, true );	}	protected void processFunction(AST functionCall, boolean inSelect) throws SemanticException {		MethodNode methodNode = ( MethodNode ) functionCall;		methodNode.resolve( inSelect );	}	protected void processConstructor(AST constructor) throws SemanticException {		ConstructorNode constructorNode = ( ConstructorNode ) constructor;		constructorNode.prepare();	}    protected void setAlias(AST selectExpr, AST ident) {        ((SelectExpression) selectExpr).setAlias(ident.getText());    }	/**	 * Returns the locations of all occurrences of the named parameter.	 */	public int[] getNamedParameterLocations(String name) throws QueryException {		Object o = namedParameters.get( name );		if ( o == null ) {			QueryException qe = new QueryException( QueryTranslator.ERROR_NAMED_PARAMETER_DOES_NOT_APPEAR + name );			qe.setQueryString( queryTranslatorImpl.getQueryString() );			throw qe;		}		if ( o instanceof Integer ) {			return new int[]{( ( Integer ) o ).intValue()};		}		else {			return ArrayHelper.toIntArray( ( ArrayList ) o );		}	}	public void addQuerySpaces(Serializable[] spaces) {		for ( int i = 0; i < spaces.length; i++ ) {			querySpaces.add( spaces[i] );		}	}	public Type[] getReturnTypes() {		return selectClause.getQueryReturnTypes();	}	public String[] getReturnAliases() {		return selectClause.getQueryReturnAliases();	}	public SelectClause getSelectClause() {		return selectClause;	}		public FromClause getFinalFromClause() {		FromClause top = currentFromClause;		while ( top.getParentFromClause() != null ) {			top = top.getParentFromClause();		}		return top;	}	public boolean isShallowQuery() {		// select clauses for insert statements should alwasy be treated as shallow		return getStatementType() == INSERT || queryTranslatorImpl.isShallowQuery();	}	public Map getEnabledFilters() {		return queryTranslatorImpl.getEnabledFilters();	}	public LiteralProcessor getLiteralProcessor() {		return literalProcessor;	}	public ASTPrinter getASTPrinter() {		return printer;	}	public ArrayList getParameters() {		return parameters;	}	public int getNumberOfParametersInSetClause() {		return numberOfParametersInSetClause;	}	protected void evaluateAssignment(AST eq) throws SemanticException {		prepareLogicOperator( eq );		Queryable persister = getCurrentFromClause().getFromElement().getQueryable();		evaluateAssignment( eq, persister, -1 );	}	private void evaluateAssignment(AST eq, Queryable persister, int targetIndex) {		if ( persister.isMultiTable() ) {			// no need to even collect this information if the persister is considered multi-table			AssignmentSpecification specification = new AssignmentSpecification( eq, persister );			if ( targetIndex >= 0 ) {				assignmentSpecifications.add( targetIndex, specification );			}			else {				assignmentSpecifications.add( specification );			}			numberOfParametersInSetClause += specification.getParameters().length;		}	}	public ArrayList getAssignmentSpecifications() {		return assignmentSpecifications;	}	protected AST createIntoClause(String path, AST propertySpec) throws SemanticException {		Queryable persister = ( Queryable ) getSessionFactoryHelper().requireClassPersister( path );		IntoClause intoClause = ( IntoClause ) getASTFactory().create( INTO, persister.getEntityName() );		intoClause.setFirstChild( propertySpec );		intoClause.initialize( persister );		addQuerySpaces( persister.getQuerySpaces() );		return intoClause;	}	protected void prepareVersioned(AST updateNode, AST versioned) throws SemanticException {		UpdateStatement updateStatement = ( UpdateStatement ) updateNode;		FromClause fromClause = updateStatement.getFromClause();		if ( versioned != null ) {			// Make sure that the persister is versioned			Queryable persister = fromClause.getFromElement().getQueryable();			if ( !persister.isVersioned() ) {				throw new SemanticException( "increment option specified for update of non-versioned entity" );			}			VersionType versionType = persister.getVersionType();			if ( versionType instanceof UserVersionType ) {				throw new SemanticException( "user-defined version types not supported for increment option" );			}			AST eq = getASTFactory().create( HqlSqlTokenTypes.EQ, "=" );			AST versionPropertyNode = generateVersionPropertyNode( persister );			eq.setFirstChild( versionPropertyNode );			AST versionIncrementNode = null;			if ( Date.class.isAssignableFrom( versionType.getReturnedClass() ) ) {				versionIncrementNode = getASTFactory().create( HqlSqlTokenTypes.PARAM, "?" );				ParameterSpecification paramSpec = new VersionTypeSeedParameterSpecification( versionType );				( ( ParameterNode ) versionIncrementNode ).setHqlParameterSpecification( paramSpec );				parameters.add( 0, paramSpec );			}			else {				// Not possible to simply re-use the versionPropertyNode here as it causes				// OOM errors due to circularity :(				versionIncrementNode = getASTFactory().create( HqlSqlTokenTypes.PLUS, "+" );				versionIncrementNode.setFirstChild( generateVersionPropertyNode( persister ) );				versionIncrementNode.addChild( getASTFactory().create( HqlSqlTokenTypes.IDENT, "1" ) );			}			eq.addChild( versionIncrementNode );			evaluateAssignment( eq, persister, 0 );			AST setClause = updateStatement.getSetClause();			AST currentFirstSetElement = setClause.getFirstChild();			setClause.setFirstChild( eq );			eq.setNextSibling( currentFirstSetElement );		}	}	private AST generateVersionPropertyNode(Queryable persister) throws SemanticException {		String versionPropertyName = persister.getPropertyNames()[ persister.getVersionProperty() ];		AST versionPropertyRef = getASTFactory().create( HqlSqlTokenTypes.IDENT, versionPropertyName );		AST versionPropertyNode = lookupNonQualifiedProperty( versionPropertyRef );		resolve( versionPropertyNode );		return versionPropertyNode;	}	protected void prepareLogicOperator(AST operator) throws SemanticException {		( ( OperatorNode ) operator ).initialize();	}	protected void prepareArithmeticOperator(AST operator) throws SemanticException {		( ( OperatorNode ) operator ).initialize();	}	public static void panic() {		throw new QueryException( "TreeWalker: panic" );	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -