Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions DevBase.Net/Batch/Batch.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System.Collections.Concurrent;
using DevBase.Net.Core;

namespace DevBase.Net.Batch;

public sealed class Batch
{
private readonly ConcurrentQueue<Request> _queue = new();
private readonly BatchRequests _parent;

public string Name { get; }
public int QueueCount => _queue.Count;

internal Batch(string name, BatchRequests parent)
{
Name = name;
_parent = parent;
}

public Batch Add(Request request)
{
ArgumentNullException.ThrowIfNull(request);
_queue.Enqueue(request);
return this;
}

public Batch Add(IEnumerable<Request> requests)
{
foreach (Request request in requests)
Add(request);
return this;
}

public Batch Add(string url)
{
return Add(new Request(url));
}

public Batch Add(IEnumerable<string> urls)
{
foreach (string url in urls)
Add(url);
return this;
}

public Batch Enqueue(Request request) => Add(request);
public Batch Enqueue(string url) => Add(url);
public Batch Enqueue(IEnumerable<Request> requests) => Add(requests);
public Batch Enqueue(IEnumerable<string> urls) => Add(urls);

public Batch Enqueue(string url, Action<Request> configure)
{
Request request = new Request(url);
configure(request);
return Add(request);
}

public Batch Enqueue(Func<Request> requestFactory)
{
return Add(requestFactory());
}

public bool TryDequeue(out Request? request)
{
return _queue.TryDequeue(out request);
}

internal List<Request> DequeueAll()
{
List<Request> requests = new List<Request>(_queue.Count);
while (_queue.TryDequeue(out Request? request))
requests.Add(request);
return requests;
}

public void Clear()
{
while (_queue.TryDequeue(out _)) { }
}

public BatchRequests EndBatch() => _parent;
}
12 changes: 12 additions & 0 deletions DevBase.Net/Batch/BatchProgressInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace DevBase.Net.Batch;

