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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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())); }
public void CanResolveEmpty() { var conflictsResolver = new ConflictsResolver(new List <RavenJObject> { new RavenJObject(), new RavenJObject() }); Assert.Equal("{}", conflictsResolver.Resolve().Document); }
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()); }
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()); }
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()); }
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()); }
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); }
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()); }
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); }
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); }
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); }
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()); }
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); }
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); }); }
public void CanResolveEmpty() { var conflictsResolver = new ConflictsResolver(new RavenJObject(), new RavenJObject()); Assert.Equal("{}", conflictsResolver.Resolve()); }
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(); }