public void GetDocumentsBatchFromShouldReturnUniqueResults2() { var prefetcher = CreatePrefetcher(); AddDocumentsToTransactionalStorage(prefetcher.TransactionalStorage, 100); var documents = prefetcher.PrefetchingBehavior.GetDocumentsBatchFrom(Etag.Empty, 1); var document = documents.Single(); AddDocumentResult result = null; prefetcher.TransactionalStorage.Batch(accessor => result = accessor.Documents.AddDocument("keys/2", null, document.DataAsJson, document.Metadata)); documents = prefetcher.PrefetchingBehavior.GetDocumentsBatchFrom(document.Etag, 200); Assert.Equal(99, documents.Count); var prevEtag = Etag.Empty; var keys = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (var doc in documents) { Assert.True(EtagUtil.IsGreaterThan(document.Etag, prevEtag)); Assert.True(keys.Add(doc.Key)); } }
private void DocumentStorage_DocumentAdd_And_DocumentRead_Internal(string requestedStorage, string documentKey, OrderedPartCollection <AbstractDocumentCodec> documentCodecs = null) { using (var storage = NewTransactionalStorage(requestedStorage, dataDir: null, runInMemory: true, documentCodecs: documentCodecs)) { AddDocumentResult addResult = null; storage.Batch( mutator => addResult = mutator.Documents.AddDocument( documentKey, Etag.Empty, RavenJObject.FromObject(new { Name = "Bar", Foo = "AlsoBar" }), new RavenJObject())); RavenJObject document = null; JsonDocument jsonDocument = null; storage.Batch( viewer => { jsonDocument = viewer.Documents.DocumentByKey(documentKey, null); document = jsonDocument.DataAsJson; }); Assert.NotNull(document); Assert.NotNull(jsonDocument); Assert.Equal("Bar", document.Value <string>("Name")); Assert.Equal("AlsoBar", document.Value <string>("Foo")); //verify correctness of LastModified return value Assert.True(jsonDocument.LastModified.HasValue); // ReSharper disable once PossibleInvalidOperationException (checked HasValue already) Assert.Equal(addResult.SavedAt, jsonDocument.LastModified.Value); } }
public void GetDocumentsBatchFromShouldNotFilterOutConflictsEvenIfAnotherDocumentWithSameKeyExists() { var prefetcher = CreatePrefetcher(); AddDocumentsToTransactionalStorage(prefetcher.TransactionalStorage, 100); var documents = prefetcher.PrefetchingBehavior.GetDocumentsBatchFrom(Etag.Empty, 1); var document = documents.Single(); document.Metadata.Add(Constants.RavenReplicationConflict, true); AddDocumentResult result = null; prefetcher.TransactionalStorage.Batch(accessor => result = accessor.Documents.AddDocument("keys/2", null, document.DataAsJson, document.Metadata)); documents = prefetcher.PrefetchingBehavior.GetDocumentsBatchFrom(document.Etag, 200); Assert.Equal(100, documents.Count); var keys = documents .GroupBy(x => x.Key) .Select(x => new KeyValuePair <string, int>(x.Key, x.Count())) .ToList(); Assert.True(keys.Single(x => x.Key == "keys/2").Value == 2); foreach (var k in keys.Where(x => x.Key != "keys/2")) { Assert.True(k.Value == 1); } }
public void DocumentStorage_DocumentTouch_EtagUpdated(string requestedStorage) { const string TEST_DOCUMENT_KEY = "Foo"; using (var storage = NewTransactionalStorage(requestedStorage)) { AddDocumentResult initialAddResult = null; storage.Batch(mutator => initialAddResult = mutator.Documents.AddDocument(TEST_DOCUMENT_KEY, Etag.Empty, RavenJObject.FromObject(new { Name = "Bar" }), new RavenJObject())); Etag preTouchEtag = null; Etag afterTouchEtag = null; storage.Batch(mutator => mutator.Documents.TouchDocument(TEST_DOCUMENT_KEY, out preTouchEtag, out afterTouchEtag)); Assert.NotNull(preTouchEtag); Assert.NotNull(afterTouchEtag); Assert.Equal(initialAddResult.Etag, preTouchEtag); Assert.NotEqual(preTouchEtag, afterTouchEtag); } }
public void DocumentStorage_DocumentUpdate_WithSpecifiedEtag_And_DocumentRead(string requestedStorage) { using (var storage = NewTransactionalStorage(requestedStorage)) { const string TEST_DOCUMENT_KEY = "Foo"; const string TEST_DOCUMENT_EXPECTED_NAME = "Bar2"; //add document AddDocumentResult addResult = null; storage.Batch(mutator => addResult = mutator.Documents.AddDocument(TEST_DOCUMENT_KEY, Etag.Empty, RavenJObject.FromObject(new { Name = "Bar" }), new RavenJObject())); //then update document storage.Batch(mutator => mutator.Documents.AddDocument(TEST_DOCUMENT_KEY, addResult.Etag, RavenJObject.FromObject(new { Name = TEST_DOCUMENT_EXPECTED_NAME }), new RavenJObject())); RavenJObject document = null; storage.Batch(viewer => document = viewer.Documents.DocumentByKey(TEST_DOCUMENT_KEY, null).DataAsJson); Assert.NotNull(document); Assert.Equal(TEST_DOCUMENT_EXPECTED_NAME, document.Value <string>("Name")); } }
private void DocumentStorage_DocumentAdd_And_DocumentDeleted_Internal(string requestedStorage, string documentKey) { using (var storage = NewTransactionalStorage(requestedStorage)) { AddDocumentResult addResult = null; storage.Batch( mutator => addResult = mutator.Documents.AddDocument( documentKey, Etag.Empty, RavenJObject.FromObject(new { Name = "Bar" }), RavenJObject.FromObject(new { Meta = "Data" }))); JsonDocumentMetadata fetchedMetadata = null; storage.Batch(viewer => fetchedMetadata = viewer.Documents.DocumentMetadataByKey(documentKey, null)); Etag deletedEtag = null; RavenJObject deletedMetadata = null; storage.Batch( mutator => mutator.Documents.DeleteDocument(documentKey, null, out deletedMetadata, out deletedEtag)); JsonDocument documentAfterDelete = null; storage.Batch(viewer => documentAfterDelete = viewer.Documents.DocumentByKey(documentKey, null)); JsonDocumentMetadata metadataAfterDelete = null; storage.Batch(viewer => metadataAfterDelete = viewer.Documents.DocumentMetadataByKey(documentKey, null)); //after delete --> DocumentByKey()/DocumentMetadataByKey() methods should return null Assert.Null(documentAfterDelete); Assert.Null(metadataAfterDelete); Assert.NotNull(deletedEtag); Assert.NotNull(deletedMetadata); Assert.Equal(addResult.Etag, deletedEtag); Assert.Equal(fetchedMetadata.Metadata, deletedMetadata); } }