Skip to content

Commit 4faa814

Browse files
committed
Disable implicit join generation for implied entity joins
1 parent 502d243 commit 4faa814

File tree

6 files changed

+21
-13
lines changed

6 files changed

+21
-13
lines changed

src/NHibernate.Test/Async/NHSpecificTest/NH1444/Fixture.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ public async Task BugAsync()
3737
var message = ls.GetWholeLog();
3838
var paramFormatter = (ISqlParameterFormatter)Sfi.ConnectionProvider.Driver;
3939
Assert.That(message, Does.Contain(
40-
"xchild0_.ParentId=xparent1_.Id and (" +
41-
$"{paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " +
42-
$"xparent1_.A<{paramFormatter.GetParameterName(1)})"));
40+
"on xchild0_.ParentId=xparent1_.Id").And.Contain(
41+
$"where {paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " +
42+
$"xparent1_.A<{paramFormatter.GetParameterName(1)};"));
4343
}
4444
}
4545
}

src/NHibernate.Test/NHSpecificTest/NH1444/Fixture.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ public void Bug()
2626
var message = ls.GetWholeLog();
2727
var paramFormatter = (ISqlParameterFormatter)Sfi.ConnectionProvider.Driver;
2828
Assert.That(message, Does.Contain(
29-
"xchild0_.ParentId=xparent1_.Id and (" +
30-
$"{paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " +
31-
$"xparent1_.A<{paramFormatter.GetParameterName(1)})"));
29+
"on xchild0_.ParentId=xparent1_.Id").And.Contain(
30+
$"where {paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " +
31+
$"xparent1_.A<{paramFormatter.GetParameterName(1)};"));
3232
}
3333
}
3434
}

src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ public JoinSequence CreateCollectionJoinSequence(IQueryableCollection collPersis
319319
{
320320
JoinSequence joinSequence = CreateJoinSequence();
321321
joinSequence.SetRoot(collPersister, collectionName);
322-
joinSequence.SetUseThetaStyle(true); // TODO: figure out how this should be set.
322+
joinSequence.SetUseThetaStyle(false); // TODO: figure out how this should be set.
323323

324324
///////////////////////////////////////////////////////////////////////////////
325325
// This was the reason for failures regarding INDEX_OP and subclass joins on

src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ private void DereferenceEntityJoin(string classAlias, EntityType propertyType, b
519519
// If this is an implied join in a from element, then use the impled join type which is part of the
520520
// tree parser's state (set by the gramamar actions).
521521
JoinSequence joinSequence = SessionFactoryHelper
522-
.CreateJoinSequence( impliedJoin, propertyType, tableAlias, _joinType, joinColumns );
522+
.CreateJoinSequence(false, propertyType, tableAlias, _joinType, joinColumns);
523523

524524
var factory = new FromElementFactory(
525525
currentFromClause,

src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ private FromElement CreateFromElementInSubselect(
122122

123123
string tableAlias = correlatedSubselect ? fromElement.TableAlias : null;
124124

125+
//To properly generete subselect implicit join is required by SqlGenerator
126+
if (fromElement.IsImplied)
127+
fromElement.JoinSequence.SetUseThetaStyle(true);
128+
125129
// If the from element isn't in the same clause, create a new from element.
126130
if (fromElement.FromClause != _fromClause)
127131
{
@@ -190,17 +194,20 @@ public FromElement CreateCollection(IQueryableCollection queryableCollection,
190194
{
191195
// A collection of entities...
192196
elem = CreateEntityAssociation(role, roleAlias, joinType);
197+
//TODO: Investigate why not implicit indexed join is incorrectly generated and get rid of it
198+
if (indexed && elem.IsImplied)
199+
elem.JoinSequence.SetUseThetaStyle(true);
193200
}
194201
else if (elementType.IsComponentType)
195202
{
196203
// A collection of components...
197-
JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType);
204+
JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType, indexed);
198205
elem = CreateCollectionJoin(joinSequence, roleAlias);
199206
}
200207
else
201208
{
202209
// A collection of scalar elements...
203-
JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType);
210+
JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType, indexed);
204211
elem = CreateCollectionJoin(joinSequence, roleAlias);
205212
}
206213

@@ -429,15 +436,16 @@ private FromElement CreateManyToMany(
429436
return elem;
430437
}
431438

432-
private JoinSequence CreateJoinSequence(string roleAlias, JoinType joinType)
439+
//TODO: Investigate why not implicit indexed join is incorrectly generated and get rid of implicitJoin parameter
440+
private JoinSequence CreateJoinSequence(string roleAlias, JoinType joinType, bool implicitJoin = false)
433441
{
434442
SessionFactoryHelperExtensions sessionFactoryHelper = _fromClause.SessionFactoryHelper;
435443
string[] joinColumns = Columns;
436444
if (_collectionType == null)
437445
{
438446
throw new InvalidOperationException("collectionType is null!");
439447
}
440-
return sessionFactoryHelper.CreateJoinSequence(_implied, _collectionType, roleAlias, joinType, joinColumns);
448+
return sessionFactoryHelper.CreateJoinSequence(implicitJoin, _collectionType, roleAlias, joinType, joinColumns);
441449
}
442450

443451
private FromElement CreateJoin(

src/NHibernate/Hql/CollectionSubqueryFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Text;
44
using NHibernate.Engine;
55
using NHibernate.SqlCommand;
6-
using NHibernate.Util;
76

87
namespace NHibernate.Hql
98
{
@@ -16,6 +15,7 @@ public static string CreateCollectionSubquery(
1615
{
1716
try
1817
{
18+
joinSequence.SetUseThetaStyle(true);
1919
JoinFragment join = joinSequence.ToJoinFragment(enabledFilters, true);
2020
return new StringBuilder()
2121
.Append("select ")

0 commit comments

Comments
 (0)