Skip to content

Commit 71c2173

Browse files
authored
fixing update bug with DateTimeOffsets (#373)
* fixing update bug with DateTimeOffsets * slightly better orginization
1 parent 3cb0aca commit 71c2173

File tree

5 files changed

+55
-2
lines changed

5 files changed

+55
-2
lines changed

src/Redis.OM/Modeling/JsonDiff.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using System.Web;
1+
using System;
2+
using System.Linq;
3+
using System.Text.Json;
4+
using System.Web;
25
using Newtonsoft.Json.Linq;
36

47
namespace Redis.OM.Modeling
@@ -35,8 +38,25 @@ public string[] SerializeScriptArgs()
3538
{
3639
JTokenType.String => new[] { _operation, _path, $"\"{HttpUtility.JavaScriptStringEncode(_value.ToString())}\"" },
3740
JTokenType.Boolean => new[] { _operation, _path, _value.ToString().ToLower() },
41+
JTokenType.Date => SerializeAsDateTime(),
3842
_ => new[] { _operation, _path, _value.ToString() }
3943
};
4044
}
45+
46+
private string[] SerializeAsDateTime()
47+
{
48+
var jValue = (JValue)_value;
49+
if (jValue.Value is DateTimeOffset)
50+
{
51+
return new[]
52+
{
53+
_operation,
54+
_path,
55+
$"{JsonSerializer.Serialize(_value.Value<DateTimeOffset>())}",
56+
};
57+
}
58+
59+
return new[] { _operation, _path, $"{JsonSerializer.Serialize(_value.Value<DateTime>())}" };
60+
}
4161
}
4262
}

src/Redis.OM/Modeling/RedisCollectionStateManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ internal bool TryDetectDifferencesSingle(string key, object value, out IList<IOb
104104
if (DocumentAttribute.StorageType == StorageType.Json)
105105
{
106106
var dataJson = JsonSerializer.Serialize(value, RedisSerializationSettings.JsonSerializerOptions);
107-
var current = JsonConvert.DeserializeObject<JObject>(dataJson, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
107+
var current = JsonConvert.DeserializeObject<JObject>(dataJson, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.Utc });
108108
var snapshot = (JToken)Snapshot[key];
109109
var diff = FindDiff(current!, snapshot);
110110
differences = BuildJsonDifference(diff, "$", snapshot);

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,5 +1113,25 @@ public void TestSelectOnEmbeddedDocuments()
11131113
Assert.Equal("World",resNoNew.InnerInnerCascade.Tag);
11141114
Assert.Equal(42,resNoNew.InnerInnerCascade.Num);
11151115
}
1116+
1117+
[Fact]
1118+
public void SaveDateTimeOffset()
1119+
{
1120+
var obj = new ObjectWithDateTimeOffsetJson
1121+
{
1122+
Offset = DateTimeOffset.Now,
1123+
DateTime = DateTime.Now
1124+
};
1125+
var collection = new RedisCollection<ObjectWithDateTimeOffsetJson>(_connection);
1126+
collection.Insert(obj);
1127+
1128+
var intermediate = collection.First(x => x.Id == obj.Id);
1129+
intermediate.Offset = intermediate.Offset.AddMinutes(10);
1130+
intermediate.DateTime = intermediate.DateTime.AddHours(1);
1131+
collection.Update(intermediate);
1132+
var final = collection.First(x => x.Id == obj.Id);
1133+
Assert.Equal(intermediate.Offset,final.Offset);
1134+
Assert.Equal(intermediate.DateTime,final.DateTime);
1135+
}
11161136
}
11171137
}

test/Redis.OM.Unit.Tests/RedisSetupCollection.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public RedisSetup()
2929
Connection.CreateIndex(typeof(ComplexObjectWithCascadeAndJsonPath));
3030
Connection.CreateIndex(typeof(BasicJsonObjectTestSave));
3131
Connection.CreateIndex(typeof(SelectTestObject));
32+
Connection.CreateIndex(typeof(ObjectWithDateTimeOffsetJson));
3233
}
3334

3435
private IRedisConnection _connection = null;
@@ -66,6 +67,7 @@ public void Dispose()
6667
Connection.DropIndexAndAssociatedRecords(typeof(ComplexObjectWithCascadeAndJsonPath));
6768
Connection.DropIndexAndAssociatedRecords(typeof(BasicJsonObjectTestSave));
6869
Connection.DropIndexAndAssociatedRecords(typeof(SelectTestObject));
70+
Connection.DropIndexAndAssociatedRecords(typeof(ObjectWithDateTimeOffsetJson));
6971
}
7072
}
7173
}

test/Redis.OM.Unit.Tests/Serialization/ObjectWithDateTimeOffset.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,15 @@ public class ObjectWithDateTimeOffset
88
{
99
public DateTimeOffset Offset { get; set; }
1010
}
11+
12+
[Document(StorageType = StorageType.Json)]
13+
public class ObjectWithDateTimeOffsetJson
14+
{
15+
[Indexed]
16+
[RedisIdField]
17+
public string Id { get; set; }
18+
19+
public DateTimeOffset Offset { get; set; }
20+
public DateTime DateTime { get; set; }
21+
}
1122
}

0 commit comments

Comments
 (0)