Skip to content

Commit 7d119b6

Browse files
authored
fixing paths to nested objects in various predicates (#296)
1 parent 4ff9633 commit 7d119b6

File tree

3 files changed

+78
-4
lines changed

3 files changed

+78
-4
lines changed

src/Redis.OM/Common/ExpressionTranslator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ private static string GetFieldName(Expression exp)
375375

376376
if (exp is MemberExpression member)
377377
{
378-
return $"{member.Member.Name}";
378+
return ExpressionParserUtilities.GetSearchFieldNameFromMember(member);
379379
}
380380

381381
if (exp is MethodCallExpression method)
@@ -411,7 +411,7 @@ private static string[] GetFieldNamesForExpression(Expression exp)
411411

412412
if (exp is MemberExpression member)
413413
{
414-
return new[] { $"{member.Member.Name}" };
414+
return new[] { ExpressionParserUtilities.GetSearchFieldNameFromMember(member) };
415415
}
416416

417417
if (exp is MethodCallExpression method)
@@ -431,7 +431,7 @@ private static string[] GetFieldNamesForExpression(Expression exp)
431431

432432
if (exp is NewExpression newExpression)
433433
{
434-
return newExpression.Members != null ? newExpression.Members.Select(x => $"{x.Name}").ToArray() : Array.Empty<string>();
434+
return newExpression.Members != null ? newExpression.Arguments.Select(GetFieldName).ToArray() : Array.Empty<string>();
435435
}
436436

437437
throw new ArgumentException("Invalid expression type detected");
@@ -582,7 +582,7 @@ private static RedisSortBy TranslateOrderByMethod(MethodCallExpression expressio
582582
var predicate = (UnaryExpression)expression.Arguments[1];
583583
var lambda = (LambdaExpression)predicate.Operand;
584584
var memberExpression = (MemberExpression)lambda.Body;
585-
sb.Field = memberExpression.Member.Name;
585+
sb.Field = ExpressionParserUtilities.GetSearchFieldNameFromMember(memberExpression);
586586
sb.Direction = ascending ? SortDirection.Ascending : SortDirection.Descending;
587587
return sb;
588588
}

test/Redis.OM.Unit.Tests/RediSearchTests/AggregationSetTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,5 +386,45 @@ public void TestMultipleOrderBys()
386386
_ = collection.OrderBy(x => x.RecordShell.Name).OrderByDescending(x => x.RecordShell.Age).ToList();
387387
_mock.Verify(x=>x.Execute("FT.AGGREGATE","person-idx", "*", "SORTBY", "4", "@Name", "ASC", "@Age", "DESC", "WITHCURSOR", "COUNT", "10000"));
388388
}
389+
390+
[Fact]
391+
public void TestNestedOrderBy()
392+
{
393+
var collection = new RedisAggregationSet<Person>(_mock.Object, true, chunkSize: 10000);
394+
_mock.Setup(x => x.Execute("FT.AGGREGATE", It.IsAny<string[]>())).Returns(MockedResult);
395+
_mock.Setup(x => x.Execute("FT.CURSOR", It.IsAny<string[]>())).Returns(MockedResultCursorEnd);
396+
_ = collection.OrderBy(x => x.RecordShell.Address.State).ToList();
397+
_mock.Verify(x=>x.Execute("FT.AGGREGATE","person-idx", "*", "SORTBY", "2", "@Address_State", "ASC", "WITHCURSOR", "COUNT", "10000"));
398+
}
399+
400+
[Fact]
401+
public void TestNestedGroup()
402+
{
403+
var collection = new RedisAggregationSet<Person>(_mock.Object, true, chunkSize: 10000);
404+
_mock.Setup(x => x.Execute("FT.AGGREGATE", It.IsAny<string[]>())).Returns(MockedResult);
405+
_mock.Setup(x => x.Execute("FT.CURSOR", It.IsAny<string[]>())).Returns(MockedResultCursorEnd);
406+
_ = collection.GroupBy(x => x.RecordShell.Address.State).ToList();
407+
_mock.Verify(x=>x.Execute("FT.AGGREGATE","person-idx", "*", "GROUPBY", "1", "@Address_State", "WITHCURSOR", "COUNT", "10000"));
408+
}
409+
410+
[Fact]
411+
public void TestNestedGroupMulti()
412+
{
413+
var collection = new RedisAggregationSet<Person>(_mock.Object, true, chunkSize: 10000);
414+
_mock.Setup(x => x.Execute("FT.AGGREGATE", It.IsAny<string[]>())).Returns(MockedResult);
415+
_mock.Setup(x => x.Execute("FT.CURSOR", It.IsAny<string[]>())).Returns(MockedResultCursorEnd);
416+
_ = collection.GroupBy(x => new {x.RecordShell.Address.State, x.RecordShell.Address.ForwardingAddress.City}).ToList();
417+
_mock.Verify(x=>x.Execute("FT.AGGREGATE","person-idx", "*", "GROUPBY", "2", "@Address_State", "@Address_ForwardingAddress_City", "WITHCURSOR", "COUNT", "10000"));
418+
}
419+
420+
[Fact]
421+
public void TestNestedApply()
422+
{
423+
var collection = new RedisAggregationSet<Person>(_mock.Object, true, chunkSize: 10000);
424+
_mock.Setup(x => x.Execute("FT.AGGREGATE", It.IsAny<string[]>())).Returns(MockedResult);
425+
_mock.Setup(x => x.Execute("FT.CURSOR", It.IsAny<string[]>())).Returns(MockedResultCursorEnd);
426+
_ = collection.Apply(x => x.RecordShell.Address.HouseNumber + 4, "house_num_modified").ToList();
427+
_mock.Verify(x=>x.Execute("FT.AGGREGATE","person-idx", "*", "APPLY", "@Address_HouseNumber + 4", "AS", "house_num_modified", "WITHCURSOR", "COUNT", "10000"));
428+
}
389429
}
390430
}