public sealed record BatchProgressInfo(
string BatchName,
int Completed,
int Total,
int Errors
)
{
public double PercentComplete => Total > 0 ? (double)Completed / Total * 100 : 0;
public int Remaining => Total - Completed;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using System.Collections.Concurrent;
using System.Net;
using System.Text;
using DevBase.Net.Core;
using DevBase.Net.Utils;

namespace DevBase.Net.Core;
namespace DevBase.Net.Batch;

public sealed class BatchRequests : IDisposable, IAsyncDisposable
{
Expand Down Expand Up @@ -777,121 +778,3 @@ public async ValueTask DisposeAsync()

#endregion
}

public sealed class Batch
{
private readonly ConcurrentQueue<Request> _queue = new();
private readonly BatchRequests _parent;

public string Name { get; }
public int QueueCount => _queue.Count;

internal Batch(string name, BatchRequests parent)
{
Name = name;
_parent = parent;
}

public Batch Add(Request request)
{
ArgumentNullException.ThrowIfNull(request);
_queue.Enqueue(request);
return this;
}

public Batch Add(IEnumerable<Request> requests)
{
foreach (Request request in requests)
Add(request);
return this;
}

public Batch Add(string url)
{
return Add(new Request(url));
}

public Batch Add(IEnumerable<string> urls)
{
foreach (string url in urls)
Add(url);
return this;
}

public Batch Enqueue(Request request) => Add(request);
public Batch Enqueue(string url) => Add(url);
public Batch Enqueue(IEnumerable<Request> requests) => Add(requests);
public Batch Enqueue(IEnumerable<string> urls) => Add(urls);

public Batch Enqueue(string url, Action<Request> configure)
{
Request request = new Request(url);
configure(request);
return Add(request);
}

public Batch Enqueue(Func<Request> requestFactory)
{
return Add(requestFactory());
}

public bool TryDequeue(out Request? request)
{
return _queue.TryDequeue(out request);
}

internal List<Request> DequeueAll()
{
List<Request> requests = new List<Request>(_queue.Count);
while (_queue.TryDequeue(out Request? request))
requests.Add(request);
return requests;
}

public void Clear()
{
while (_queue.TryDequeue(out _)) { }
}

public BatchRequests EndBatch() => _parent;
}

public sealed record BatchProgressInfo(
string BatchName,
int Completed,
int Total,
int Errors
)
{
public double PercentComplete => Total > 0 ? (double)Completed / Total * 100 : 0;
public int Remaining => Total - Completed;
}

public sealed record BatchStatistics(
int BatchCount,
int TotalQueuedRequests,
int ProcessedRequests,
int ErrorCount,
Dictionary<string, int> RequestsPerBatch
)
{
public double SuccessRate => ProcessedRequests > 0
? (double)(ProcessedRequests - ErrorCount) / ProcessedRequests * 100
: 0;
}

public readonly struct RequeueDecision
{
public bool ShouldRequeue { get; }
public Request? ModifiedRequest { get; }

private RequeueDecision(bool shouldRequeue, Request? modifiedRequest = null)
{
ShouldRequeue = shouldRequeue;
ModifiedRequest = modifiedRequest;
}

public static RequeueDecision NoRequeue => new(false);
public static RequeueDecision Requeue() => new(true);
public static RequeueDecision RequeueWith(Request modifiedRequest) => new(true, modifiedRequest);
}
14 changes: 14 additions & 0 deletions DevBase.Net/Batch/BatchStatistics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace DevBase.Net.Batch;

public sealed record BatchStatistics(
int BatchCount,
int TotalQueuedRequests,
int ProcessedRequests,
int ErrorCount,
Dictionary<string, int> RequestsPerBatch
)
{
public double SuccessRate => ProcessedRequests > 0
? (double)(ProcessedRequests - ErrorCount) / ProcessedRequests * 100
: 0;
}
82 changes: 82 additions & 0 deletions DevBase.Net/Batch/Proxied/ProxiedBatch.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System.Collections.Concurrent;
using DevBase.Net.Core;

namespace DevBase.Net.Batch.Proxied;

public sealed class ProxiedBatch
{
private readonly ConcurrentQueue<Request> _queue = new();
private readonly ProxiedBatchRequests _parent;

public string Name { get; }
public int QueueCount => _queue.Count;

internal ProxiedBatch(string name, ProxiedBatchRequests parent)
{
Name = name;
_parent = parent;
}

public ProxiedBatch Add(Request request)
{
ArgumentNullException.ThrowIfNull(request);
_queue.Enqueue(request);
return this;
}

public ProxiedBatch Add(IEnumerable<Request> requests)
{
foreach (Request request in requests)
Add(request);
return this;
}

public ProxiedBatch Add(string url)
{
return Add(new Request(url));
}

public ProxiedBatch Add(IEnumerable<string> urls)
{
foreach (string url in urls)
Add(url);
return this;
}

public ProxiedBatch Enqueue(Request request) => Add(request);
public ProxiedBatch Enqueue(string url) => Add(url);
public ProxiedBatch Enqueue(IEnumerable<Request> requests) => Add(requests);
public ProxiedBatch Enqueue(IEnumerable<string> urls) => Add(urls);

public ProxiedBatch Enqueue(string url, Action<Request> configure)
{
Request request = new Request(url);
configure(request);
return Add(request);
}

public ProxiedBatch Enqueue(Func<Request> requestFactory)
{
return Add(requestFactory());
}

public bool TryDequeue(out Request? request)
{
return _queue.TryDequeue(out request);
}

internal List<Request> DequeueAll()
{
List<Request> requests = new List<Request>(_queue.Count);
while (_queue.TryDequeue(out Request? request))
requests.Add(request);
return requests;
}

public void Clear()
{
while (_queue.TryDequeue(out _)) { }
}

public ProxiedBatchRequests EndBatch() => _parent;
}
Loading
Loading