final UpdateStatement updateStatement = (UpdateStatement) walker.getAST(); final FromElement fromElement = updateStatement.getFromClause().getFromElement(); update.setComment( "bulk update" ); final List<AssignmentSpecification> assignmentSpecifications = walker.getAssignmentSpecifications(); for ( AssignmentSpecification assignmentSpecification : assignmentSpecifications ) { if ( assignmentSpecification.affectsTable( tableNames[tableIndex] ) ) {
AST with) throws SemanticException { boolean fetch = fetchNode != null; if ( fetch && isSubQuery() ) { throw new QueryException( "fetch not allowed in subquery from-elements" ); final EntityPersister entityJoinReferencedPersister = resolveEntityJoinReferencedPersister( path ); if ( entityJoinReferencedPersister != null ) { final EntityJoinFromElement join = createEntityJoin( entityJoinReferencedPersister, alias, getCurrentFromClause(), dot.getLhs().getFromElement(), dot.getPropertyPath(), throw new SemanticException( "with-clause not allowed on fetched associations; use filters" ); handleWithFragment( fromElement, with ); LOG.debug( "createFromJoinElement() : " + getASTPrinter().showAsString( fromElement, "-- join tree --" ) );
private HqlSqlWalker analyze(HqlParser parser, String collectionRole) throws QueryException, RecognitionException { final HqlSqlWalker w = new HqlSqlWalker( this, factory, parser, tokenReplacements, collectionRole ); final AST hqlAst = parser.getAST(); // Transform the tree. w.statement( hqlAst ); if ( LOG.isDebugEnabled() ) { LOG.debug( TokenPrinters.SQL_TOKEN_PRINTER.showAsString( w.getAST(), "--- SQL AST ---" ) ); } w.getParseErrorHandler().throwQueryException(); return w; }
@Override 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; }
private StatementExecutor buildAppropriateStatementExecutor(HqlSqlWalker walker) { final Statement statement = (Statement) walker.getAST(); if ( walker.getStatementType() == HqlSqlTokenTypes.DELETE ) { final FromElement fromElement = walker.getFinalFromClause().getFromElement(); final Queryable persister = fromElement.getQueryable(); if ( persister.isMultiTable() ) { else if ( walker.getStatementType() == HqlSqlTokenTypes.UPDATE ) { final FromElement fromElement = walker.getFinalFromClause().getFromElement(); final Queryable persister = fromElement.getQueryable(); if ( persister.isMultiTable() ) { else if ( walker.getStatementType() == HqlSqlTokenTypes.INSERT ) { return new BasicExecutor( walker, ( (InsertStatement) statement ).getIntoClause().getQueryable() );
@Override public UpdateHandler buildUpdateHandler(SessionFactoryImplementor factory, HqlSqlWalker walker) { final UpdateStatement updateStatement = (UpdateStatement) walker.getAST(); final FromElement fromElement = updateStatement.getFromClause().getFromElement(); final Queryable targetedPersister = fromElement.getQueryable(); return new TableBasedUpdateHandlerImpl( factory, walker, getIdTableInfo( targetedPersister ) ) { @Override protected void releaseFromUse(Queryable persister, SharedSessionContractImplementor session) { if ( afterUseAction == AfterUseAction.NONE ) { return; } // clean up our id-table rows cleanUpRows( getIdTableInfo( persister ).getQualifiedIdTableName(), session ); } }; }
public MultiTableUpdateExecutor(HqlSqlWalker walker) { super(walker, null); if ( !walker.getSessionFactoryHelper().getFactory().getDialect().supportsTemporaryTables() ) { throw new HibernateException( "cannot doAfterTransactionCompletion multi-table updates using dialect not supporting temp tables" ); UpdateStatement updateStatement = ( UpdateStatement ) walker.getAST(); FromElement fromElement = updateStatement.getFromClause().getFromElement(); String bulkTargetAlias = fromElement.getTableAlias(); List assignmentSpecifications = walker.getAssignmentSpecifications();
public BasicExecutor(HqlSqlWalker walker, Queryable persister) { this.persister = persister; try { SqlGenerator gen = new SqlGenerator( walker.getSessionFactoryHelper().getFactory() ); gen.statement( walker.getAST() ); sql = gen.getSQL(); gen.getParseErrorHandler().throwQueryException(); parameterSpecifications = gen.getCollectedParameters(); } catch ( RecognitionException e ) { throw QuerySyntaxException.convert( e ); } }
public void resolve(boolean generateJoin, boolean implicitJoin, String classAlias, AST parent, AST parentPredicate) { if (!isResolved()) { if ( getWalker().getCurrentFromClause().isFromElementAlias( getText() ) ) { FromElement fromElement = getWalker().getCurrentFromClause().getFromElement( getText() ); if ( fromElement.getQueryableCollection() != null && fromElement.getQueryableCollection().getElementType().isComponentType() ) { if ( getWalker().isInSelect() ) { && ( getWalker().getAST() instanceof AbstractMapComponentNode || getWalker().getAST() instanceof IndexNode ) && getWalker().getCurrentFromClause().isFromElementAlias( getOriginalText() ) ) { getWalker().getLiteralProcessor().processConstant(this, false);
sqlAst = (Statement) w.getAST(); queryLoader = new QueryLoader( this, factory, w.getSelectClause() );
String joinPath = getPath(); if ( impliedJoin && getWalker().isInFrom() ) { joinType = getWalker().getImpliedJoinType(); FromClause currentFromClause = getWalker().getCurrentFromClause(); FromElement elem = currentFromClause.findJoinByPath( joinPath ); joinSequence, fetch, getWalker().isInFrom(), propertyType, role, getWalker().addQuerySpaces( elem.getEntityPersister().getQuerySpaces() );
AST with) throws SemanticException { boolean fetch = fetchNode != null; if ( fetch && isSubQuery() ) { throw new QueryException( "fetch not allowed in subquery from-elements" ); if ( dot.getDataType() != null && dot.getDataType().isComponentType() ) { FromElementFactory factory = new FromElementFactory( getCurrentFromClause(), dot.getLhs().getFromElement(), dot.getPropertyPath(), throw new SemanticException( "with-clause not allowed on fetched associations; use filters" ); handleWithFragment( fromElement, with ); getASTPrinter().showAsString(fromElement, "-- join tree --"));
private void handleWithFragment(FromElement fromElement, AST hqlWithNode) throws SemanticException { try { withClause( hqlWithNode ); AST hqlSqlWithNode = returnAST; if ( LOG.isDebugEnabled() ) { LOG.debug( "handleWithFragment() : " + getASTPrinter().showAsString( hqlSqlWithNode, "-- with clause --" ) ); } WithClauseVisitor visitor = new WithClauseVisitor( fromElement, queryTranslatorImpl ); NodeTraverser traverser = new NodeTraverser( visitor ); traverser.traverseDepthFirst( hqlSqlWithNode ); SqlGenerator sql = new SqlGenerator( getSessionFactoryHelper().getFactory() ); sql.whereExpr( hqlSqlWithNode.getFirstChild() ); fromElement.setWithClauseFragment( "(" + sql.getSQL() + ")" ); } catch (SemanticException e) { throw e; } catch (InvalidWithClauseException e) { throw e; } catch (Exception e) { throw new SemanticException( e.getMessage() ); } }
FromClause currentFromClause = getWalker().getCurrentFromClause(); if ( getWalker().getStatementType() != SqlTokenTypes.SELECT ) { if ( isFromElementUpdateOrDeleteRoot( lhsFromElement ) ) { if ( getWalker().getStatementType() != SqlTokenTypes.INSERT ) { final Queryable persister = lhsFromElement.getQueryable(); if ( persister.isMultiTable() ) { EntityPersister entityPersister = elem.getEntityPersister(); if ( entityPersister != null ) { getWalker().addQuerySpaces( entityPersister.getQuerySpaces() ); getWalker().addQuerySpaces( queryableCollection.getCollectionSpaces() ); // Always add the collection's query spaces.
sqlAST.getWalker().getASTPrinter().showAst(sqlAST.getWalker().getAST(), System.out);
final List<AssignmentSpecification> assignmentSpecifications = walker().getAssignmentSpecifications(); for ( AssignmentSpecification assignmentSpecification : assignmentSpecifications ) { if ( assignmentSpecification.affectsTable( tableNames[tableIndex] ) ) {
private String getColumnPositionsString(int scalarColumnIndex ) { int startPosition = getWalker().getSelectClause().getColumnNamesStartPosition( scalarColumnIndex ); StringBuilder buf = new StringBuilder(); int nColumns = getWalker().getSelectClause().getColumnNames()[ scalarColumnIndex ].length; for ( int i = startPosition; i < startPosition + nColumns; i++ ) { if ( i > startPosition ) { buf.append( ", " ); } buf.append( i ); } return buf.toString(); }
private void handleElements(FromReferenceNode collectionNode, String propertyName) { FromElement collectionFromElement = collectionNode.getFromElement(); QueryableCollection queryableCollection = collectionFromElement.getQueryableCollection(); String path = collectionNode.getPath() + "[]." + propertyName; LOG.debugf( "Creating elements for %s", path ); fromElement = collectionFromElement; if ( !collectionFromElement.isCollectionOfValuesOrComponents() ) { getWalker().addQuerySpaces( queryableCollection.getElementPersister().getQuerySpaces() ); } setDataType( queryableCollection.getElementType() ); selectColumns = collectionFromElement.toColumns( fromElement.getTableAlias(), propertyName, inSelect ); }
public static MapKeyEntityFromElement buildKeyJoin(FromElement collectionFromElement) { final HqlSqlWalker walker = collectionFromElement.getWalker(); final SessionFactoryHelper sfh = walker.getSessionFactoryHelper(); final SessionFactoryImplementor sf = sfh.getFactory(); final EntityPersister indexEntityPersister = (EntityPersister) indexEntityType.getAssociatedJoinable( sf ); final String rhsAlias = walker.getAliasGenerator().createName( indexEntityPersister.getEntityName() ); final boolean useThetaJoin = collectionFromElement.getJoinSequence().isThetaStyle(); join.setUseWhereFragment( collectionFromElement.useWhereFragment() ); walker.addQuerySpaces( indexEntityPersister.getQuerySpaces() );
getWalker().getCurrentFromClause(), getFromElement(), propertyName, FromElement elem = factory.createCollection(queryableCollection, role, joinType, fetch, true); setFromElement(elem); getWalker().addQuerySpaces(queryableCollection.getCollectionSpaces()); // Always add the collection's query spaces.