Skip to content

Commit cbf5067

Browse files
hazzikfredericDelaporte
authored andcommitted
NH-2319 - Add ability to query collections with AsQueryable()
1 parent 80fb5f3 commit cbf5067

29 files changed

+1301
-57
lines changed
Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System;
12+
using System.Linq;
13+
using NHibernate.Cfg;
14+
using NHibernate.Cfg.MappingSchema;
15+
using NHibernate.Collection;
16+
using NHibernate.Mapping.ByCode;
17+
using NUnit.Framework;
18+
using NHibernate.Linq;
19+
20+
namespace NHibernate.Test.NHSpecificTest.NH2319
21+
{
22+
using System.Threading.Tasks;
23+
[TestFixture]
24+
public abstract class FixtureBaseAsync : TestCaseMappingByCode
25+
{
26+
private Guid _parentId;
27+
private Guid _child1Id;
28+
29+
[Test]
30+
public async Task ShouldBeAbleToFindChildrenByNameAsync()
31+
{
32+
using (var session = OpenSession())
33+
using (session.BeginTransaction())
34+
{
35+
var parent = await (session.GetAsync<Parent>(_parentId));
36+
37+
Assert.That(parent, Is.Not.Null);
38+
39+
var filtered = await (parent.Children
40+
.AsQueryable()
41+
.Where(x => x.Name == "Jack")
42+
.ToListAsync());
43+
44+
Assert.That(filtered, Has.Count.EqualTo(1));
45+
Assert.That(filtered[0].Id, Is.EqualTo(_child1Id));
46+
}
47+
}
48+
49+
[Test]
50+
public async Task ShouldBeAbleToPerformComplexFilteringAsync()
51+
{
52+
using (var session = OpenSession())
53+
using (session.BeginTransaction())
54+
{
55+
var parent = await (session.GetAsync<Parent>(_parentId));
56+
57+
Assert.NotNull(parent);
58+
59+
var filtered = await (parent.Children
60+
.AsQueryable()
61+
.Where(x => x.Name == "Piter")
62+
.SelectMany(x => x.GrandChildren)
63+
.Select(x => x.Id)
64+
.CountAsync());
65+
66+
Assert.That(filtered, Is.EqualTo(2));
67+
}
68+
}
69+
70+
[Test]
71+
public async Task ShouldNotInitializeCollectionWhenPerformingQueryAsync()
72+
{
73+
using (var session = OpenSession())
74+
using (session.BeginTransaction())
75+
{
76+
var parent = await (session.GetAsync<Parent>(_parentId));
77+
Assert.That(parent, Is.Not.Null);
78+
79+
var persistentCollection = (IPersistentCollection) parent.Children;
80+
81+
var filtered = await (parent.Children
82+
.AsQueryable()
83+
.Where(x => x.Name == "Jack")
84+
.ToListAsync());
85+
86+
Assert.That(filtered, Has.Count.EqualTo(1));
87+
Assert.That(persistentCollection.WasInitialized, Is.False);
88+
}
89+
}
90+
91+
[Test]
92+
public async Task ShouldPerformSqlQueryEvenIfCollectionAlreadyInitializedAsync()
93+
{
94+
using (var session = OpenSession())
95+
using (session.BeginTransaction())
96+
{
97+
var parent = await (session.GetAsync<Parent>(_parentId));
98+
Assert.That(parent, Is.Not.Null);
99+
100+
var loaded = parent.Children.ToList();
101+
Assert.That(loaded, Has.Count.EqualTo(2));
102+
103+
var countBeforeFiltering = session.SessionFactory.Statistics.QueryExecutionCount;
104+
105+
var filtered = await (parent.Children
106+
.AsQueryable()
107+
.Where(x => x.Name == "Jack")
108+
.ToListAsync());
109+
110+
var countAfterFiltering = session.SessionFactory.Statistics.QueryExecutionCount;
111+
112+
Assert.That(filtered, Has.Count.EqualTo(1));
113+
Assert.That(countAfterFiltering, Is.EqualTo(countBeforeFiltering + 1));
114+
}
115+
}
116+
117+
[Test]
118+
public async Task TestFilterAsync()
119+
{
120+
using (var session = OpenSession())
121+
using (session.BeginTransaction())
122+
{
123+
var parent = await (session.GetAsync<Parent>(_parentId));
124+
Assert.That(parent, Is.Not.Null);
125+
126+
var children = await ((await (session.CreateFilterAsync(parent.Children, "where this.Name = 'Jack'")))
127+
.ListAsync<Child>());
128+
129+
Assert.That(children, Has.Count.EqualTo(1));
130+
}
131+
}
132+
133+
protected override void Configure(Configuration configuration)
134+
{
135+
configuration.SetProperty("show_sql", "true");
136+
configuration.SetProperty("generate_statistics", "true");
137+
}
138+
139+
protected override void OnSetUp()
140+
{
141+
using (var session = OpenSession())
142+
using (var transaction = session.BeginTransaction())
143+
{
144+
var parent1 = new Parent {Name = "Bob"};
145+
_parentId = (Guid) session.Save(parent1);
146+
147+
var parent2 = new Parent {Name = "Martin"};
148+
session.Save(parent2);
149+
150+
var child1 = new Child
151+
{
152+
Name = "Jack",
153+
Parent = parent1
154+
};
155+
parent1.Children.Add(child1);
156+
_child1Id = (Guid) session.Save(child1);
157+
158+
var child2 = new Child
159+
{
160+
Name = "Piter",
161+
Parent = parent1
162+
};
163+
parent1.Children.Add(child2);
164+
session.Save(child2);
165+
166+
var grandChild1 = new GrandChild
167+
{
168+
Name = "Kate",
169+
Child = child2
170+
};
171+
child2.GrandChildren.Add(grandChild1);
172+
session.Save(grandChild1);
173+
174+
var grandChild2 = new GrandChild
175+
{
176+
Name = "Mary",
177+
Child = child2
178+
};
179+
child2.GrandChildren.Add(grandChild2);
180+
session.Save(grandChild2);
181+
182+
var child3 = new Child
183+
{
184+
Name = "Jack",
185+
Parent = parent2
186+
};
187+
parent2.Children.Add(child3);
188+
session.Save(child3);
189+
190+
session.Flush();
191+
transaction.Commit();
192+
}
193+
}
194+
195+
protected override void OnTearDown()
196+
{
197+
using (var session = OpenSession())
198+
using (var transaction = session.BeginTransaction())
199+
{
200+
session.Delete("from System.Object");
201+
202+
session.Flush();
203+
transaction.Commit();
204+
}
205+
}
206+
}
207+
208+
[TestFixture]
209+
public class BagFixtureAsync : FixtureBaseAsync
210+
{
211+
protected override HbmMapping GetMappings()
212+
{
213+
var mapper = new ModelMapper();
214+
mapper.Class<Parent>(rc =>
215+
{
216+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
217+
rc.Property(x => x.Name);
218+
rc.Bag(x => x.Children,
219+
map => map.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans),
220+
rel => rel.OneToMany());
221+
});
222+
223+
mapper.Class<Child>(rc =>
224+
{
225+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
226+
rc.Property(x => x.Name);
227+
rc.ManyToOne(x => x.Parent);
228+
rc.Bag(x => x.GrandChildren, map => map.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans), rel => rel.OneToMany());
229+
});
230+
231+
mapper.Class<GrandChild>(rc =>
232+
{
233+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
234+
rc.Property(x => x.Name);
235+
rc.ManyToOne(x => x.Child, x => x.Column("child_id"));
236+
});
237+
238+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
239+
}
240+
241+
}
242+
243+
[TestFixture]
244+
public class SetFixtureAsync : FixtureBaseAsync
245+
{
246+
protected override HbmMapping GetMappings()
247+
{
248+
var mapper = new ModelMapper();
249+
mapper.Class<Parent>(rc =>
250+
{
251+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
252+
rc.Property(x => x.Name);
253+
rc.Set(x => x.Children,
254+
map => map.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans),
255+
rel => rel.OneToMany());
256+
});
257+
258+
mapper.Class<Child>(rc =>
259+
{
260+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
261+
rc.Property(x => x.Name);
262+
rc.ManyToOne(x => x.Parent);
263+
rc.Set(x => x.GrandChildren,
264+
map => map.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans),
265+
rel => rel.OneToMany());
266+
});
267+
268+
mapper.Class<GrandChild>(rc =>
269+
{
270+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
271+
rc.Property(x => x.Name);
272+
rc.ManyToOne(x => x.Child, x => x.Column("child_id"));
273+
});
274+
275+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
276+
}
277+
}
278+
279+
[TestFixture]
280+
public class ListFixtureAsync : FixtureBaseAsync
281+
{
282+
protected override HbmMapping GetMappings()
283+
{
284+
var mapper = new ModelMapper();
285+
mapper.Class<Parent>(rc =>
286+
{
287+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
288+
rc.Property(x => x.Name);
289+
rc.List(
290+
x => x.Children,
291+
list =>
292+
{
293+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
294+
list.Index(i => i.Column("i"));
295+
},
296+
rel => rel.OneToMany());
297+
});
298+
299+
mapper.Class<Child>(rc =>
300+
{
301+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
302+
rc.Property(x => x.Name);
303+
rc.ManyToOne(x => x.Parent);
304+
rc.List(
305+
c => c.GrandChildren,
306+
list =>
307+
{
308+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
309+
list.Index(i => i.Column("i"));
310+
},
311+
rel => rel.OneToMany());
312+
});
313+
314+
mapper.Class<GrandChild>(rc =>
315+
{
316+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
317+
rc.Property(x => x.Name);
318+
rc.ManyToOne(x => x.Child, x => x.Column("child_id"));
319+
});
320+
321+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
322+
}
323+
}
324+
325+
[TestFixture]
326+
public class IdBagFixtureAsync : FixtureBaseAsync
327+
{
328+
protected override HbmMapping GetMappings()
329+
{
330+
var mapper = new ModelMapper();
331+
mapper.Class<Parent>(rc =>
332+
{
333+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
334+
rc.Property(x => x.Name);
335+
rc.IdBag(
336+
x => x.Children,
337+
list =>
338+
{
339+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
340+
},
341+
rel => rel.ManyToMany());
342+
});
343+
344+
mapper.Class<Child>(rc =>
345+
{
346+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
347+
rc.Property(x => x.Name);
348+
//rc.ManyToOne(x => x.Parent);
349+
rc.IdBag(
350+
c => c.GrandChildren,
351+
list =>
352+
{
353+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
354+
},
355+
rel => rel.ManyToMany());
356+
});
357+
358+
mapper.Class<GrandChild>(rc =>
359+
{
360+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
361+
rc.Property(x => x.Name);
362+
//rc.ManyToOne(x => x.Child, x => x.Column("child_id"));
363+
});
364+
365+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
366+
}
367+
}
368+
}

0 commit comments

Comments
 (0)