test/Redis.OM.Unit.Tests/RediSearchTests/SearchTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,5 +2816,39 @@ public void SearchNumericEnumFieldContainsListAsProperty()
28162816
"0",
28172817
"100"));
28182818
}
2819+
2820+
[Fact]
2821+
public void TestNestedOrderBy()
2822+
{
2823+
_mock.Setup(x => x.Execute(It.IsAny<string>(), It.IsAny<string[]>()))
2824+
.Returns(_mockReply);
2825+
var collection = new RedisCollection<Person>(_mock.Object).OrderBy(x => x.Address.State).ToList();
2826+
_mock.Verify(x=>x.Execute("FT.SEARCH", "person-idx", "*", "LIMIT","0", "100", "SORTBY", "Address_State", "ASC"));
2827+
}
2828+
2829+
[Fact]
2830+
public void TestGeoFilterNested()
2831+
{
2832+
_mock.Setup(x => x.Execute(It.IsAny<string>(), It.IsAny<string[]>()))
2833+
.Returns(_mockReply);
2834+
2835+
var collection = new RedisCollection<Person>(_mock.Object);
2836+
var res = collection.GeoFilter(x => x.Address.Location, 5, 6.7, 50, GeoLocDistanceUnit.Kilometers).ToList();
2837+
Assert.Equal(32, res[0].Age);
2838+
_mock.Verify(x => x.Execute(
2839+
"FT.SEARCH",
2840+
"person-idx",
2841+
"*",
2842+
"LIMIT",
2843+
"0",
2844+
"100",
2845+
"GEOFILTER",
2846+
"Address_Location",
2847+
"5",
2848+
"6.7",
2849+
"50",
2850+
"km"
2851+
));
2852+
}
28192853
}
28202854
}

0 commit comments

Comments
 (0)