Skip to content

Commit 782b301

Browse files
committed
Fixed .Union tagging; SessionTagInUnion test
1 parent 5d0b131 commit 782b301

6 files changed

Lines changed: 55 additions & 27 deletions

File tree

Orm/Xtensive.Orm.Tests/Linq/TagTest.cs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System;
88
using System.Collections.Generic;
99
using System.Linq;
10+
using System.Text.RegularExpressions;
1011
using System.Threading.Tasks;
1112
using NUnit.Framework;
1213
using Xtensive.Core;
@@ -48,7 +49,7 @@ public class TagType : Entity
4849
[Field(Length = 55, Nullable = false)]
4950
public string Name { get; set; }
5051

51-
[Field]
52+
[Field]
5253
public bool Active { get; set; }
5354
}
5455

@@ -386,7 +387,8 @@ public void TagInGrouping()
386387

387388
session.Events.DbCommandExecuting += SqlCapturer;
388389
foreach (var group in query)
389-
foreach (var groupItem in group.Items);
390+
foreach (var groupItem in group.Items)
391+
;
390392
session.Events.DbCommandExecuting -= SqlCapturer;
391393

392394
PrintList(allCommands);
@@ -403,7 +405,8 @@ public void TagInGrouping()
403405

404406
session.Events.DbCommandExecuting += SqlCapturer;
405407
foreach (var group in query)
406-
foreach (var groupItem in group.Items);
408+
foreach (var groupItem in group.Items)
409+
;
407410
session.Events.DbCommandExecuting -= SqlCapturer;
408411

409412
PrintList(allCommands);
@@ -420,7 +423,8 @@ public void TagInGrouping()
420423

421424
session.Events.DbCommandExecuting += SqlCapturer;
422425
foreach (var group in query)
423-
foreach (var groupItem in group.Items);
426+
foreach (var groupItem in group.Items)
427+
;
424428
session.Events.DbCommandExecuting -= SqlCapturer;
425429

426430
PrintList(allCommands);
@@ -438,7 +442,8 @@ public void TagInGrouping()
438442

439443
session.Events.DbCommandExecuting += SqlCapturer;
440444
foreach (var group in query)
441-
foreach (var groupItem in group.Items);
445+
foreach (var groupItem in group.Items)
446+
;
442447
session.Events.DbCommandExecuting -= SqlCapturer;
443448

444449
PrintList(allCommands);
@@ -456,7 +461,8 @@ public void TagInGrouping()
456461

457462
session.Events.DbCommandExecuting += SqlCapturer;
458463
foreach (var group in query)
459-
foreach (var groupItem in group.Items);
464+
foreach (var groupItem in group.Items)
465+
;
460466
session.Events.DbCommandExecuting -= SqlCapturer;
461467

462468
PrintList(allCommands);
@@ -477,7 +483,8 @@ public void TagInGrouping()
477483

478484
session.Events.DbCommandExecuting += SqlCapturer;
479485
foreach (var group in query1)
480-
foreach (var groupItem in group.Items);
486+
foreach (var groupItem in group.Items)
487+
;
481488
session.Events.DbCommandExecuting -= SqlCapturer;
482489

483490
PrintList(allCommands);
@@ -925,6 +932,29 @@ void SqlCapturer(object sender, DbCommandEventArgs args)
925932
}
926933
}
927934

