Skip to content

Commit fb8b9af

Browse files
committed
Added ApplyFilter support to Class, HasMany, and HasManyToMany conventions
1 parent 9a172ff commit fb8b9af

19 files changed

+571
-22
lines changed

src/FluentNHibernate.5.1.ReSharper

Lines changed: 233 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using System.Linq;
3+
using FluentNHibernate.MappingModel.ClassBased;
4+
using FluentNHibernate.MappingModel.Collections;
5+
using FluentNHibernate.Specs.Conventions.Fixtures;
6+
using Machine.Specifications;
7+
8+
namespace FluentNHibernate.Specs.Conventions
9+
{
10+
public class when_applying_a_filter_to_an_entity_using_conventions
11+
{
12+
Establish context = () =>
13+
{
14+
model = new FluentNHibernate.PersistenceModel();
15+
model.Conventions.Add<FilterClassConvention>();
16+
model.Add(new FilterTargetMap());
17+
};
18+
19+
Because of = () =>
20+
mapping = model.BuildMappingFor<FilterTarget>();
21+
22+
It should_add_a_filter_to_the_entity_s_mapping = () =>
23+
mapping.Filters.ShouldNotBeEmpty();
24+
25+
It should_set_the_name_of_the_added_filter_correctly = () =>
26+
mapping.Filters.Single().Name.ShouldEqual(FilterClassConvention.FilterName);
27+
28+
It should_set_the_condition_of_the_added_filter_correctly = () =>
29+
mapping.Filters.Single().Name.ShouldEqual(FilterClassConvention.FilterName);
30+
31+
static FluentNHibernate.PersistenceModel model;
32+
static ClassMapping mapping;
33+
}
34+
35+
public class when_applying_a_filter_to_a_one_to_many_using_conventions
36+
{
37+
Establish context = () =>
38+
{
39+
model = new FluentNHibernate.PersistenceModel();
40+
model.Conventions.Add<FilterHasManyConvention>();
41+
model.Add(new FilterTargetMap());
42+
model.Add(new FilterChildTargetMap());
43+
};
44+
45+
Because of = () =>
46+
{
47+
var classMapping = model.BuildMappingFor<FilterTarget>();
48+
mapping = classMapping.Collections.Single(x => x.Relationship is OneToManyMapping);
49+
};
50+
51+
It should_add_a_filter_to_the_one_to_many_relationship_s_mapping = () =>
52+
mapping.Filters.ShouldNotBeEmpty();
53+
54+
It should_set_the_name_of_the_added_filter_correctly = () =>
55+
mapping.Filters.Single().Name.ShouldEqual(FilterHasManyConvention.FilterName);
56+
57+
It should_set_the_condition_of_the_added_filter_correctly = () =>
58+
mapping.Filters.Single().Name.ShouldEqual(FilterHasManyConvention.FilterName);
59+
60+
static FluentNHibernate.PersistenceModel model;
61+
static ICollectionMapping mapping;
62+
}
63+
64+
public class when_applying_a_filter_to_a_many_to_many_using_conventions
65+
{
66+
Establish context = () =>
67+
{
68+
model = new FluentNHibernate.PersistenceModel();
69+
model.Conventions.Add<FilterHasManyToManyConvention>();
70+
model.Add(new FilterTargetMap());
71+
model.Add(new FilterChildTargetMap());
72+
};
73+
74+
Because of = () =>
75+
{
76+
var classMapping = model.BuildMappingFor<FilterTarget>();
77+
mapping = classMapping.Collections.Single(x => x.Relationship is ManyToManyMapping);
78+
};
79+
80+
It should_add_a_filter_to_the_one_to_many_relationship_s_mapping = () =>
81+
mapping.Filters.ShouldNotBeEmpty();
82+
83+
It should_set_the_name_of_the_added_filter_correctly = () =>
84+
mapping.Filters.Single().Name.ShouldEqual(FilterHasManyConvention.FilterName);
85+
86+
It should_set_the_condition_of_the_added_filter_correctly = () =>
87+
mapping.Filters.Single().Name.ShouldEqual(FilterHasManyConvention.FilterName);
88+
89+
static FluentNHibernate.PersistenceModel model;
90+
static ICollectionMapping mapping;
91+
}
92+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using FluentNHibernate.Conventions;
2+
using FluentNHibernate.Conventions.Instances;
3+
4+
namespace FluentNHibernate.Specs.Conventions.Fixtures
5+
{
6+
public class FilterClassConvention : IClassConvention
7+
{
8+
public const string FilterName = "TestFilterName";
9+
public const string FilterCondition = "TestFilterCondition";
10+
11+
public void Apply(IClassInstance instance)
12+
{
13+
instance.ApplyFilter(FilterName, FilterCondition);
14+
}
15+
}
16+
17+
public class FilterHasManyConvention : IHasManyConvention
18+
{
19+
public const string FilterName = "TestFilterName";
20+
public const string FilterCondition = "TestFilterCondition";
21+
22+
public void Apply(IOneToManyCollectionInstance instance)
23+
{
24+
instance.ApplyFilter(FilterName, FilterCondition);
25+
}
26+
}
27+
28+
public class FilterHasManyToManyConvention : IHasManyToManyConvention
29+
{
30+
public const string FilterName = "TestFilterName";
31+
public const string FilterCondition = "TestFilterCondition";
32+
33+
public void Apply(IManyToManyCollectionInstance instance)
34+
{
35+
instance.ApplyFilter(FilterName, FilterCondition);
36+
}
37+
}
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Collections.Generic;
2+
using FluentNHibernate.Mapping;
3+
4+
namespace FluentNHibernate.Specs.Conventions.Fixtures
5+
{
6+
public class FilterTarget
7+
{
8+
public int Id { get; set; }
9+
public IList<FilterChildTarget> ChildOneToMany { get; set; }
10+
public IList<FilterChildTarget> ChildManyToMany { get; set; }
11+
}
12+
13+
public class FilterChildTarget
14+
{
15+
public int Id { get; set; }
16+
}
17+
18+
public class FilterTargetMap : ClassMap<FilterTarget>
19+
{
20+
public FilterTargetMap()
21+
{
22+
Id(x => x.Id);
23+
HasMany(x => x.ChildOneToMany);
24+
HasManyToMany(x => x.ChildManyToMany);
25+
}
26+
}
27+
28+
public class FilterChildTargetMap : ClassMap<FilterChildTarget>
29+
{
30+
public FilterChildTargetMap()
31+
{
32+
Id(x => x.Id);
33+
}
34+
}
35+
}

src/FluentNHibernate.Specs/FluentNHibernate.Specs.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,11 @@
9393
<Compile Include="Automapping\Fixtures\StubTypeSource.cs" />
9494
<Compile Include="Automapping\PrivateAutomapperSpecs.cs" />
9595
<Compile Include="Automapping\PrivateFieldsSpecs.cs" />
96+
<Compile Include="Conventions\ApplyFilterSpecs.cs" />
9697
<Compile Include="Conventions\ConventionBuilderSpecs.cs" />
9798
<Compile Include="Conventions\Fixtures\Child.cs" />
99+
<Compile Include="Conventions\Fixtures\FilterClassConvention.cs" />
100+
<Compile Include="Conventions\Fixtures\FilterTarget.cs" />
98101
<Compile Include="Conventions\Fixtures\SetCollectionEntity.cs" />
99102
<Compile Include="Conventions\Fixtures\SetCollectionEntityMap.cs" />
100103
<Compile Include="Conventions\Fixtures\SetCompositeElementCollectionEntity.cs" />

src/FluentNHibernate.Testing/MappingModel/Equality/MappingEqualitySpecs.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public override ArrayMapping create_mapping()
6262
Schema = "schema", Subselect = "subselect", TableName = "table", Where = "where"
6363
};
6464

65-
mapping.Filters.Add(new FilterMapping());
65+
mapping.AddFilter(new FilterMapping());
6666

6767
return mapping;
6868
}
@@ -92,7 +92,7 @@ public override BagMapping create_mapping()
9292
Schema = "schema", Subselect = "subselect", TableName = "table", Where = "where"
9393
};
9494

