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 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 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 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 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 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 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 CanMergeProperties_Nested() { var conflictsResolver = new ConflictsResolver(new RavenJObject { {"Name", new RavenJObject { {"First", "Oren"} }} }, new RavenJObject { {"Name", new RavenJObject { {"Last", "Eini"} }} }); Assert.Equal(@"{ ""Name"":{ ""First"": ""Oren"", ""Last"": ""Eini"" } }", conflictsResolver.Resolve()); }
public void CanResolveEmpty() { var conflictsResolver = new ConflictsResolver(new List<RavenJObject> { new RavenJObject(), new RavenJObject() }); Assert.Equal("{}", conflictsResolver.Resolve().Document); }
public void CanMergeArrays_SameStart() { var conflictsResolver = new ConflictsResolver(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()); }
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 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 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 CanResolveEmpty() { var conflictsResolver = new ConflictsResolver(new RavenJObject(), new RavenJObject()); Assert.Equal("{}", 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 void CanMergeEmptyArrays() { var conflictsResolver = new ConflictsResolver(new RavenJObject { {"Nicks", new RavenJArray()} }, new RavenJObject { {"Nicks", new RavenJArray()} }); Assert.Equal(@"{ ""Nicks"": [] }", conflictsResolver.Resolve()); }
private void WriteConflictResolver(string name, JsonTextWriter documentWriter, JsonTextWriter metadataWriter, ConflictsResolver resolver, int indent) { MergeResult result = resolver.Resolve(indent); if (resolver.isMetadataResolver) { if (name != "@metadata") { metadataWriter.WritePropertyName(name); } WriteRawData(metadataWriter, result.Document, indent); } else { documentWriter.WritePropertyName(name); WriteRawData(documentWriter, result.Document, indent); } }
private void WriteConflictResolver(string name, JsonTextWriter documentWriter, JsonTextWriter metadataWriter, ConflictsResolver resolver, int indent) { MergeResult result = resolver.Resolve(indent); if (resolver.isMetadataResolver) { if(name != "@metadata") metadataWriter.WritePropertyName(name); WriteRawData(metadataWriter, result.Document, indent); } else { documentWriter.WritePropertyName(name); WriteRawData(documentWriter, result.Document, indent); } }
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 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 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 CanDetectConflict_DifferentValues() { var conflictsResolver = new ConflictsResolver(new RavenJObject { {"Name", new RavenJObject { {"First", "Oren"} }} }, new RavenJObject { {"Name", "Eini"} }); Assert.Equal(@"{ ""Name"": /*>>>> conflict start*/ [ { ""First"": ""Oren"" }, ""Eini"" ]/*<<<< conflict end*/ }", 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); var expiration = result.Document.Metadata["Raven-Expiration-Date"]; if (expiration != null) { ExpireAt.Value = DateTime.Parse(expiration.ToString()); EnableExpiration.Value = true; HasExpiration = true; } else { HasExpiration = 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(); }
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 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 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); }