示例#1
0
        public void CanResolveIdenticalMetadata()
        {
            var conflictsResolver = new ConflictsResolver(new List <RavenJObject>
            {
                new RavenJObject()
                {
                    {
                        "@metadata", new RavenJObject()
                        {
                            {
                                "Foo", "Bar"
                            }
                        }
                    }
                },
                new RavenJObject()
                {
                    {
                        "@metadata", new RavenJObject()
                        {
                            {
                                "Foo", "Bar"
                            }
                        }
                    }
                }
            });

            Assert.Equal(@"{
    ""Foo"": ""Bar""
}", conflictsResolver.Resolve().Metadata);
        }
示例#2
0
        public void CanMergeAdditionalMetadata()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Name", "Oren" }
                      } }
                },
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Age", 2 }
                      } }
                },
            });

            Assert.Equal(@"{
    ""Name"": ""Oren"",
    ""Age"": 2
}", conflictsResolver.Resolve().Metadata);
        }
示例#3
0
        public void CanMergeArrays_SameStart()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Comments", new RavenJArray {
                          1, 2, 4
                      } }
                },
                new RavenJObject
                {
                    { "Comments", new RavenJArray {
                          1, 2, 5
                      } }
                }
            });

            Assert.Equal(@"{
    ""Comments"": /*>>>> auto merged array start*/ [
        1,
        2,
        4,
        5
    ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve().Document);
        }
示例#4
0
        public void CanDetectAndSuggestOptionsForConflict_SimpleMetadata()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Name", "Oren" }
                      } }
                },
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Name", "Ayende" }
                      } }
                },
            });

            Assert.Equal(@"{
    ""Name"": /*>>>> conflict start*/ [
        ""Oren"",
        ""Ayende""
    ]/*<<<< conflict end*/
}", conflictsResolver.Resolve().Metadata);
        }
示例#5
0
        public void CanMergeProperties_Nested()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Name", new RavenJObject
                      {
                          { "First", "Oren" }
                      } }
                },
                new RavenJObject
                {
                    { "Name", new RavenJObject
                      {
                          { "Last", "Eini" }
                      } }
                }
            });

            Assert.Equal(@"{
    ""Name"": {
            ""First"": ""Oren"",
            ""Last"": ""Eini""
        }
}", conflictsResolver.Resolve().Document);
        }
示例#6
0
        public void CanMergeArrays()
        {
            var docs = new List <RavenJObject>
            {
                new RavenJObject
                {
                    { "Nicks", new RavenJArray {
                          "Oren"
                      } }
                },
                new RavenJObject
                {
                    { "Nicks", new RavenJArray {
                          "Ayende"
                      } }
                }
            };

            foreach (var doc in docs)
            {
                doc.EnsureCannotBeChangeAndEnableSnapshotting();
            }
            var conflictsResolver = new ConflictsResolver(docs);

            Assert.Equal(@"{
    ""Nicks"": /*>>>> auto merged array start*/ [
        ""Oren"",
        ""Ayende""
    ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve().Document);
        }
示例#7
0
        public void CanDetectConflict_DifferentValues()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Name", new RavenJObject
                      {
                          { "First", "Oren" }
                      } }
                },
                new RavenJObject
                {
                    { "Name", "Eini" }
                }
            });

            Assert.Equal(@"{
    ""Name"": /*>>>> conflict start*/ [
        {
            ""First"": ""Oren""
        },
        ""Eini""
    ]/*<<<< conflict end*/
}", conflictsResolver.Resolve().Document);
        }
示例#8
0
        public void CanResolveOneEmptyArraysAndOneWithValueInMetadata()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Bar", new RavenJArray(1) }
                      } }
                },
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Bar", new RavenJArray() }
                      } }
                },
            });

            Assert.Equal(@"{
    ""Bar"": /*>>>> auto merged array start*/ [
        1
    ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve().Metadata);
        }
示例#9
0
        public Task <HttpResponseMessage> ResolveMerge(string documentId)
        {
            int nextPage          = 0;
            var docs              = Database.Documents.GetDocumentsWithIdStartingWith(documentId + "/conflicts", null, null, 0, 1024, CancellationToken.None, ref nextPage);
            var conflictsResolver = new ConflictsResolver(docs.Values <RavenJObject>());

            return(GetMessageWithObjectAsTask(conflictsResolver.Resolve()));
        }
