Skip to content

Commit 5b0e2e7

Browse files
fixup! Support mixed columns and formulas in mapping by code
Support setting multiple formulas as a string array. Target commit should be reworded: Support multiple formulas in mapping by code And support them being mixed with columns
1 parent e92804c commit 5b0e2e7

16 files changed

+305
-2
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Linq;
12
using NHibernate.Mapping.ByCode;
23
using NHibernate.Cfg.MappingSchema;
34
using NHibernate.Mapping.ByCode.Impl;
@@ -29,5 +30,19 @@ public void CanSetColumnsAndFormulas()
2930
Assert.That(mapping.column, Is.Null, "column");
3031
Assert.That(mapping.formula, Is.Null, "formula");
3132
}
33+
34+
[Test]
35+
public void CanSetMultipleFormulas()
36+
{
37+
var mapping = new HbmElement();
38+
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
39+
mapper.Formulas("formula1", "formula2", "formula3");
40+
41+
Assert.That(mapping.formula, Is.Null);
42+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
43+
Assert.That(
44+
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
45+
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
46+
}
3247
}
3348
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Linq;
12
using NHibernate.Mapping.ByCode;
23
using NHibernate.Cfg.MappingSchema;
34
using NHibernate.Mapping.ByCode.Impl;
@@ -30,5 +31,20 @@ public void CanSetColumnsAndFormulas()
3031
Assert.That(mapping.column, Is.Null, "column");
3132
Assert.That(mapping.formula, Is.Null, "formula");
3233
}
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+
}
3349
}
3450
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,22 @@ public void CanSetColumnsAndFormulas()
237237
Assert.That(mapping.formula, Is.Null, "formula");
238238
}
239239

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+
240256
[Test]
241257
public void WhenSetFetchModeToJoinThenSetFetch()
242258
{

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Linq;
12
using NHibernate.Mapping.ByCode;
23
using NHibernate.Cfg.MappingSchema;
34
using NHibernate.Mapping.ByCode.Impl;
@@ -25,5 +26,19 @@ public void CanSetColumnsAndFormulas()
2526
Assert.That(mapping.column, Is.Null, "column");
2627
Assert.That(mapping.formula, Is.Null, "formula");
2728
}
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+
}
2843
}
2944
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Linq;
12
using NHibernate.Mapping.ByCode;
23
using NHibernate.Cfg.MappingSchema;
34
using NHibernate.Mapping.ByCode.Impl;
@@ -25,5 +26,19 @@ public void CanSetColumnsAndFormulas()
2526
Assert.That(mapping.column, Is.Null, "column");
2627
Assert.That(mapping.formula, Is.Null, "formula");
2728
}
29+
30+
[Test]
31+
public void CanSetMultipleFormulas()
32+
{
33+
var mapping = new HbmMapKey();
34+
IMapKeyMapper mapper = new MapKeyMapper(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+
}
2843
}
2944
}

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

Lines changed: 15 additions & 0 deletions
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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,21 @@ public void CanSetColumnsAndFormulas()
303303
Assert.That(mapping.formula, Is.Null, "formula");
304304
}
305305

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+
306321
[Test]
307322
public void WhenSetUpdateThenSetAttributes()
308323
{

src/NHibernate/Mapping/ByCode/IColumnsAndFormulasMapper.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ public interface IColumnsAndFormulasMapper : IColumnsMapper
2121
/// <param name="formula">The formula to map.</param>
2222
/// <remarks>Replaces any previously mapped column or formula, unless <see langword="null"/>.</remarks>
2323
void Formula(string formula);
24+
25+
/// <summary>
26+
/// Maps many formulas.
27+
/// </summary>
28+
/// <param name="formulas">The formulas to map.</param>
29+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
30+
void Formulas(params string[] formulas);
2431
}
2532

2633
// 6.0 TODO: remove once the extended interfaces inherit IColumnOrFormulaMapper
@@ -113,5 +120,79 @@ private static void CallColumnsAndFormulas(
113120
nameof(IColumnsAndFormulasMapper.ColumnsAndFormulas));
114121
colsOrForMapper.ColumnsAndFormulas(columnOrFormulaMapper);
115122
}
123+
124+
/// <summary>
125+
/// Maps many formulas.
126+
/// </summary>
127+
/// <param name="mapper">The mapper.</param>
128+
/// <param name="formulas">The formulas to map.</param>
129+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
130+
public static void Formulas(this IElementMapper mapper, params string[] formulas)
131+
{
132+
CallFormulas(mapper, formulas);
133+
}
134+
135+
/// <summary>
136+
/// Maps many formulas.
137+
/// </summary>
138+
/// <param name="mapper">The mapper.</param>
139+
/// <param name="formulas">The formulas to map.</param>
140+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
141+
public static void Formulas(this IManyToManyMapper mapper, params string[] formulas)
142+
{
143+
CallFormulas(mapper, formulas);
144+
}
145+
146+
/// <summary>
147+
/// Maps many formulas.
148+
/// </summary>
149+
/// <param name="mapper">The mapper.</param>
150+
/// <param name="formulas">The formulas to map.</param>
151+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
152+
public static void Formulas(this IManyToOneMapper mapper, params string[] formulas)
153+
{
154+
CallFormulas(mapper, formulas);
155+
}
156+
157+
/// <summary>
158+
/// Maps many formulas.
159+
/// </summary>
160+
/// <param name="mapper">The mapper.</param>
161+
/// <param name="formulas">The formulas to map.</param>
162+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
163+
public static void Formulas(this IMapKeyManyToManyMapper mapper, params string[] formulas)
164+
{
165+
CallFormulas(mapper, formulas);
166+
}
167+
168+
/// <summary>
169+
/// Maps many formulas.
170+
/// </summary>
171+
/// <param name="mapper">The mapper.</param>
172+
/// <param name="formulas">The formulas to map.</param>
173+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
174+
public static void Formulas(this IMapKeyMapper mapper, params string[] formulas)
175+
{
176+
CallFormulas(mapper, formulas);
177+
}
178+
179+
/// <summary>
180+
/// Maps many formulas.
181+
/// </summary>
182+
/// <param name="mapper">The mapper.</param>
183+
/// <param name="formulas">The formulas to map.</param>
184+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
185+
public static void Formulas(this IPropertyMapper mapper, params string[] formulas)
186+
{
187+
CallFormulas(mapper, formulas);
188+
}
189+
190+
private static void CallFormulas(object mapper, string[] formulas)
191+
{
192+
var colsOrForMapper = ReflectHelper.CastOrThrow<IColumnsAndFormulasMapper>(
193+
mapper,
194+
"Setting many formula");
195+
colsOrForMapper.Formulas(formulas);
196+
}
116197
}
117198
}

