Skip to content

Commit 98b05b2

Browse files
committed
Don't forget about global mappers
1 parent ab7e43e commit 98b05b2

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

StaTypPocoQueries.PetaPoco.Tests/QueryTests.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,7 @@ public QueryTests()
6565
_mockDb.Setup(m => m.Provider).Returns(new AngleDatabaseProvider());
6666
_mockDb.Setup(m => m.DefaultMapper).Returns(new ConventionMapper());
6767

68-
FlushPocoDataCache();
69-
}
70-
71-
private void FlushPocoDataCache()
72-
{
73-
// This avoids having to upgrade PP just to get FlushCaches()
74-
var cache = typeof(PocoData).GetField("_pocoDatas", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
75-
var flush = cache.GetType().GetMethod("Flush");
76-
flush.Invoke(cache, null);
68+
Mappers.RevokeAll();
7769
}
7870

7971
[Theory, AutoData]
@@ -112,19 +104,37 @@ public void Query_Should_Use_Plain_Value_With_No_Value_Converter(FoodEnum food)
112104
}
113105

114106
[Theory, AutoData]
115-
public void Query_Should_Use_Mapper_For_Names(string value)
107+
public void Query_Should_Use_Default_Mapper_For_Names(string value)
116108
{
117109
_mockDb.Setup(m => m.DefaultMapper).Returns(new UnderscoreMapper());
118110
_mockDb.Object.Query<MyClass>(c => c.MultiWordName == value);
119111
_lastSql.Should().BeEquivalentTo(new Sql("WHERE <multi_word_name> = @0", value));
120112
}
121113

122114
[Theory, AutoData]
123-
public void Query_Should_Use_Mapper_For_Values(string value)
115+
public void Query_Should_Use_Default_Mapper_For_Values(string value)
124116
{
125117
_mockDb.Setup(m => m.DefaultMapper).Returns(new SubstituteStringMapper());
126118
_mockDb.Object.Query<MyClass>(c => c.Name == value);
127119
_lastSql.Should().BeEquivalentTo(new Sql("WHERE <Name> = @0", "SUBSTITUTE STRING"));
128120
}
121+
122+
[Theory, AutoData]
123+
public void Query_Should_Use_Global_Mapper_For_Names(string value)
124+
{
125+
Mappers.Register(typeof(MyClass), new UnderscoreMapper());
126+
127+
_mockDb.Object.Query<MyClass>(c => c.MultiWordName == value);
128+
_lastSql.Should().BeEquivalentTo(new Sql("WHERE <multi_word_name> = @0", value));
129+
}
130+
131+
[Theory, AutoData]
132+
public void Query_Should_Use_Global_Mapper_For_Values(string value)
133+
{
134+
Mappers.Register(typeof(MyClass), new SubstituteStringMapper());
135+
136+
_mockDb.Object.Query<MyClass>(c => c.Name == value);
137+
_lastSql.Should().BeEquivalentTo(new Sql("WHERE <Name> = @0", "SUBSTITUTE STRING"));
138+
}
129139
}
130140
}

StaTypPocoQueries.PetaPoco/SqlTranslator.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,33 @@ public Sql Translate<T>(FSharpExpr<FSharpFunc<T, bool>> query)
6464

6565
private string GetColumnName(MemberInfo mi)
6666
{
67+
var result = mi.Name;
68+
6769
if (mi is PropertyInfo pi)
6870
{
69-
var pd = PocoData.ForType(mi.DeclaringType, _db.DefaultMapper);
70-
return pd.GetColumnName(pi.Name);
71+
var mapper = GetMapper(pi);
72+
73+
try
74+
{
75+
var ci = mapper.GetColumnInfo(pi);
76+
result = ci.ColumnName;
77+
}
78+
catch { }
7179
}
72-
else
73-
return mi.Name;
80+
81+
return result;
7482
}
7583

7684

7785
private object GetConvertedValue(PropertyInfo pi, object input)
7886
{
79-
var converter = _db.DefaultMapper.GetToDbConverter(pi);
87+
var mapper = GetMapper(pi);
88+
var converter = mapper.GetToDbConverter(pi);
8089
return converter == null ? input : converter(input);
8190
}
8291

92+
private IMapper GetMapper(PropertyInfo pi) => Mappers.GetMapper(pi.DeclaringType, _db.DefaultMapper);
93+
8394
private FSharpFunc<MemberInfo, string> FsGetColumnName
8495
=> ExpressionToSql.AsFsFunc<MemberInfo, string>(GetColumnName);
8596

0 commit comments

Comments
 (0)