示例#10
0
        public void CanResolveEmpty()
        {
            var conflictsResolver = new ConflictsResolver(new List <RavenJObject> {
                new RavenJObject(), new RavenJObject()
            });

            Assert.Equal("{}", conflictsResolver.Resolve().Document);
        }
示例#11
0
        public void CanResolveIdentical()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Name", "Oren" }
            }, new RavenJObject
            {
                { "Name", "Oren" }
            });

            Assert.Equal(new RavenJObject
            {
                { "Name", "Oren" }
            }.ToString(Formatting.Indented), conflictsResolver.Resolve());
        }
示例#12
0
        public void CanResolveTwoEmptyArrays()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Name", new RavenJArray() }
            }, new RavenJObject
            {
                { "Name", new RavenJArray() }
            });

            Assert.Equal(new RavenJObject
            {
                { "Name", new RavenJArray() }
            }.ToString(Formatting.Indented), conflictsResolver.Resolve());
        }
示例#13
0
        public void CanMergeAdditionalProperties()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Name", "Oren" }
            }, new RavenJObject
            {
                { "Age", 2 }
            });

            Assert.Equal(new RavenJObject
            {
                { "Name", "Oren" },
                { "Age", 2 }
            }.ToString(Formatting.Indented), conflictsResolver.Resolve());
        }
示例#14
0
        public void CanDetectAndSuggestOptionsForConflict_SimpleProp()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Name", "Oren" }
            }, new RavenJObject
            {
                { "Name", "Ayende" }
            });

            Assert.Equal(@"{
  ""Name"": /*>>>> conflict start*/ [
    ""Oren"",
    ""Ayende""
  ]/*<<<< conflict end*/
}", conflictsResolver.Resolve());
        }
示例#15
0
        public void CanResolveTwoEmptyArrays()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Name", new RavenJArray() }
                },
                new RavenJObject
                {
                    { "Name", new RavenJArray() }
                }
            });

            Assert.Equal(@"{
    ""Name"": []
}", conflictsResolver.Resolve().Document);
        }
示例#16
0
        public void CanResolveOneEmptyArraysAndOneWithValue()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Name", new RavenJArray() }
            }, new RavenJObject
            {
                { "Name", new RavenJArray {
                      1
                  } }
            });

            Assert.Equal(@"{
  ""Name"": /*>>>> auto merged array start*/ [
    1
  ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve());
        }
示例#17
0
        public void CanResolveIdentical()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Name", "Oren" }
                },
                new RavenJObject
                {
                    { "Name", "Oren" }
                }
            });

            Assert.Equal(@"{
    ""Name"": ""Oren""
}", conflictsResolver.Resolve().Document);
        }
示例#18
0
        public void CanMergeAdditionalProperties()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "Name", "Oren" }
                },
                new RavenJObject
                {
                    { "Age", 2 }
                }
            });

            Assert.Equal(@"{
    ""Name"": ""Oren"",
    ""Age"": 2
}", conflictsResolver.Resolve().Document);
        }
示例#19
0
        public void CanResolveEmptyWithMetadata()
        {
            var conflictsResolver = new ConflictsResolver(new List <RavenJObject>
            {
                new RavenJObject()
                {
                    {
                        "@metadata", new RavenJObject()
                    }
                },
                new RavenJObject()
                {
                    {
                        "@metadata", new RavenJObject()
                    }
                }
            });

            Assert.Equal("{}", conflictsResolver.Resolve().Metadata);
        }
示例#20
0
        public void CanMergeArrays()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
            {
                { "Nicks", new RavenJArray {
                      "Oren"
                  } }
            }, new RavenJObject
            {
                { "Nicks", new RavenJArray {
                      "Ayende"
                  } }
            });

            Assert.Equal(@"{
  ""Nicks"": /*>>>> auto merged array start*/ [
    ""Oren"",
    ""Ayende""
  ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve());
        }
示例#21
0
        public void CanResolveTwoEmptyArraysInMetadata()
        {
            var conflictsResolver = new ConflictsResolver(
                new List <RavenJObject> {
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Bar", new RavenJArray() }
                      } }
                },
                new RavenJObject
                {
                    { "@metadata", new RavenJObject()
                      {
                          { "Bar", new RavenJArray() }
                      } }
                },
            });

            Assert.Equal(@"{
    ""Bar"": []
}", conflictsResolver.Resolve().Metadata);
        }
