public void CanResolveOneEmptyArraysAndOneWithValue()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["name"] = new DynamicJsonArray {
                    1
                };
                obj2["name"] = new DynamicJsonArray();

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderArray name;
                resolvled.TryGet("name", out name);
                Assert.Equal(">>>> auto merged array start", name[0].ToString());
                Assert.Equal((long)1, name[1]);
                Assert.Equal("<<<< auto merged array end", name[2].ToString());
            }
        }
        public void CanDetectAndSuggestOptionsForConflict_SimpleMetadata()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["@metadata"] = new DynamicJsonValue
                {
                    ["Name"] = "Oren"
                };
                obj2["@metadata"] = new DynamicJsonValue
                {
                    ["Name"] = "Ayende"
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Metadata;

                BlittableJsonReaderArray name;
                resolvled.TryGet("Name", out name);
                Assert.Equal(">>>> conflict start", name[0].ToString());
                Assert.Equal("Oren", name[1].ToString());
                Assert.Equal("Ayende", name[2].ToString());
                Assert.Equal("<<<< conflict end", name[3].ToString());
            }
        }
        public void CanResolveTwoEmptyArraysInMetadata()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["@metadata"] = new DynamicJsonValue
                {
                    ["Foo"] = new DynamicJsonArray()
                };
                obj2["@metadata"] = new DynamicJsonValue
                {
                    ["Foo"] = new DynamicJsonArray()
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Metadata;

                BlittableJsonReaderArray foo;
                resolvled.TryGet("Foo", out foo);
                Assert.Equal(0, foo.Length);
            }
        }
        public void CanMergeAdditionalMetadata()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["@metadata"] = new DynamicJsonValue
                {
                    ["Name"] = "Oren"
                };
                obj2["@metadata"] = new DynamicJsonValue
                {
                    ["Age"] = 2
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Metadata;

                string name;
                int    age;
                resolvled.TryGet("Name", out name);
                resolvled.TryGet("Age", out age);
                Assert.Equal("Oren", name);
                Assert.Equal(2, age);
            }
        }
        public void CanMergeArrays()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["Nicks"] = new DynamicJsonArray {
                    "Oren"
                };
                obj2["Nicks"] = new DynamicJsonArray {
                    "Ayende"
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderArray nicks;
                resolvled.TryGet("Nicks", out nicks);
                Assert.Equal(">>>> auto merged array start", nicks[0].ToString());
                Assert.Equal("Oren", nicks[1].ToString());
                Assert.Equal("Ayende", nicks[2].ToString());
                Assert.Equal("<<<< auto merged array end", nicks[3].ToString());
            }
        }
        public void CanMergeArrays_SameStart()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["Comments"] = new DynamicJsonArray {
                    1, 2, 4
                };
                obj2["Comments"] = new DynamicJsonArray {
                    1, 2, 5
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderArray comments;
                resolvled.TryGet("Comments", out comments);
                Assert.Equal(">>>> auto merged array start", comments[0].ToString());
                Assert.Equal((long)1, comments[1]);
                Assert.Equal((long)2, comments[2]);
                Assert.Equal((long)4, comments[3]);
                Assert.Equal((long)5, comments[4]);
                Assert.Equal("<<<< auto merged array end", comments[5].ToString());
            }
        }
        public void CanDetectConflict_DifferentValues()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["Name"] = new DynamicJsonValue
                {
                    ["First"] = "Oren"
                };
                obj2["Name"] = "Eini";

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderArray name;
                resolvled.TryGet("Name", out name);
                Assert.Equal(">>>> conflict start", name[0].ToString());
                Assert.Equal("Oren", ((BlittableJsonReaderObject)name[1])["First"].ToString());
                Assert.Equal("Eini", name[2].ToString());
                Assert.Equal("<<<< conflict end", name[3].ToString());
            }
        }
        public void CanMergeProperties_Nested()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["Name"] = new DynamicJsonValue
                {
                    ["First"] = "Oren"
                };
                obj2["Name"] = new DynamicJsonValue
                {
                    ["Last"] = "Eini"
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderObject name;
                resolvled.TryGet("Name", out name);
                Assert.Equal("Oren", name["First"].ToString());
                Assert.Equal("Eini", name["Last"].ToString());
            }
        }
        public void CanResolveOneEmptyArraysAndOneWithValueInMetadata()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["@metadata"] = new DynamicJsonValue
                {
                    ["Foo"] = new DynamicJsonArray {
                        1
                    }
                };
                obj2["@metadata"] = new DynamicJsonValue
                {
                    ["Foo"] = new DynamicJsonArray()
                };

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Metadata;

                BlittableJsonReaderArray foo;
                resolvled.TryGet("Foo", out foo);
                Assert.Equal(">>>> auto merged array start", foo[0].ToString());
                Assert.Equal((long)1, foo[1]);
                Assert.Equal("<<<< auto merged array end", foo[2].ToString());
            }
        }
        public void CanResolveEmpty()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                Assert.Equal(0, resolvled.Count);
            }
        }
Beispiel #11
0
        public async Task SuggestConflictResolution()
        {
            var docId = GetQueryStringValueAndAssertIfSingleAndNotEmpty("docId");

            using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
                await using (var writer = new AsyncBlittableJsonTextWriter(context, ResponseBodyStream()))
                    using (context.OpenReadTransaction())
                    {
                        var conflicts = context.DocumentDatabase.DocumentsStorage.ConflictsStorage.GetConflictsFor(context, docId);
                        var advisor   = new ConflictResolverAdvisor(conflicts.Select(c => c.Doc), context);
                        var resolved  = advisor.Resolve();

                        context.Write(writer, new DynamicJsonValue
                        {
                            [nameof(ConflictResolverAdvisor.MergeResult.Document)] = resolved.Document,
                            [nameof(ConflictResolverAdvisor.MergeResult.Metadata)] = resolved.Metadata
                        });
                    }
        }
        public void CanResolveTwoEmptyArrays()
        {
            using (var ctx = new JsonOperationContext(4096, 16 * 1024, 32 * 1024, SharedMultipleUseFlag.None))
            {
                DynamicJsonValue obj1 = new DynamicJsonValue();
                DynamicJsonValue obj2 = new DynamicJsonValue();
                obj1["name"] = new DynamicJsonArray();
                obj2["name"] = new DynamicJsonArray();

                var conflictResovlerAdvisor = new ConflictResolverAdvisor(
                    new List <BlittableJsonReaderObject> {
                    ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")
                },
                    ctx);
                var resolvled = conflictResovlerAdvisor.Resolve().Document;

                BlittableJsonReaderArray name;
                resolvled.TryGet("name", out name);
                Assert.Equal(0, name.Length);
            }
        }