95-
mapping.Filters.Add(new FilterMapping());
95+
mapping.AddFilter(new FilterMapping());
9696

9797
return mapping;
9898
}
@@ -796,7 +796,7 @@ public override ListMapping create_mapping()
796796
Schema = "schema", Subselect = "subselect", TableName = "table", Where = "where"
797797
};
798798

799-
mapping.Filters.Add(new FilterMapping());
799+
mapping.AddFilter(new FilterMapping());
800800

801801
return mapping;
802802
}
@@ -893,7 +893,7 @@ public override MapMapping create_mapping()
893893
Sort = "sort"
894894
};
895895

896-
mapping.Filters.Add(new FilterMapping());
896+
mapping.AddFilter(new FilterMapping());
897897

898898
return mapping;
899899
}
@@ -1076,7 +1076,7 @@ public override SetMapping create_mapping()
10761076
Sort = "sort"
10771077
};
10781078

1079-
mapping.Filters.Add(new FilterMapping());
1079+
mapping.AddFilter(new FilterMapping());
10801080

10811081
return mapping;
10821082
}

src/FluentNHibernate/Conventions/Instances/ClassInstance.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Diagnostics;
3+
using System.Linq;
34
using FluentNHibernate.Conventions.Inspections;
5+
using FluentNHibernate.Mapping;
46
using FluentNHibernate.MappingModel;
57
using FluentNHibernate.MappingModel.ClassBased;
68

@@ -126,5 +128,29 @@ public void Table(string tableName)
126128
if (!mapping.IsSpecified("Proxy"))
127129
mapping.Proxy = type;
128130
}
131+
132+
public void ApplyFilter(string name, string condition)
133+
{
134+
mapping.AddFilter(new FilterMapping
135+
{
136+
Name = name,
137+
Condition = condition
138+
});
139+
}
140+
141+
public void ApplyFilter(string name)
142+
{
143+
ApplyFilter(name, null);
144+
}
145+
146+
public void ApplyFilter<TFilter>(string condition) where TFilter : FilterDefinition, new()
147+
{
148+
ApplyFilter(new TFilter().Name, condition);
149+
}
150+
151+
public void ApplyFilter<TFilter>() where TFilter : FilterDefinition, new()
152+
{
153+
ApplyFilter<TFilter>(null);
154+
}
129155
}
130156
}