示例#22
0
        public override void LoadModelParameters(string parameters)
        {
            var url = new UrlParser(UrlUtil.Url);

            documentIdManager.Clear();

            if (url.GetQueryParam("mode") == "new")
            {
                Mode = DocumentMode.New;
                InitialiseDocument();
                Navigator    = null;
                CurrentIndex = 0;
                TotalItems   = 0;
                SetCurrentDocumentKey(null);
                ParentPathSegments.Clear();
                ParentPathSegments.Add(new PathSegment()
                {
                    Name = "Documents", Url = "/documents"
                });
                return;
            }

            var database = url.GetQueryParam("databaseid");

            if (database != null)
            {
                EditDatabaseDocument(database);
                return;
            }

            Navigator = DocumentNavigator.FromUrl(url);

            Navigator.GetDocument().ContinueOnSuccessInTheUIThread(
                result =>
            {
                if (result.Document == null)
                {
                    HandleDocumentNotFound();
                    return;
                }

                if (string.IsNullOrEmpty(result.Document.Key))
                {
                    Mode    = DocumentMode.Projection;
                    LocalId = Guid.NewGuid().ToString();
                }
                else
                {
                    Mode = DocumentMode.DocumentWithId;
                    result.Document.Key = Uri.UnescapeDataString(result.Document.Key);
                    LocalId             = result.Document.Key;
                    SetCurrentDocumentKey(result.Document.Key);
                }

                urlForFirst    = result.UrlForFirst;
                urlForPrevious = result.UrlForPrevious;
                urlForLast     = result.UrlForLast;
                urlForNext     = result.UrlForNext;

                IsLoaded       = true;
                document.Value = result.Document;
                CurrentIndex   = (int)result.Index;
                TotalItems     = (int)result.TotalDocuments;

                ParentPathSegments.Clear();
                ParentPathSegments.AddRange(result.ParentPath);

                WhenParsingComplete(dataSection.Document)
                .ContinueOnUIThread(t => ApplyOutliningMode());

                HandleDocumentChanged();
            })
            .Catch(exception =>
            {
                var conflictExeption = exception.GetBaseException() as ConflictException;

                if (conflictExeption != null)
                {
                    ApplicationModel.Current.Server.Value.SelectedDatabase.Value
                    .AsyncDatabaseCommands
                    .GetAsync(conflictExeption.ConflictedVersionIds, null)
                    .ContinueOnSuccessInTheUIThread(doc =>
                    {
                        var docs      = new List <RavenJObject>();
                        var metadatas = new List <RavenJObject>();
                        foreach (var result in doc.Results)
                        {
                            metadatas.Add(result.Value <RavenJObject>("@metadata"));
                            result.Remove("@metadata");
                            docs.Add(result);
                        }

                        ClearMetadatas(metadatas);

                        var docsConflictsResolver     = new ConflictsResolver(docs.ToArray());
                        var metadataConflictsResolver = new ConflictsResolver(metadatas.ToArray());

                        Key         = url.GetQueryParam("id");
                        DocumentKey = Key;
                        OnPropertyChanged(() => DisplayId);
                        Etag = conflictExeption.Etag;

                        ResolvingConflict = true;

                        dataSection.Document.DeleteText(TextChangeTypes.Custom, 0, dataSection.Document.CurrentSnapshot.Length);
                        dataSection.Document.AppendText(TextChangeTypes.Custom, docsConflictsResolver.Resolve());

                        metaDataSection.Document.DeleteText(TextChangeTypes.Custom, 0, metaDataSection.Document.CurrentSnapshot.Length);
                        metaDataSection.Document.AppendText(TextChangeTypes.Custom, metadataConflictsResolver.Resolve());

                        OnPropertyChanged(() => dataSection);
                        OnPropertyChanged(() => document);
                    });
                    return(true);
                }

                return(false);
            });
        }
示例#23
0
        public void CanResolveEmpty()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject(), new RavenJObject());

            Assert.Equal("{}", conflictsResolver.Resolve());
        }
