Skip to content

Commit 557123e

Browse files
authored
Adding comma separators to flag enums (#241)
1 parent a2f3f70 commit 557123e

File tree

5 files changed

+43
-12
lines changed

5 files changed

+43
-12
lines changed

src/Redis.OM/Modeling/RedisSchemaField.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ private static string GetSearchFieldType(Type declaredType, SearchFieldAttribute
158158
return TypeDeterminationUtilities.IsNumeric(declaredType) ? "NUMERIC" : "TAG";
159159
}
160160

161+
private static bool IsEnumTypeFlags(Type type) => type.GetCustomAttributes(typeof(FlagsAttribute), false).Any();
162+
161163
private static string[] CommonSerialization(SearchFieldAttribute attr, Type declaredType, PropertyInfo propertyInfo)
162164
{
163165
var searchFieldType = GetSearchFieldType(declaredType, attr, propertyInfo);
@@ -189,6 +191,11 @@ private static string[] CommonSerialization(SearchFieldAttribute attr, Type decl
189191
ret.Add("SEPARATOR");
190192
ret.Add(tag.Separator.ToString());
191193
}
194+
else if (declaredType.IsEnum && IsEnumTypeFlags(declaredType))
195+
{
196+
ret.Add("SEPARATOR");
197+
ret.Add(",");
198+
}
192199

193200
if (tag.CaseSensitive)
194201
{
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Redis.OM.Unit.Tests.RediSearchTests;
5+
6+
[Flags]
7+
[JsonConverter(typeof(JsonStringEnumConverter))]
8+
public enum EnumFlags
9+
{
10+
None = 0,
11+
One = 1 << 0,
12+
Two = 1 << 1,
13+
Three = 1 << 2
14+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public class ObjectWithStringLikeValueTypes
2222

2323
[Indexed]
2424
public AnEnum AnEnumAsInt { get; set; }
25+
26+
[Indexed]
27+
[JsonConverter(typeof(JsonStringEnumConverter))]
28+
public EnumFlags Flags { get; set; }
2529
}
2630

2731
[Document]

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,17 @@ public async Task TestStatelessCollection()
860860
Assert.Equal(0,collection.StateManager.Snapshot.Count);
861861
}
862862

863+
864+
[Fact]
865+
public async Task TestFlagEnumQuery()
866+
{
867+
var collection = new RedisCollection<ObjectWithStringLikeValueTypes>(_connection, false, 10000);
868+
var obj = new ObjectWithStringLikeValueTypes { Flags = EnumFlags.One | EnumFlags.Two };
869+
await collection.InsertAsync(obj);
870+
var res = await collection.FirstOrDefaultAsync(x => x.Flags == EnumFlags.One);
871+
Assert.NotNull(res);
872+
}
873+
863874
public void CompareTimestamps(DateTime ts1, DateTime ts2)
864875
{
865876
Assert.Equal(ts1.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fff", CultureInfo.InvariantCulture), ts2.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fff", CultureInfo.InvariantCulture));

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ public async Task TestUpdateJsonName()
792792
var steve = collection.First(x => x.Name == "Steve");
793793
steve.Name = "Bob";
794794
await collection.UpdateAsync(steve);
795-
_mock.Verify(x=>x.ExecuteAsync("EVALSHA","42","1","Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET","$.Name","\"Bob\""));
795+
_mock.Verify(x=>x.ExecuteAsync("EVALSHA",It.IsAny<string>(),"1","Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET","$.Name","\"Bob\""));
796796
Scripts.ShaCollection.Clear();
797797
}
798798

@@ -1630,17 +1630,12 @@ public async Task TestCreateIndexWithStringlikeValueTypes()
16301630
"1",
16311631
"Redis.OM.Unit.Tests.RediSearchTests.ObjectWithStringLikeValueTypes:",
16321632
"SCHEMA",
1633-
"$.Ulid",
1634-
"AS",
1635-
"Ulid",
1636-
"TAG", "SEPARATOR", "|",
1637-
"$.Boolean",
1638-
"AS",
1639-
"Boolean",
1640-
"TAG", "SEPARATOR", "|",
1641-
"$.Guid",
1642-
"AS", "Guid", "TAG", "SEPARATOR", "|", "$.AnEnum", "AS", "AnEnum", "TAG",
1643-
"$.AnEnumAsInt", "AS", "AnEnumAsInt","NUMERIC"
1633+
"$.Ulid", "AS", "Ulid", "TAG", "SEPARATOR", "|",
1634+
"$.Boolean", "AS", "Boolean", "TAG", "SEPARATOR", "|",
1635+
"$.Guid", "AS", "Guid", "TAG", "SEPARATOR", "|",
1636+
"$.AnEnum", "AS", "AnEnum", "TAG",
1637+
"$.AnEnumAsInt", "AS", "AnEnumAsInt","NUMERIC",
1638+
"$.Flags", "AS", "Flags", "TAG", "SEPARATOR", ","
16441639
));
16451640
}
16461641

0 commit comments

Comments
 (0)