src/FluentNHibernate/Conventions/Instances/CollectionInstance.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,29 @@ public ICollectionInstance Not
212212
{
213213
get { return new KeyInstance(mapping.Key); }
214214
}
215+
216+
public void ApplyFilter(string name, string condition)
217+
{
218+
mapping.AddFilter(new FilterMapping
219+
{
220+
Name = name,
221+
Condition = condition
222+
});
223+
}
224+
225+
public void ApplyFilter(string name)
226+
{
227+
ApplyFilter(name, null);
228+
}
229+
230+
public void ApplyFilter<TFilter>(string condition) where TFilter : FilterDefinition, new()
231+
{
232+
ApplyFilter(new TFilter().Name, condition);
233+
}
234+
235+
public void ApplyFilter<TFilter>() where TFilter : FilterDefinition, new()
236+
{
237+
ApplyFilter<TFilter>(null);
238+
}
215239
}
216240
}

src/FluentNHibernate/Conventions/Instances/IClassInstance.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,37 @@ public interface IClassInstance : IClassInspector
2424
new void Proxy<T>();
2525
new void Proxy(Type type);
2626
new void Proxy(string type);
27+
28+
/// <summary>
29+
/// Applies a filter to this entity given its name.
30+
/// </summary>
31+
/// <param name="name">The filter's name</param>
32+
/// <param name="condition">The condition to apply</param>
33+
void ApplyFilter(string name, string condition);
34+
35+
/// <summary>
36+
/// Applies a filter to this entity given its name.
37+
/// </summary>
38+
/// <param name="name">The filter's name</param>
39+
void ApplyFilter(string name);
40+
41+
/// <summary>
42+
/// Applies a named filter to this entity.
43+
/// </summary>
44+
/// <param name="condition">The condition to apply</param>
45+
/// <typeparam name="TFilter">
46+
/// The type of a <see cref="FilterDefinition"/> implementation
47+
/// defining the filter to apply.
48+
/// </typeparam>
49+
void ApplyFilter<TFilter>(string condition) where TFilter : FilterDefinition, new();
50+
51+
/// <summary>
52+
/// Applies a named filter to this entity.
53+
/// </summary>
54+
/// <typeparam name="TFilter">
55+
/// The type of a <see cref="FilterDefinition"/> implementation
56+
/// defining the filter to apply.
57+
/// </typeparam>
58+
void ApplyFilter<TFilter>() where TFilter : FilterDefinition, new();
2759
}
2860
}

src/FluentNHibernate/Conventions/Instances/IManyToManyCollectionInstance.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Diagnostics;
22
using FluentNHibernate.Conventions.Inspections;
3+
using FluentNHibernate.Mapping;
34

45
namespace FluentNHibernate.Conventions.Instances
56
{
@@ -10,5 +11,37 @@ public interface IManyToManyCollectionInstance : IManyToManyCollectionInspector,
1011
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
1112
new IManyToManyCollectionInstance Not { get; }
1213
new IManyToManyCollectionInstance OtherSide { get; }
14+
15+
/// <summary>
16+
/// Applies a filter to this relationship given its name.
17+
/// </summary>
18+
/// <param name="name">The filter's name</param>
19+
/// <param name="condition">The condition to apply</param>
20+
void ApplyFilter(string name, string condition);
21+
22+
/// <summary>
23+
/// Applies a filter to this relationship given its name.
24+
/// </summary>
25+
/// <param name="name">The filter's name</param>
26+
void ApplyFilter(string name);
27+
28+
/// <summary>
29+
/// Applies a named filter to this relationship.
30+
/// </summary>
31+
/// <param name="condition">The condition to apply</param>
32+
/// <typeparam name="TFilter">
33+
/// The type of a <see cref="FilterDefinition"/> implementation
34+
/// defining the filter to apply.
35+
/// </typeparam>
36+
void ApplyFilter<TFilter>(string condition) where TFilter : FilterDefinition, new();
37+
38+
/// <summary>
39+
/// Applies a named filter to this relationship.
40+
/// </summary>
41+
/// <typeparam name="TFilter">
42+
/// The type of a <see cref="FilterDefinition"/> implementation
43+
/// defining the filter to apply.
44+
/// </typeparam>
45+
void ApplyFilter<TFilter>() where TFilter : FilterDefinition, new();
1346
}
1447
}

src/FluentNHibernate/Conventions/Instances/IManyToManyInstance.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FluentNHibernate.Conventions.Inspections;
2+
using FluentNHibernate.Mapping;
23
using FluentNHibernate.MappingModel;
34

45
namespace FluentNHibernate.Conventions.Instances

0 commit comments

Comments
 (0)