public TableBasedUpdateHandlerImpl( SessionFactoryImplementor factory, HqlSqlWalker walker, String catalog, String schema) { super( factory, walker, catalog, schema ); UpdateStatement updateStatement = ( UpdateStatement ) walker.getAST(); FromElement fromElement = updateStatement.getFromClause().getFromElement(); this.targetedPersister = fromElement.getQueryable(); final String bulkTargetAlias = fromElement.getTableAlias(); final ProcessedWhereClause processedWhereClause = processWhereClause( updateStatement.getWhereClause() ); this.idSelectParameterSpecifications = processedWhereClause.getIdSelectParameterSpecifications(); this.idInsertSelect = generateIdInsertSelect( targetedPersister, bulkTargetAlias, processedWhereClause ); log.tracev( "Generated ID-INSERT-SELECT SQL (multi-table update) : {0}", idInsertSelect ); String[] tableNames = targetedPersister.getConstraintOrderedTableNameClosure(); String[][] columnNames = targetedPersister.getContraintOrderedTableKeyColumnClosure(); String idSubselect = generateIdSubselect( targetedPersister ); updates = new String[tableNames.length]; assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][]; for ( int tableIndex = 0; tableIndex < tableNames.length; tableIndex++ ) { boolean affected = false; final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>(); final Update update = new Update( factory().getDialect() ) .setTableName( tableNames[tableIndex] ) .setWhere( "(" + StringHelper.join( ", ", columnNames[tableIndex] ) + ") IN (" + idSubselect + ")" ); if ( factory().getSettings().isCommentsEnabled() ) { update.setComment( "bulk update" ); } final List<AssignmentSpecification> assignmentSpecifications = walker.getAssignmentSpecifications(); for ( AssignmentSpecification assignmentSpecification : assignmentSpecifications ) { if ( assignmentSpecification.affectsTable( tableNames[tableIndex] ) ) { affected = true; update.appendAssignmentFragment( assignmentSpecification.getSqlAssignmentFragment() ); if ( assignmentSpecification.getParameters() != null ) { for ( int paramIndex = 0; paramIndex < assignmentSpecification.getParameters().length; paramIndex++ ) { parameterList.add( assignmentSpecification.getParameters()[paramIndex] ); } } } } if ( affected ) { updates[tableIndex] = update.toStatementString(); assignmentParameterSpecifications[tableIndex] = parameterList.toArray( new ParameterSpecification[parameterList.size()] ); } } }
@Override protected void postProcessUpdate(AST update) throws SemanticException { UpdateStatement updateStatement = (UpdateStatement) update; postProcessDML( updateStatement ); }
@Override 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 ( isTimestampBasedVersion( versionType ) ) { 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 ); } }
public CTEBasedUpdateHandlerImpl(SessionFactoryImplementor factory, HqlSqlWalker walker, String catalog, String schema) { super(factory, walker, catalog, schema); UpdateStatement updateStatement = (UpdateStatement) walker.getAST(); FromElement fromElement = updateStatement.getFromClause() .getFromElement(); this.targetedPersister = fromElement.getQueryable(); final ProcessedWhereClause processedWhereClause = processWhereClause(updateStatement .getWhereClause()); this.idSelectParameterSpecifications = processedWhereClause .getIdSelectParameterSpecifications(); final String bulkTargetAlias = fromElement.getTableAlias(); this.idSelect = generateIdSelect(targetedPersister, bulkTargetAlias, processedWhereClause); String[] tableNames = targetedPersister .getConstraintOrderedTableNameClosure(); String[][] columnNames = targetedPersister .getContraintOrderedTableKeyColumnClosure(); String idSubselect = generateIdSubselect( targetedPersister); updates = new String[tableNames.length]; assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][]; for (int tableIndex = 0; tableIndex < tableNames.length; tableIndex++) { boolean affected = false; final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>(); final Update update = new Update( factory().getDialect()) .setTableName(tableNames[tableIndex]).setWhere( "(" + StringHelper.join( ", ", columnNames[tableIndex]) + ") IN (" + idSubselect + ")"); if (factory().getSettings().isCommentsEnabled()) { update.setComment("bulk update"); } final List<AssignmentSpecification> assignmentSpecifications = walker .getAssignmentSpecifications(); for (AssignmentSpecification assignmentSpecification : assignmentSpecifications) { if (assignmentSpecification .affectsTable(tableNames[tableIndex])) { affected = true; update.appendAssignmentFragment(assignmentSpecification .getSqlAssignmentFragment()); if (assignmentSpecification.getParameters() != null) { for (int paramIndex = 0; paramIndex < assignmentSpecification .getParameters().length; paramIndex++) { parameterList.add(assignmentSpecification .getParameters()[paramIndex]); } } } } if (affected) { updates[tableIndex] = update.toStatementString(); assignmentParameterSpecifications[tableIndex] = parameterList .toArray(new ParameterSpecification[parameterList .size()]); } } }
public CTEBasedUpdateHandlerImpl(SessionFactoryImplementor factory, HqlSqlWalker walker, String catalog, String schema) { super(factory, walker, catalog, schema); UpdateStatement updateStatement = (UpdateStatement) walker.getAST(); FromElement fromElement = updateStatement.getFromClause() .getFromElement(); this.targetedPersister = fromElement.getQueryable(); final ProcessedWhereClause processedWhereClause = processWhereClause(updateStatement .getWhereClause()); this.idSelectParameterSpecifications = processedWhereClause .getIdSelectParameterSpecifications(); final String bulkTargetAlias = fromElement.getTableAlias(); this.idSelect = generateIdSelect(targetedPersister, bulkTargetAlias, processedWhereClause); String[] tableNames = targetedPersister .getConstraintOrderedTableNameClosure(); String[][] columnNames = targetedPersister .getContraintOrderedTableKeyColumnClosure(); String idSubselect = generateIdSubselect(targetedPersister); updates = new String[tableNames.length]; assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][]; for (int tableIndex = 0; tableIndex < tableNames.length; tableIndex++) { boolean affected = false; final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>(); final Update update = new Update(factory().getDialect()) .setTableName(tableNames[tableIndex]).setWhere( "(" + StringHelper.join(", ", columnNames[tableIndex]) + ") IN (" + idSubselect + ")"); if (factory().getSettings().isCommentsEnabled()) { update.setComment("bulk update"); } final List<AssignmentSpecification> assignmentSpecifications = walker .getAssignmentSpecifications(); for (AssignmentSpecification assignmentSpecification : assignmentSpecifications) { if (assignmentSpecification .affectsTable(tableNames[tableIndex])) { affected = true; update.appendAssignmentFragment(assignmentSpecification .getSqlAssignmentFragment()); if (assignmentSpecification.getParameters() != null) { for (int paramIndex = 0; paramIndex < assignmentSpecification .getParameters().length; paramIndex++) { parameterList.add(assignmentSpecification .getParameters()[paramIndex]); } } } } if (affected) { updates[tableIndex] = update.toStatementString(); assignmentParameterSpecifications[tableIndex] = parameterList .toArray(new ParameterSpecification[parameterList .size()]); } } }