Skip to content

Commit 61d9fda

Browse files
Support mixed formulas and columns in By Code (#1759)
Also fixes #1278 And enables a forgotten test for the hbm part of the feature
1 parent a2f9a27 commit 61d9fda

27 files changed

+833
-111
lines changed

src/NHibernate.Test/Async/NHSpecificTest/GH1759/ColumnsAndFormulasFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public async Task CheckElementAsync()
182182
}
183183
}
184184

185-
[Test, Ignore("Needs an unrelated additional simple fix in OneToManyPersister")]
185+
[Test]
186186
public async Task CheckMapKeyAsync()
187187
{
188188
using (var session = OpenSession())

src/NHibernate.Test/MappingByCode/MappersTests/ElementMapperTest.cs

+38
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using System.Linq;
12
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode;
24
using NHibernate.Mapping.ByCode.Impl;
35
using NUnit.Framework;
46

@@ -17,5 +19,41 @@ public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
1719
Assert.That(mapping.Type.name, Does.Contain(nameof(MyCompoType)));
1820
Assert.That(mapping.type, Is.Null);
1921
}
22+
23+
private class Element
24+
{
25+
}
26+
27+
[Test]
28+
public void CanSetColumnsAndFormulas()
29+
{
30+
var mapping = new HbmElement();
31+
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
32+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
33+
34+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
35+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
36+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
37+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
38+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
39+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
40+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
41+
Assert.That(mapping.column, Is.Null, "column");
42+
Assert.That(mapping.formula, Is.Null, "formula");
43+
}
44+
45+
[Test]
46+
public void CanSetMultipleFormulas()
47+
{
48+
var mapping = new HbmElement();
49+
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
50+
mapper.Formulas("formula1", "formula2", "formula3");
51+
52+
Assert.That(mapping.formula, Is.Null);
53+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
54+
Assert.That(
55+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
56+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
57+
}
2058
}
2159
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Linq;
2+
using NHibernate.Mapping.ByCode;
3+
using NHibernate.Cfg.MappingSchema;
4+
using NHibernate.Mapping.ByCode.Impl;
5+
using NUnit.Framework;
6+
7+
namespace NHibernate.Test.MappingByCode.MappersTests
8+
{
9+
[TestFixture]
10+
public class ManyToManyMapperTest
11+
{
12+
private class Element
13+
{
14+
}
15+
16+
[Test]
17+
public void CanSetColumnsAndFormulas()
18+
{
19+
var hbmMapping = new HbmMapping();
20+
var mapping = new HbmManyToMany();
21+
IManyToManyMapper mapper = new ManyToManyMapper(typeof(Element), mapping, hbmMapping);
22+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
23+
24+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
25+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
26+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
27+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
28+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
29+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
30+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
31+
Assert.That(mapping.column, Is.Null, "column");
32+
Assert.That(mapping.formula, Is.Null, "formula");
33+
}
34+
35+
[Test]
36+
public void CanSetMultipleFormulas()
37+
{
38+
var hbmMapping = new HbmMapping();
39+
var mapping = new HbmManyToMany();
40+
IManyToManyMapper mapper = new ManyToManyMapper(typeof(Element), mapping, hbmMapping);
41+
mapper.Formulas("formula1", "formula2", "formula3");
42+
43+
Assert.That(mapping.formula, Is.Null);
44+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
45+
Assert.That(
46+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
47+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
48+
}
49+
}
50+
}

src/NHibernate.Test/MappingByCode/MappersTests/ManyToOneMapperTest.cs

+36
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,42 @@ public void SetUniqueToMultiColumn()
217217
Assert.That(mapping.index, Is.EqualTo("II"));
218218
}
219219

220+
[Test]
221+
public void CanSetColumnsAndFormulas()
222+
{
223+
var hbmMapping = new HbmMapping();
224+
var member = typeof(MyClass).GetProperty("Relation");
225+
var mapping = new HbmManyToOne();
226+
IManyToOneMapper mapper = new ManyToOneMapper(member, mapping, hbmMapping);
227+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
228+
229+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
230+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
231+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
232+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
233+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
234+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
235+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
236+
Assert.That(mapping.column, Is.Null, "column");
237+
Assert.That(mapping.formula, Is.Null, "formula");
238+
}
239+
240+
[Test]
241+
public void CanSetMultipleFormulas()
242+
{
243+
var hbmMapping = new HbmMapping();
244+
var member = typeof(MyClass).GetProperty("Relation");
245+
var mapping = new HbmManyToOne();
246+
IManyToOneMapper mapper = new ManyToOneMapper(member, mapping, hbmMapping);
247+
mapper.Formulas("formula1", "formula2", "formula3");
248+
249+
Assert.That(mapping.formula, Is.Null);
250+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
251+
Assert.That(
252+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
253+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
254+
}
255+
220256
[Test]
221257
public void WhenSetFetchModeToJoinThenSetFetch()
222258
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Linq;
2+
using NHibernate.Mapping.ByCode;
3+
using NHibernate.Cfg.MappingSchema;
4+
using NHibernate.Mapping.ByCode.Impl;
5+
using NUnit.Framework;
6+
7+
namespace NHibernate.Test.MappingByCode.MappersTests
8+
{
9+
[TestFixture]
10+
public class MapKeyManyToManyMapperTest
11+
{
12+
[Test]
13+
public void CanSetColumnsAndFormulas()
14+
{
15+
var mapping = new HbmMapKeyManyToMany();
16+
IMapKeyManyToManyMapper mapper = new MapKeyManyToManyMapper(mapping);
17+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
18+
19+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
20+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
21+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
22+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
23+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
24+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
25+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
26+
Assert.That(mapping.column, Is.Null, "column");
27+
Assert.That(mapping.formula, Is.Null, "formula");
28+
}
29+
30+
[Test]
31+
public void CanSetMultipleFormulas()
32+
{
33+
var mapping = new HbmMapKeyManyToMany();
34+
IMapKeyManyToManyMapper mapper = new MapKeyManyToManyMapper(mapping);
35+
mapper.Formulas("formula1", "formula2", "formula3");
36+
37+
Assert.That(mapping.formula, Is.Null);
38+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
39+
Assert.That(
40+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
41+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
42+
}
43+
}
44+
}

src/NHibernate.Test/MappingByCode/MappersTests/MapKeyMapperTest.cs

+34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using System.Linq;
12
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode;
24
using NHibernate.Mapping.ByCode.Impl;
35
using NUnit.Framework;
46

@@ -16,5 +18,37 @@ public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
1618
Assert.That(() => mapper.Type<MyCompoType>(), Throws.Nothing);
1719
Assert.That(mapping.Type.name, Does.Contain(nameof(MyCompoType)));
1820
}
21+
22+
[Test]
23+
public void CanSetColumnsAndFormulas()
24+
{
25+
var mapping = new HbmMapKey();
26+
IMapKeyMapper mapper = new MapKeyMapper(mapping);
27+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
28+
29+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
30+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
31+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
32+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
33+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
34+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
35+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
36+
Assert.That(mapping.column, Is.Null, "column");
37+
Assert.That(mapping.formula, Is.Null, "formula");
38+
}
39+
40+
[Test]
41+
public void CanSetMultipleFormulas()
42+
{
43+
var mapping = new HbmMapKey();
44+
IMapKeyMapper mapper = new MapKeyMapper(mapping);
45+
mapper.Formulas("formula1", "formula2", "formula3");
46+
47+
Assert.That(mapping.formula, Is.Null);
48+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
49+
Assert.That(
50+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
51+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
52+
}
1953
}
2054
}

