Skip to content

Commit 8427b2b

Browse files
Ihar YakimushIhar Yakimush
authored andcommitted
select transformers
1 parent 03584fa commit 8427b2b

File tree

7 files changed

+93
-2
lines changed

7 files changed

+93
-2
lines changed

SolrNet.Linq.IntegrationTests/SelectTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public void AnonymousClass()
3737
.FirstOrDefault();
3838

3939
Assert.NotNull(t1);
40+
Assert.NotNull(t1.Id);
4041
}
4142

4243
[Fact]
@@ -55,8 +56,30 @@ public void MultipleSelects()
5556
.FirstOrDefault(arg2 => arg2.Id != null);
5657

5758
Assert.NotNull(t1);
59+
Assert.NotNull(t1.Id);
5860
}
5961

62+
[Fact]
63+
public void Transformers()
64+
{
65+
var dateTime = new DateTime(2011, 1, 2, 3, 4, 5, DateTimeKind.Utc);
66+
var t1 = Product.SolrOperations.Value.AsQueryable()
67+
.Select(arg => new
68+
{
69+
ValStr = SolrExpr.Transformers.Value("qwe"),
70+
ValInt = SolrExpr.Transformers.Value((int) 1),
71+
ValFloat = SolrExpr.Transformers.Value((float) 2),
72+
ValDouble = SolrExpr.Transformers.Value((double) 3),
73+
ValDate = SolrExpr.Transformers.Value(dateTime),
74+
})
75+
.First();
76+
77+
Assert.Equal("qwe", t1.ValStr);
78+
Assert.Equal(1, t1.ValInt);
79+
Assert.Equal(2f, t1.ValFloat);
80+
Assert.Equal(3d, t1.ValDouble);
81+
Assert.Equal(dateTime, t1.ValDate);
82+
}
6083

6184
[Fact]
6285
public void Product2()
@@ -83,6 +106,7 @@ public void Product2()
83106
.FirstOrDefault();
84107

85108
Assert.NotNull(t1);
109+
Assert.NotNull(t1.Id);
86110

87111
var t2 = Product.SolrOperations.Value.AsQueryable().Where(p => p.Id != null)
88112
.Where(arg => arg.Categories.Any(s => s == "electronics"))

SolrNet.Linq.Tests/MemberExpressionExtensionsTest.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ public void DivVariable()
3333
Assert.Equal("div(sequence_i,12)", MemberContext.ForType<Product>().GetSolrMemberProduct(exp.Body));
3434
}
3535

36+
[Fact]
37+
public void TransformersValue()
38+
{
39+
Expression<Func<Product, object>> exp = (Product p) => SolrExpr.Transformers.Value("qwe");
40+
Assert.Equal("[value v='qwe']", MemberContext.ForType<Product>().GetSolrMemberProduct(exp.Body));
41+
42+
exp = (Product p) => SolrExpr.Transformers.Value(1);
43+
Assert.Equal("[value v=1 t=int]", MemberContext.ForType<Product>().GetSolrMemberProduct(exp.Body));
44+
}
45+
3646
[Fact]
3747
public void Sub()
3848
{

SolrNet.Linq/Expressions/MemberExpressionExtensions.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ public static class MemberExpressionExtensions
2828
{ typeof(Math).FullName + nameof(Math.Sqrt) ,(c,t) => $"sqrt({c.Arguments[0].GetSolrMemberProduct(t)})" },
2929
};
3030

31-
31+
private static readonly Dictionary<string, Func<MethodCallExpression, MemberContext, string>> TransformersHelper = new Dictionary<string, Func<MethodCallExpression, MemberContext, string>> {
32+
{ nameof(SolrExpr.Transformers.Value) + typeof(string).Name ,(c,t) => $"[value v='{c.Arguments[0].GetSolrMemberProduct(t)}']" },
33+
{ nameof(SolrExpr.Transformers.Value) + typeof(int).Name ,(c,t) => $"[value v={c.Arguments[0].GetSolrMemberProduct(t)} t=int]" },
34+
{ nameof(SolrExpr.Transformers.Value) + typeof(float).Name ,(c,t) => $"[value v={c.Arguments[0].GetSolrMemberProduct(t)} t=float]" },
35+
{ nameof(SolrExpr.Transformers.Value) + typeof(double).Name ,(c,t) => $"[value v={c.Arguments[0].GetSolrMemberProduct(t)} t=double]" },
36+
{ nameof(SolrExpr.Transformers.Value) + typeof(DateTime).Name ,(c,t) => $"[value v={c.Arguments[0].GetSolrMemberProduct(t)} t=date]" },
37+
};
3238

3339
internal static string GetSolrMemberProduct(this Expression exp, MemberContext context, bool disableFunctions = false)
3440
{
@@ -71,6 +77,15 @@ internal static string GetSolrMemberProduct(this Expression exp, MemberContext c
7177
{
7278
return CallHelper[key].Invoke(call, context);
7379
}
80+
81+
if (call.Method.DeclaringType == typeof(SolrExpr.Transformers))
82+
{
83+
string tkey = call.Method.Name + call.Method.ReturnType.Name;
84+
if (TransformersHelper.ContainsKey(tkey))
85+
{
86+
return TransformersHelper[tkey].Invoke(call, context);
87+
}
88+
}
7489
}
7590
}
7691

File renamed without changes.
File renamed without changes.

SolrNet.Linq/SolrExpr.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using SolrNet.Linq.Expressions;
3+
using SolrNet.Linq.Expressions.Context;
4+
5+
namespace SolrNet.Linq
6+
{
7+
public static class SolrExpr
8+
{
9+
private static T Throw<T>(T value)
10+
{
11+
throw new InvalidOperationException("This method not intended to be invoked. Use it to build expressions only");
12+
13+
}
14+
public static class Transformers
15+
{
16+
public static string Value(string value)
17+
{
18+
return Throw(value);
19+
}
20+
21+
public static int Value(int value)
22+
{
23+
return Throw(value);
24+
}
25+
26+
public static float Value(float value)
27+
{
28+
return Throw(value);
29+
}
30+
31+
public static double Value(double value)
32+
{
33+
return Throw(value);
34+
}
35+
36+
public static DateTime Value(DateTime value)
37+
{
38+
return Throw(value);
39+
}
40+
}
41+
}
42+
}

SolrNet.Linq/SolrQuery.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class SolrQuery<TEntity> : IOrderedQueryable<TEntity>
1111
public SolrQuery(SolrQueryProvider<TEntity> provider)
1212
{
1313
this.Provider = provider ?? throw new ArgumentNullException(nameof(provider));
14-
this.Expression = Expression.Constant(this);
14+
this.Expression = Expression.Constant(this);
1515
}
1616

1717
public SolrQuery(SolrQueryProvider<TEntity> provider, Expression expression)

0 commit comments

Comments
 (0)