935+
[Test]
936+
public void SessionTagInUnion()
937+
{
938+
var allCommands = new List<string>();
939+
940+
var session = Session.Demand();
941+
using var outermost = session.Tag("outermost");
942+
943+
using (var innerTx = session.OpenTransaction(TransactionOpenMode.New)) {
944+
session.Events.DbCommandExecuting += SqlCapturer;
945+
var left = session.Query.All<BusinessUnit>();
946+
var right = session.Query.All<BusinessUnit>();
947+
var result = left.Union(right).ToArray();
948+
session.Events.DbCommandExecuting -= SqlCapturer;
949+
950+
Assert.That(allCommands.Count, Is.EqualTo(1));
951+
Assert.AreEqual(Regex.Matches(allCommands[0], "outermost").Count, 1);
952+
}
953+
954+
void SqlCapturer(object sender, DbCommandEventArgs args) =>
955+
allCommands.Add(args.Command.CommandText);
956+
}
957+
928958
private static bool CheckTag(string query, string expectedComment, TagsLocation place)
929959
{
930960
return place switch {

Orm/Xtensive.Orm/Orm/Providers/CompilationService.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ public sealed class CompilationService
2020
private readonly Func<CompilerConfiguration, IPreCompiler> preCompilerProvider;
2121
private readonly Func<CompilerConfiguration, ICompiler, IPostCompiler> postCompilerProvider;
2222

23-
public CompilerConfiguration CreateConfiguration(Session session)
24-
{
25-
return new CompilerConfiguration {StorageNode = session.StorageNode};
26-
}
23+
public CompilerConfiguration CreateConfiguration(Session session) =>
24+
new CompilerConfiguration { StorageNode = session.StorageNode, Tags = session.Tags };
2725

2826
public ExecutableProvider Compile(CompilableProvider provider, CompilerConfiguration configuration)
2927
{

Orm/Xtensive.Orm/Orm/Providers/CompilerConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
// Created by: Denis Krjuchkov
55
// Created: 2012.02.26
66

7+
using System.Collections.Generic;
8+
79
namespace Xtensive.Orm.Providers
810
{
911
public sealed class CompilerConfiguration
1012
{
1113
public bool PrepareRequest { get; set; }
14+
public IReadOnlyList<string> Tags { get; init; }
1215

1316
internal StorageNode StorageNode { get; set; }
1417

Orm/Xtensive.Orm/Orm/Providers/DomainHandler.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ protected virtual IPreCompiler CreatePreCompiler(CompilerConfiguration configura
9898
applyCorrector,
9999
skipTakeCorrector,
100100
new RedundantColumnOptimizer(),
101-
new OrderingCorrector(ResolveOrderingDescriptor));
101+
new OrderingCorrector(ResolveOrderingDescriptor)) {
102+
Tags = configuration.Tags
103+
};
102104
}
103105

104106
/// <summary>

Orm/Xtensive.Orm/Orm/QueryEndpoint.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,7 @@ public sealed class QueryEndpoint
6363
public IQueryable<T> All<T>()
6464
where T : class, IEntity
6565
{
66-
var result = Provider.CreateQuery<T>(BuildRootExpression(typeof(T)));
67-
if (session.Tags != null) {
68-
foreach (var tag in session.Tags) {
69-
result = result.Tag(tag);
70-
}
71-
}
72-
return result;
66+
return Provider.CreateQuery<T>(BuildRootExpression(typeof(T)));
7367
}
7468

7569
/// <summary>
@@ -84,13 +78,7 @@ public IQueryable<T> All<T>()
8478
/// </returns>
8579
public IQueryable All(Type elementType)
8680
{
87-
var result = ((IQueryProvider) Provider).CreateQuery(BuildRootExpression(elementType));
88-
if (session.Tags != null) {
89-
foreach (var tag in session.Tags) {
90-
result = result.Tag(tag);
91-
}
92-
}
93-
return result;
81+
return ((IQueryProvider) Provider).CreateQuery(BuildRootExpression(elementType));
9482
}
9583

9684
#region Full-text related

Orm/Xtensive.Orm/Orm/Rse/Compilation/CompositePreCompiler.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@ namespace Xtensive.Orm.Rse.Compilation
1313
public sealed class CompositePreCompiler : IPreCompiler
1414
{
1515
public List<IPreCompiler> Items { get; private set; }
16+
public IReadOnlyList<string> Tags { get; init; }
1617

1718
public CompilableProvider Process(CompilableProvider rootProvider)
1819
{
1920
var provider = rootProvider;
21+
if (Tags != null) {
22+
foreach (var tag in Tags) {
23+
provider = new TagProvider(provider, tag);
24+
}
25+
}
26+
2027
foreach (var item in Items)
2128
provider = item.Process(provider);
2229
return provider;
@@ -30,4 +37,4 @@ public CompositePreCompiler(params IPreCompiler[] preCompilers)
3037
Items = preCompilers.ToList();
3138
}
3239
}
33-
}
40+
}

0 commit comments

Comments
 (0)