Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add MartenOps.StoreObjects #1171

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
64 changes: 64 additions & 0 deletions src/Persistence/MartenTests/MartenOps_store.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using Shouldly;
using Wolverine.Marten;

namespace MartenTests;

public class MartenOps_store
{
[Fact]
public void StoreMany()
{
var op = MartenOps.StoreMany(new MartenMessage2("Test1"));

op.Documents.Count.ShouldBe(1);
op.Documents[0].ShouldBeOfType<MartenMessage2>();

op.With(new MartenMessage2("Test2"));

op.Documents.Count.ShouldBe(2);

op.With([new MartenMessage2("Test3"), new MartenMessage2("Test4")]);

op.Documents.Count.ShouldBe(4);

op = MartenOps.StoreMany(new MartenMessage2("Test5"), new MartenMessage2("Test6"));

op.Documents.Count.ShouldBe(2);

op = MartenOps.StoreMany([new MartenMessage2("Test7"), new MartenMessage2("Test8")]);

op.Documents.Count.ShouldBe(2);
}

[Fact]
public void StoreObjects()
{
var op = MartenOps.StoreObjects(new MartenMessage2("Test1"));

op.Documents.Count.ShouldBe(1);
op.Documents[0].ShouldBeOfType<MartenMessage2>();

op.With(new MartenMessage3("Test2"));

op.Documents.Count.ShouldBe(2);
op.Documents[1].ShouldBeOfType<MartenMessage3>();

op.With([new MartenMessage2("Test3"), new MartenMessage3("Test4")]);

op.Documents.Count.ShouldBe(4);
op.Documents[2].ShouldBeOfType<MartenMessage2>();
op.Documents[3].ShouldBeOfType<MartenMessage3>();

op = MartenOps.StoreObjects(new MartenMessage2("Test5"), new MartenMessage3("Test6"));

op.Documents.Count.ShouldBe(2);
op.Documents[0].ShouldBeOfType<MartenMessage2>();
op.Documents[1].ShouldBeOfType<MartenMessage3>();

op = MartenOps.StoreObjects([new MartenMessage2("Test7"), new MartenMessage3("Test8")]);

op.Documents.Count.ShouldBe(2);
op.Documents[0].ShouldBeOfType<MartenMessage2>();
op.Documents[1].ShouldBeOfType<MartenMessage3>();
}
}
70 changes: 62 additions & 8 deletions src/Persistence/Wolverine.Marten/IMartenOp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,22 @@ public static StoreManyDocs<T> StoreMany<T>(params T[] documents) where T : notn
return new StoreManyDocs<T>(documents);
}

/// <summary>
/// Return a side effect of storing an enumerable of potentially mixed documents in Marten
/// </summary>
/// <param name="documents"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
public static StoreObjects StoreObjects(params object[] documents)
{
if (documents == null)
{
throw new ArgumentNullException(nameof(documents));
}

return new StoreObjects(documents);
}

/// <summary>
/// Return a side effect of inserting the specified document in Marten
/// </summary>
Expand Down Expand Up @@ -309,18 +325,49 @@ public override void Execute(IDocumentSession session)

public class StoreManyDocs<T> : DocumentsOp where T : notnull
{
private readonly T[] _documents;
public StoreManyDocs(params T[] documents) : base(documents.Cast<object>().ToArray()) { }

public StoreManyDocs(IList<T> documents) : this(documents.ToArray()) { }

public StoreManyDocs(params T[] documents) : base(documents.Cast<object>().ToArray())
public StoreManyDocs<T> With(T[] documents)
{
_documents = documents;
Documents.AddRange(documents.Cast<object>());
return this;
}

public StoreManyDocs(IList<T> documents) : this(documents.ToArray()) { }
public StoreManyDocs<T> With(T document)
{
Documents.Add(document);
return this;
}

public override void Execute(IDocumentSession session)
{
session.Store(_documents);
session.Store(Documents.Cast<T>());
}
}

public class StoreObjects : DocumentsOp
{
public StoreObjects(params object[] documents) : base(documents) { }

public StoreObjects(IList<object> documents) : this(documents.ToArray()) { }

public StoreObjects With(object[] documents)
{
Documents.AddRange(documents);
return this;
}

public StoreObjects With(object document)
{
Documents.Add(document);
return this;
}

public override void Execute(IDocumentSession session)
{
session.StoreObjects(Documents);
}
}

Expand Down Expand Up @@ -381,14 +428,21 @@ protected DocumentOp(object document)
public abstract void Execute(IDocumentSession session);
}

public abstract class DocumentsOp : IMartenOp
public interface IDocumentsOp : IMartenOp
{
public object[] Documents { get; }
IReadOnlyList<object> Documents { get; }
}

public abstract class DocumentsOp : IDocumentsOp
{
public List<object> Documents { get; } = new();

protected DocumentsOp(params object[] documents)
{
Documents = documents;
Documents.AddRange(documents);
}

public abstract void Execute(IDocumentSession session);

IReadOnlyList<object> IDocumentsOp.Documents => Documents;
}
Loading