diff --git a/src/Marten.Testing/Documents/Target.cs b/src/Marten.Testing/Documents/Target.cs index 1c9dd017ac..2dfaa5f01c 100644 --- a/src/Marten.Testing/Documents/Target.cs +++ b/src/Marten.Testing/Documents/Target.cs @@ -20,6 +20,9 @@ public enum Colors public class Target { + public record Nested(Target[] Targets); + + public Nested NestedObject { get; set; } private static readonly Random _random = new Random(67); private static readonly string[] _strings = @@ -64,7 +67,7 @@ public static Target Random(bool deep = false, bool includeFSharpUnionTypes = fa target.Number = _random.Next(); target.AnotherNumber = _random.Next(); target.OtherGuid = Guid.NewGuid(); - + target.Flag = _random.Next(0, 10) > 5; target.Float = float.Parse(_random.NextDouble().ToString()); @@ -120,6 +123,7 @@ public static Target Random(bool deep = false, bool includeFSharpUnionTypes = fa if (deep) { + target.NestedObject = new Nested(new []{Random(), Random()}); target.Inner = Random(); var number = _random.Next(1, 10); diff --git a/src/Marten/Schema/SQL/mt_jsonb_patch.sql b/src/Marten/Schema/SQL/mt_jsonb_patch.sql index c531871c7a..b107311bfa 100644 --- a/src/Marten/Schema/SQL/mt_jsonb_patch.sql +++ b/src/Marten/Schema/SQL/mt_jsonb_patch.sql @@ -16,7 +16,7 @@ BEGIN patch_expression = null; IF (patch->>'type') IN ('remove', 'append_if_not_exists', 'insert_if_not_exists') AND (patch->>'expression') IS NOT NULL THEN - patch_expression = jsonb_path_query_array(retval->(patch->>'path'), (patch->>'expression')::jsonpath); + patch_expression = jsonb_path_query_array(retval #> patch_path, (patch->>'expression')::jsonpath); END IF; CASE patch->>'type' diff --git a/src/PatchingTests/Patching/patching_api.cs b/src/PatchingTests/Patching/patching_api.cs index 258bdff513..2a998071b7 100644 --- a/src/PatchingTests/Patching/patching_api.cs +++ b/src/PatchingTests/Patching/patching_api.cs @@ -830,6 +830,25 @@ public async Task remove_complex_elements_by_predicate() #endregion + [Fact] + public async Task remove_complex_nested_elements_by_predicate(){ + var target = Target.Random(true); + var random = new Random(); + var initiallength = target.NestedObject.Targets.Length; + var randomitem = target.NestedObject.Targets[random.Next(0, initiallength)]; + + theSession.Store(target); + await theSession.SaveChangesAsync(); + + theSession.Patch(target.Id).Remove(x => x.NestedObject.Targets, x => x.Id == randomitem.Id); + await theSession.SaveChangesAsync(); + + await using var query = theStore.QuerySession(); + var target2 = query.Load(target.Id); + target2.NestedObject.Targets.Length.ShouldBe(initiallength - 1); + target2.NestedObject.Targets.ShouldNotContain(x => x.Id == randomitem.Id); + } + [Fact] public async Task throw_exception_if_a_method_call_is_used_for_remove_complex_element_by_predicate() {