src/NHibernate/Mapping/ByCode/IOneToOneMapper.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Linq.Expressions;
33
using System.Reflection;
4+
using NHibernate.Mapping.ByCode.Impl;
5+
using NHibernate.Util;
46

57
namespace NHibernate.Mapping.ByCode
68
{
@@ -19,4 +21,19 @@ public interface IOneToOneMapper<T> : IOneToOneMapper
1921
{
2022
void PropertyReference<TProperty>(Expression<Func<T, TProperty>> reference);
2123
}
22-
}
24+
25+
// 6.0 TODO: move method into IOneToOneMapper
26+
public static class OneToOneMapperExtensions
27+
{
28+
/// <summary>
29+
/// Maps many formulas.
30+
/// </summary>
31+
/// <param name="mapper">The mapper.</param>
32+
/// <param name="formulas">The formulas to map.</param>
33+
public static void Formulas(this IOneToOneMapper mapper, params string[] formulas)
34+
{
35+
var o2oMapper = ReflectHelper.CastOrThrow<OneToOneMapper>(mapper, "Setting many formula");
36+
o2oMapper.Formulas(formulas);
37+
}
38+
}
39+
}

src/NHibernate/Mapping/ByCode/Impl/ElementMapper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ public void Formula(string formula)
138138
}
139139
}
140140

141+
/// <inheritdoc />
142+
public void Formulas(params string[] formulas)
143+
{
144+
if (formulas == null)
145+
throw new ArgumentNullException(nameof(formulas));
146+
147+
ResetColumnPlainValues();
148+
elementMapping.Items =
149+
formulas
150+
.Select(
151+
f => (object) new HbmFormula { Text = f.Split(StringHelper.LineSeparators, StringSplitOptions.None) })
152+
.ToArray();
153+
}
154+
141155
#endregion
142156

143157
#region Implementation of IElementMapper

src/NHibernate/Mapping/ByCode/Impl/ManyToManyMapper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,20 @@ public void Formula(string formula)
125125
}
126126
}
127127

128+
/// <inheritdoc />
129+
public void Formulas(params string[] formulas)
130+
{
131+
if (formulas == null)
132+
throw new ArgumentNullException(nameof(formulas));
133+
134+
ResetColumnPlainValues();
135+
manyToMany.Items =
136+
formulas
137+
.Select(
138+
f => (object) new HbmFormula { Text = f.Split(StringHelper.LineSeparators, StringSplitOptions.None) })
139+
.ToArray();
140+
}
141+
128142
#endregion
129143

130144
#region IManyToManyMapper Members

src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,20 @@ public void Formula(string formula)
165165
}
166166
}
167167

168+
/// <inheritdoc />
169+
public void Formulas(params string[] formulas)
170+
{
171+
if (formulas == null)
172+
throw new ArgumentNullException(nameof(formulas));
173+
174+
ResetColumnPlainValues();
175+
_manyToOne.Items =
176+
formulas
177+
.Select(
178+
f => (object) new HbmFormula { Text = f.Split(StringHelper.LineSeparators, StringSplitOptions.None) })
179+
.ToArray();
180+
}
181+
168182
#endregion
169183

170184
#region Implementation of IColumnsMapper

src/NHibernate/Mapping/ByCode/Impl/MapKeyManyToManyMapper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ public void Formula(string formula)
6262
}
6363
}
6464

65+
/// <inheritdoc />
66+
public void Formulas(params string[] formulas)
67+
{
68+
if (formulas == null)
69+
throw new ArgumentNullException(nameof(formulas));
70+
71+
ResetColumnPlainValues();
72+
mapping.Items =
73+
formulas
74+
.Select(
75+
f => (object) new HbmFormula { Text = f.Split(StringHelper.LineSeparators, StringSplitOptions.None) })
76+
.ToArray();
77+
}
78+
6579
#endregion
6680

6781
#region IColumnsMapper Members

src/NHibernate/Mapping/ByCode/Impl/MapKeyMapper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ public void Formula(string formula)
138138
}
139139
}
140140

141+
/// <inheritdoc />
142+
public void Formulas(params string[] formulas)
143+
{
144+
if (formulas == null)
145+
throw new ArgumentNullException(nameof(formulas));
146+
147+
ResetColumnPlainValues();
148+
hbmMapKey.Items =
149+
formulas
150+
.Select(
151+
f => (object) new HbmFormula { Text = f.Split(StringHelper.LineSeparators, StringSplitOptions.None) })
152+
.ToArray();
153+
}
154+
141155
#endregion
142156

143157
private void ResetColumnPlainValues()

0 commit comments

Comments
 (0)