src/NHibernate.Test/MappingByCode/MappersTests/OneToOneMapperTest.cs

+15
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,21 @@ public void CanSetFormula()
122122
Assert.That(mapping.formula1, Is.EqualTo("SomeFormula"));
123123
}
124124

125+
[Test]
126+
public void CanSetMultipleFormulas()
127+
{
128+
var member = For<MyClass>.Property(c => c.Relation);
129+
var mapping = new HbmOneToOne();
130+
var mapper = new OneToOneMapper(member, mapping);
131+
132+
mapper.Formulas("formula1", "formula2", "formula3");
133+
Assert.That(mapping.formula1, Is.Null);
134+
Assert.That(mapping.formula, Has.Length.EqualTo(3));
135+
Assert.That(
136+
mapping.formula.Select(f => f.Text.Single()),
137+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
138+
}
139+
125140
[Test]
126141
public void WhenSetFormulaWithNullThenSetFormulaWithNull()
127142
{

src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs

+34
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,40 @@ public void WhenSetBasicColumnValuesThroughShortCutThenMergeColumn()
284284
Assert.That(mapping.index, Is.EqualTo("II"));
285285
}
286286

287+
[Test]
288+
public void CanSetColumnsAndFormulas()
289+
{
290+
var member = typeof(MyClass).GetProperty("Autoproperty");
291+
var mapping = new HbmProperty();
292+
IPropertyMapper mapper = new PropertyMapper(member, mapping);
293+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
294+
295+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
296+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
297+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
298+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
299+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
300+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
301+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
302+
Assert.That(mapping.column, Is.Null, "column");
303+
Assert.That(mapping.formula, Is.Null, "formula");
304+
}
305+
306+
[Test]
307+
public void CanSetMultipleFormulas()
308+
{
309+
var member = typeof(MyClass).GetProperty("Autoproperty");
310+
var mapping = new HbmProperty();
311+
IPropertyMapper mapper = new PropertyMapper(member, mapping);
312+
mapper.Formulas("formula1", "formula2", "formula3");
313+
314+
Assert.That(mapping.formula, Is.Null);
315+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
316+
Assert.That(
317+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
318+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
319+
}
320+
287321
[Test]
288322
public void WhenSetUpdateThenSetAttributes()
289323
{

src/NHibernate.Test/NHSpecificTest/GH1759/ColumnsAndFormulasFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public void CheckElement()
170170
}
171171
}
172172

173-
[Test, Ignore("Needs an unrelated additional simple fix in OneToManyPersister")]
173+
[Test]
174174
public void CheckMapKey()
175175
{
176176
using (var session = OpenSession())

src/NHibernate.Test/NHSpecificTest/GH1759/Mappings.hbm.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@
6464
</element>
6565
</set>
6666

67-
<!-- This forbids hiring two persons on the same day, but well, that is just for testing.
68-
Disabled for now, needs an unrelated simple fix in OneToManyPersister
67+
<!-- This forbids hiring two persons on the same day, but well, that is just for testing. -->
6968
<map name="UsersByHiring" inverse="true">
7069
<key>
7170
<column name="MainGroupName"/>
@@ -77,7 +76,6 @@
7776
</map-key>
7877
<one-to-many class="User"/>
7978
</map>
80-
-->
8179

8280
<!-- This is functionaly quite broken as the primary key does not include the map-key, which forbids
8381
to add the same comment for two distinct users. A fix would be to map the element as a composite
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace NHibernate.Mapping.ByCode
2+
{
3+
public interface IColumnOrFormulaMapper : IColumnMapper
4+
{
5+
/// <summary>
6+
/// Maps a formula.
7+
/// </summary>
8+
/// <param name="formula">The formula to map.</param>
9+
/// <remarks>Replaces any previously mapped column attribute.</remarks>
10+
void Formula(string formula);
11+
}
12+
}

0 commit comments

Comments
 (0)