Make sure root virtual table group joins are rendered properly
This commit is contained in:
parent
b227475489
commit
8cf0265f8d
|
@ -3618,12 +3618,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
|
|||
clauseStack.push( Clause.FROM );
|
||||
String separator = NO_SEPARATOR;
|
||||
for ( TableGroup root : fromClause.getRoots() ) {
|
||||
// Skip virtual table group roots which we use for simple correlations
|
||||
if ( !( root instanceof VirtualTableGroup ) ) {
|
||||
appendSql( separator );
|
||||
renderRootTableGroup( root, null );
|
||||
separator = COMA_SEPARATOR;
|
||||
}
|
||||
separator = renderFromClauseRoot( root, separator );
|
||||
}
|
||||
}
|
||||
finally {
|
||||
|
@ -3632,6 +3627,23 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
|
|||
}
|
||||
}
|
||||
|
||||
private String renderFromClauseRoot(TableGroup root, String separator) {
|
||||
if ( root instanceof VirtualTableGroup ) {
|
||||
for ( TableGroupJoin tableGroupJoin : root.getTableGroupJoins() ) {
|
||||
separator = renderFromClauseRoot( tableGroupJoin.getJoinedGroup(), separator );
|
||||
}
|
||||
for ( TableGroupJoin tableGroupJoin : root.getNestedTableGroupJoins() ) {
|
||||
separator = renderFromClauseRoot( tableGroupJoin.getJoinedGroup(), separator );
|
||||
}
|
||||
}
|
||||
else {
|
||||
appendSql( separator );
|
||||
renderRootTableGroup( root, null );
|
||||
separator = COMA_SEPARATOR;
|
||||
}
|
||||
return separator;
|
||||
}
|
||||
|
||||
protected void renderRootTableGroup(TableGroup tableGroup, List<TableGroupJoin> tableGroupJoinCollector) {
|
||||
final LockMode effectiveLockMode = getEffectiveLockMode( tableGroup.getSourceAlias() );
|
||||
final boolean usesLockHint = renderPrimaryTableReference( tableGroup, effectiveLockMode );
|
||||
|
|
|
@ -119,4 +119,7 @@ public class CorrelatedTableGroup extends AbstractTableGroup {
|
|||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
public Consumer<Predicate> getJoinPredicateConsumer() {
|
||||
return joinPredicateConsumer;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,6 +71,34 @@ public class StandardVirtualTableGroup extends AbstractTableGroup implements Vir
|
|||
return underlyingTableGroup.getTableReferenceJoins();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTableGroupJoin(TableGroupJoin join) {
|
||||
super.addTableGroupJoin( join );
|
||||
registerPredicateOnCorrelatedTableGroup( join );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prependTableGroupJoin(NavigablePath navigablePath, TableGroupJoin join) {
|
||||
super.prependTableGroupJoin( navigablePath, join );
|
||||
registerPredicateOnCorrelatedTableGroup( join );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addNestedTableGroupJoin(TableGroupJoin join) {
|
||||
super.addNestedTableGroupJoin( join );
|
||||
registerPredicateOnCorrelatedTableGroup( join );
|
||||
}
|
||||
|
||||
private void registerPredicateOnCorrelatedTableGroup(TableGroupJoin join) {
|
||||
TableGroup tableGroup = underlyingTableGroup;
|
||||
while ( tableGroup instanceof StandardVirtualTableGroup ) {
|
||||
tableGroup = ( (StandardVirtualTableGroup) tableGroup ).underlyingTableGroup;
|
||||
}
|
||||
if ( tableGroup instanceof CorrelatedTableGroup ) {
|
||||
( (CorrelatedTableGroup) tableGroup ).getJoinPredicateConsumer().accept( join.getPredicate() );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableReference getTableReferenceInternal(
|
||||
NavigablePath navigablePath,
|
||||
|
|
Loading…
Reference in New Issue