示例#24
0
        public override void LoadModelParameters(string parameters)
        {
            var url = new UrlParser(UrlUtil.Url);

            documentIdManager.Clear();

            if (url.GetQueryParam("mode") == "new")
            {
                Mode = DocumentMode.New;
                InitializeDocument();
                Navigator         = null;
                CurrentIndex      = 0;
                TotalItems        = 0;
                ResolvingConflict = false;
                SetCurrentDocumentKey(null);
                ParentPathSegments.Clear();
                ParentPathSegments.Add(new PathSegment {
                    Name = "Documents", Url = "/documents"
                });
                return;
            }

            var database = url.GetQueryParam("databaseid");

            if (database != null)
            {
                EditDatabaseDocument(database);
                return;
            }

            Navigator = DocumentNavigator.FromUrl(url);

            Navigator.GetDocument().ContinueOnSuccessInTheUIThread(
                result =>
            {
                if (result.IsConflicted)
                {
                    ApplicationModel.Current.Server.Value.SelectedDatabase.Value
                    .AsyncDatabaseCommands
                    .GetAsync(result.ConflictingVersionIds.ToArray(), null)
                    .ContinueOnSuccessInTheUIThread(loadResult =>
                    {
                        var docs      = new List <RavenJObject>();
                        var metadatas = new List <RavenJObject>();
                        foreach (var doc in loadResult.Results)
                        {
                            metadatas.Add(doc.Value <RavenJObject>("@metadata"));
                            doc.Remove("@metadata");
                            docs.Add(doc);
                        }

                        ClearMetadatas(metadatas);

                        var docsConflictsResolver     = new ConflictsResolver(docs.ToArray());
                        var metadataConflictsResolver = new ConflictsResolver(metadatas.ToArray());

                        SetCurrentDocumentKey(result.ConflictDocumentId);

                        OnPropertyChanged(() => DisplayId);
                        Etag = result.ConflictEtag;

                        ResolvingConflict = true;

                        JsonData     = docsConflictsResolver.Resolve();
                        JsonMetadata = metadataConflictsResolver.Resolve();

                        HasUnsavedChanges = false;

                        OnPropertyChanged(() => dataSection);
                        OnPropertyChanged(() => document);
                    });
                }
                else
                {
                    if (result.Document == null)
                    {
                        HandleDocumentNotFound();
                        return;
                    }

                    ResolvingConflict = false;

                    if (string.IsNullOrEmpty(result.Document.Key))
                    {
                        Mode    = DocumentMode.Projection;
                        LocalId = Guid.NewGuid().ToString();
                    }
                    else
                    {
                        AssertNoPropertyBeyondSize(result.Document.DataAsJson, 500 * 1000);
                        var recentQueue = ApplicationModel.Current.Server.Value.SelectedDatabase.Value.RecentDocuments;
                        ApplicationModel.Current.Server.Value.RawUrl = "databases/" +
                                                                       ApplicationModel.Current.Server.Value.SelectedDatabase
                                                                       .Value.Name +
                                                                       "/docs/" + result.Document.Key;
                        recentQueue.Add(result.Document.Key);
                        Mode = DocumentMode.DocumentWithId;
                        result.Document.Key = Uri.UnescapeDataString(result.Document.Key);
                        LocalId             = result.Document.Key;
                        SetCurrentDocumentKey(result.Document.Key);

                        HasExpiration  = Database.Value.HasExpirationBundle;
                        var expiration = result.Document.Metadata["Raven-Expiration-Date"];
                        if (expiration != null)
                        {
                            // The expiration date is always interpreted as UTC.
                            ExpireAt.Value         = DateTime.SpecifyKind(expiration.Value <DateTime>(), DateTimeKind.Utc);
                            EnableExpiration.Value = true;

                            // If there's an expiration date, show it even if the bundle is not enabled.
                            HasExpiration = true;
                        }
                        else
                        {
                            ExpireAt.Value         = null;
                            EnableExpiration.Value = false;
                        }
                    }

                    document.Value = result.Document;

                    WhenParsingComplete(dataSection.Document)
                    .ContinueOnUIThread(t => ApplyOutliningMode());

                    HandleDocumentChanged();
                }

                urlForFirst    = result.UrlForFirst;
                urlForPrevious = result.UrlForPrevious;
                urlForLast     = result.UrlForLast;
                urlForNext     = result.UrlForNext;

                CurrentIndex = (int)result.Index;
                TotalItems   = (int)result.TotalDocuments;

                ParentPathSegments.Clear();
                ParentPathSegments.AddRange(result.ParentPath);
            })
            .Catch();
        }