Skip to content

Commit d01463e

Browse files
Support mixed columns and formulas in mapping by code
Fixes #1278 by the way
1 parent 5d9ade2 commit d01463e

21 files changed

+547
-106
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using NHibernate.Mapping.ByCode;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode.Impl;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.MappingByCode.MappersTests
7+
{
8+
[TestFixture]
9+
public class ElementMapperTest
10+
{
11+
private class Element
12+
{
13+
}
14+
15+
[Test]
16+
public void CanSetColumnsAndFormulas()
17+
{
18+
var mapping = new HbmElement();
19+
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
20+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
21+
22+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
23+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
24+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
25+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
26+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
27+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
28+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
29+
Assert.That(mapping.column, Is.Null, "column");
30+
Assert.That(mapping.formula, Is.Null, "formula");
31+
}
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using NHibernate.Mapping.ByCode;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode.Impl;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.MappingByCode.MappersTests
7+
{
8+
[TestFixture]
9+
public class ManyToManyMapperTest
10+
{
11+
private class Element
12+
{
13+
}
14+
15+
[Test]
16+
public void CanSetColumnsAndFormulas()
17+
{
18+
var hbmMapping = new HbmMapping();
19+
var mapping = new HbmManyToMany();
20+
IManyToManyMapper mapper = new ManyToManyMapper(typeof(Element), mapping, hbmMapping);
21+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
22+
23+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
24+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
25+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
26+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
27+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
28+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
29+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
30+
Assert.That(mapping.column, Is.Null, "column");
31+
Assert.That(mapping.formula, Is.Null, "formula");
32+
}
33+
}
34+
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,26 @@ 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+
220240
[Test]
221241
public void WhenSetFetchModeToJoinThenSetFetch()
222242
{
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using NHibernate.Mapping.ByCode;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode.Impl;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.MappingByCode.MappersTests
7+
{
8+
[TestFixture]
9+
public class MapKeyManyToManyMapperTest
10+
{
11+
[Test]
12+
public void CanSetColumnsAndFormulas()
13+
{
14+
var mapping = new HbmMapKeyManyToMany();
15+
IMapKeyManyToManyMapper mapper = new MapKeyManyToManyMapper(mapping);
16+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
17+
18+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
19+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
20+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
21+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
22+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
23+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
24+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
25+
Assert.That(mapping.column, Is.Null, "column");
26+
Assert.That(mapping.formula, Is.Null, "formula");
27+
}
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using NHibernate.Mapping.ByCode;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode.Impl;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.MappingByCode.MappersTests
7+
{
8+
[TestFixture]
9+
public class MapKeyMapperTest
10+
{
11+
[Test]
12+
public void CanSetColumnsAndFormulas()
13+
{
14+
var mapping = new HbmMapKey();
15+
IMapKeyMapper mapper = new MapKeyMapper(mapping);
16+
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));
17+
18+
Assert.That(mapping.Items, Has.Length.EqualTo(3));
19+
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
20+
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
21+
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
22+
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
23+
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
24+
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
25+
Assert.That(mapping.column, Is.Null, "column");
26+
Assert.That(mapping.formula, Is.Null, "formula");
27+
}
28+
}
29+
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,25 @@ 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+
287306
[Test]
288307
public void WhenSetUpdateThenSetAttributes()
289308
{
Lines changed: 12 additions & 0 deletions
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+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
using System;
2+
using NHibernate.Util;
3+
4+
namespace NHibernate.Mapping.ByCode
5+
{
6+
/// <summary>
7+
/// A mapper for mapping mixed list of columns and formulas.
8+
/// </summary>
9+
public interface IColumnsAndFormulasMapper : IColumnsMapper
10+
{
11+
/// <summary>
12+
/// Maps a mixed list of columns and formulas.
13+
/// </summary>
14+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
15+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
16+
void ColumnsAndFormulas(params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper);
17+
18+
/// <summary>
19+
/// Maps a formula.
20+
/// </summary>
21+
/// <param name="formula">The formula to map.</param>
22+
/// <remarks>Replaces any previously mapped column or formula, unless <see langword="null"/>.</remarks>
23+
void Formula(string formula);
24+
}
25+
26+
// 6.0 TODO: remove once the extended interfaces inherit IColumnOrFormulaMapper
27+
public static class ColumnsAndFormulasMapperExtensions
28+
{
29+
/// <summary>
30+
/// Maps a mixed list of columns and formulas.
31+
/// </summary>
32+
/// <param name="mapper">The mapper.</param>
33+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
34+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
35+
public static void ColumnsAndFormulas(
36+
this IElementMapper mapper,
37+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
38+
{
39+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
40+
}
41+
42+
/// <summary>
43+
/// Maps a mixed list of columns and formulas.
44+
/// </summary>
45+
/// <param name="mapper">The mapper.</param>
46+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
47+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
48+
public static void ColumnsAndFormulas(
49+
this IManyToManyMapper mapper,
50+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
51+
{
52+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
53+
}
54+
55+
/// <summary>
56+
/// Maps a mixed list of columns and formulas.
57+
/// </summary>
58+
/// <param name="mapper">The mapper.</param>
59+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
60+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
61+
public static void ColumnsAndFormulas(
62+
this IManyToOneMapper mapper,
63+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
64+
{
65+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
66+
}
67+
68+
/// <summary>
69+
/// Maps a mixed list of columns and formulas.
70+
/// </summary>
71+
/// <param name="mapper">The mapper.</param>
72+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
73+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
74+
public static void ColumnsAndFormulas(
75+
this IMapKeyManyToManyMapper mapper,
76+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
77+
{
78+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
79+
}
80+
81+
/// <summary>
82+
/// Maps a mixed list of columns and formulas.
83+
/// </summary>
84+
/// <param name="mapper">The mapper.</param>
85+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
86+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
87+
public static void ColumnsAndFormulas(
88+
this IMapKeyMapper mapper,
89+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
90+
{
91+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
92+
}
93+
94+
/// <summary>
95+
/// Maps a mixed list of columns and formulas.
96+
/// </summary>
97+
/// <param name="mapper">The mapper.</param>
98+
/// <param name="columnOrFormulaMapper">The mappers for each column or formula.</param>
99+
/// <remarks>Replaces any previously mapped column or formula.</remarks>
100+
public static void ColumnsAndFormulas(
101+
this IPropertyMapper mapper,
102+
params Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
103+
{
104+
CallColumnsAndFormulas(mapper, columnOrFormulaMapper);
105+
}
106+
107+
private static void CallColumnsAndFormulas(
108+
object mapper,
109+
Action<IColumnOrFormulaMapper>[] columnOrFormulaMapper)
110+
{
111+
var colsOrForMapper = ReflectHelper.CastOrThrow<IColumnsAndFormulasMapper>(
112+
mapper,
113+
nameof(IColumnsAndFormulasMapper.ColumnsAndFormulas));
114+
colsOrForMapper.ColumnsAndFormulas(columnOrFormulaMapper);
115+
}
116+
}
117+
}

src/NHibernate/Mapping/ByCode/IElementMapper.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace NHibernate.Mapping.ByCode
44
{
5+
// 6.0 TODO: inherit from IColumnsAndFormulasMapper
56
public interface IElementMapper : IColumnsMapper
67
{
78
void Type(IType persistentType);
@@ -13,6 +14,7 @@ public interface IElementMapper : IColumnsMapper
1314
void Scale(short scale);
1415
void NotNullable(bool notnull);
1516
void Unique(bool unique);
17+
// 6.0 TODO: remove once inhertied from IColumnsAndFormulasMapper
1618
void Formula(string formula);
1719
}
18-
}
20+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
namespace NHibernate.Mapping.ByCode
22
{
3+
// 6.0 TODO: inherit from IColumnsAndFormulasMapper
34
public interface IManyToManyMapper : IColumnsMapper
45
{
56
void Class(System.Type entityType);
67
void EntityName(string entityName);
78
void NotFound(NotFoundMode mode);
9+
// 6.0 TODO: remove once inhertied from IColumnsAndFormulasMapper
810
void Formula(string formula);
911
void Lazy(LazyRelation lazyRelation);
1012
void ForeignKey(string foreignKeyName);
1113
void Where(string sqlWhereClause);
1214
}
13-
}
15+
}

0 commit comments

Comments
 (0)