Skip to content

Support mixed formulas and columns in By Code #1759

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ public async Task CheckElementAsync()
}
}

[Test, Ignore("Needs an unrelated additional simple fix in OneToManyPersister")]
[Test]
public async Task CheckMapKeyAsync()
{
using (var session = OpenSession())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Linq;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Impl;
using NUnit.Framework;

Expand All @@ -17,5 +19,41 @@ public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
Assert.That(mapping.Type.name, Does.Contain(nameof(MyCompoType)));
Assert.That(mapping.type, Is.Null);
}

private class Element
{
}

[Test]
public void CanSetColumnsAndFormulas()
{
var mapping = new HbmElement();
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var mapping = new HbmElement();
IElementMapper mapper = new ElementMapper(typeof(Element), mapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System.Linq;
using NHibernate.Mapping.ByCode;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode.Impl;
using NUnit.Framework;

namespace NHibernate.Test.MappingByCode.MappersTests
{
[TestFixture]
public class ManyToManyMapperTest
{
private class Element
{
}

[Test]
public void CanSetColumnsAndFormulas()
{
var hbmMapping = new HbmMapping();
var mapping = new HbmManyToMany();
IManyToManyMapper mapper = new ManyToManyMapper(typeof(Element), mapping, hbmMapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var hbmMapping = new HbmMapping();
var mapping = new HbmManyToMany();
IManyToManyMapper mapper = new ManyToManyMapper(typeof(Element), mapping, hbmMapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,42 @@ public void SetUniqueToMultiColumn()
Assert.That(mapping.index, Is.EqualTo("II"));
}

[Test]
public void CanSetColumnsAndFormulas()
{
var hbmMapping = new HbmMapping();
var member = typeof(MyClass).GetProperty("Relation");
var mapping = new HbmManyToOne();
IManyToOneMapper mapper = new ManyToOneMapper(member, mapping, hbmMapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var hbmMapping = new HbmMapping();
var member = typeof(MyClass).GetProperty("Relation");
var mapping = new HbmManyToOne();
IManyToOneMapper mapper = new ManyToOneMapper(member, mapping, hbmMapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}

[Test]
public void WhenSetFetchModeToJoinThenSetFetch()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System.Linq;
using NHibernate.Mapping.ByCode;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode.Impl;
using NUnit.Framework;

namespace NHibernate.Test.MappingByCode.MappersTests
{
[TestFixture]
public class MapKeyManyToManyMapperTest
{
[Test]
public void CanSetColumnsAndFormulas()
{
var mapping = new HbmMapKeyManyToMany();
IMapKeyManyToManyMapper mapper = new MapKeyManyToManyMapper(mapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var mapping = new HbmMapKeyManyToMany();
IMapKeyManyToManyMapper mapper = new MapKeyManyToManyMapper(mapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}
}
}
34 changes: 34 additions & 0 deletions src/NHibernate.Test/MappingByCode/MappersTests/MapKeyMapperTest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Linq;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Impl;
using NUnit.Framework;

Expand All @@ -16,5 +18,37 @@ public void WhenSetTypeByICompositeUserTypeThenSetTypeName()
Assert.That(() => mapper.Type<MyCompoType>(), Throws.Nothing);
Assert.That(mapping.Type.name, Does.Contain(nameof(MyCompoType)));
}

[Test]
public void CanSetColumnsAndFormulas()
{
var mapping = new HbmMapKey();
IMapKeyMapper mapper = new MapKeyMapper(mapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var mapping = new HbmMapKey();
IMapKeyMapper mapper = new MapKeyMapper(mapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,21 @@ public void CanSetFormula()
Assert.That(mapping.formula1, Is.EqualTo("SomeFormula"));
}

[Test]
public void CanSetMultipleFormulas()
{
var member = For<MyClass>.Property(c => c.Relation);
var mapping = new HbmOneToOne();
var mapper = new OneToOneMapper(member, mapping);

mapper.Formulas("formula1", "formula2", "formula3");
Assert.That(mapping.formula1, Is.Null);
Assert.That(mapping.formula, Has.Length.EqualTo(3));
Assert.That(
mapping.formula.Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}

[Test]
public void WhenSetFormulaWithNullThenSetFormulaWithNull()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,40 @@ public void WhenSetBasicColumnValuesThroughShortCutThenMergeColumn()
Assert.That(mapping.index, Is.EqualTo("II"));
}

[Test]
public void CanSetColumnsAndFormulas()
{
var member = typeof(MyClass).GetProperty("Autoproperty");
var mapping = new HbmProperty();
IPropertyMapper mapper = new PropertyMapper(member, mapping);
mapper.ColumnsAndFormulas(x => x.Name("pizza"), x => x.Formula("risotto"), x => x.Name("pasta"));

Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(mapping.Items[0], Is.TypeOf<HbmColumn>(), "first");
Assert.That(mapping.Items[1], Is.TypeOf<HbmFormula>(), "second");
Assert.That(mapping.Items[2], Is.TypeOf<HbmColumn>(), "third");
Assert.That(((HbmColumn)mapping.Items[0]).name, Is.EqualTo("pizza"));
Assert.That(((HbmFormula)mapping.Items[1]).Text, Has.Length.EqualTo(1).And.One.EqualTo("risotto"));
Assert.That(((HbmColumn)mapping.Items[2]).name, Is.EqualTo("pasta"));
Assert.That(mapping.column, Is.Null, "column");
Assert.That(mapping.formula, Is.Null, "formula");
}

[Test]
public void CanSetMultipleFormulas()
{
var member = typeof(MyClass).GetProperty("Autoproperty");
var mapping = new HbmProperty();
IPropertyMapper mapper = new PropertyMapper(member, mapping);
mapper.Formulas("formula1", "formula2", "formula3");

Assert.That(mapping.formula, Is.Null);
Assert.That(mapping.Items, Has.Length.EqualTo(3));
Assert.That(
mapping.Items.Cast<HbmFormula>().Select(f => f.Text.Single()),
Is.EquivalentTo(new[] { "formula1", "formula2", "formula3" }));
}

[Test]
public void WhenSetUpdateThenSetAttributes()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public void CheckElement()
}
}

[Test, Ignore("Needs an unrelated additional simple fix in OneToManyPersister")]
[Test]
public void CheckMapKey()
{
using (var session = OpenSession())
Expand Down
4 changes: 1 addition & 3 deletions src/NHibernate.Test/NHSpecificTest/GH1759/Mappings.hbm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@
</element>
</set>

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

<!-- This is functionaly quite broken as the primary key does not include the map-key, which forbids
to add the same comment for two distinct users. A fix would be to map the element as a composite
Expand Down
12 changes: 12 additions & 0 deletions src/NHibernate/Mapping/ByCode/IColumnOrFormulaMapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace NHibernate.Mapping.ByCode
{
public interface IColumnOrFormulaMapper : IColumnMapper
{
/// <summary>
/// Maps a formula.
/// </summary>
/// <param name="formula">The formula to map.</param>
/// <remarks>Replaces any previously mapped column attribute.</remarks>
void Formula(string formula);
}
}
Loading