Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save btranscend/3df5f4db26d65693e43bc57e3807d573 to your computer and use it in GitHub Desktop.
Save btranscend/3df5f4db26d65693e43bc57e3807d573 to your computer and use it in GitHub Desktop.
Renaming entities with RavenDb patching API
using System.Linq;
using System.Threading;
using Raven.Abstractions.Data;
using Raven.Abstractions.Indexing;
using Raven.Client;
using Raven.Client.Embedded;
using Raven.Json.Linq;
using Xunit;
namespace RavenDbPatching.StringIdPatching {
public class StringIdPatchingTests {
[Fact]
public void CanRenameEntityWithStringId() {
var documentStore = new EmbeddableDocumentStore() { RunInMemory = true }.Initialize();
createDocumentsByEntityNameIndex(documentStore as EmbeddableDocumentStore);
var group = new Group {
Name = "Cars"
};
using (var session = documentStore.OpenSession()) {
session.Store(group);
session.SaveChanges();
}
while (documentStore.DatabaseCommands.GetStatistics().StaleIndexes.Length != 0) {
Thread.Sleep(10);
}
new Migrations(documentStore).Migrate();
while (documentStore.DatabaseCommands.GetStatistics().StaleIndexes.Length != 0) {
Thread.Sleep(10);
}
using (var session = documentStore.OpenSession()) {
var category = session.Query<Category>().FirstOrDefault();
Assert.NotNull(category); // fails
}
}
private void createDocumentsByEntityNameIndex(EmbeddableDocumentStore store) {
var database = store.DocumentDatabase;
if (database.GetIndexDefinition("Raven/DocumentsByEntityName") == null) {
database.PutIndex("Raven/DocumentsByEntityName", new IndexDefinition {
Map =
@"from doc in docs
let Tag = doc[""@metadata""][""Raven-Entity-Name""]
select new { Tag, LastModified = (DateTime)doc[""@metadata""][""Last-Modified""] };",
Indexes =
{
{"Tag", FieldIndexing.NotAnalyzed},
},
Stores =
{
{"Tag", FieldStorage.No},
{"LastModified", FieldStorage.No}
}
});
}
}
}
public class Group {
public string Id { get; set; }
public string Name { get; set; }
}
public class Category {
public string Id { get; set; }
public string Name { get; set; }
}
public class Migrations {
readonly IDocumentStore _documentStore;
public Migrations(IDocumentStore documentStore) {
_documentStore = documentStore;
}
public void Migrate() {
_documentStore.DatabaseCommands.UpdateByIndex(
"Raven/DocumentsByEntityName",
new IndexQuery {
Query = "Tag:Group"
},
new[]
{
new PatchRequest
{
Type = PatchCommandType.Modify,
Name = "@metadata",
Nested = new[]
{
new PatchRequest
{
Type = PatchCommandType.Set,
Name = "Raven-Entity-Name",
Value = new RavenJValue("Category")
}
,
new PatchRequest
{
Type = PatchCommandType.Set,
Name = "Raven-Clr-Type",
Value = new RavenJValue("RavenDbPatching.StringIdPatching.Category, RavenDbPatching")
}
}
}
}, false);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment