Update FSDB

pull/4/head
Ogoun 1 year ago
parent 19a955c688
commit 98cb5c3768

@ -29,7 +29,7 @@ namespace ZeroLevel.Services.PartitionStorage
/// <summary> /// <summary>
/// Performs a search for data in the repository /// Performs a search for data in the repository
/// </summary> /// </summary>
Task<StoreSearchResult<TKey, TValue, TMeta>> Search(StoreSearchRequest<TKey, TMeta> searchRequest); IAsyncEnumerable<KV<TKey, TValue>> Search(StoreSearchRequest<TKey, TMeta> searchRequest);
/// <summary> /// <summary>
/// bypass all key value by meta /// bypass all key value by meta
/// </summary> /// </summary>

@ -24,7 +24,8 @@ namespace ZeroLevel.Services.PartitionStorage
/// <summary> /// <summary>
/// Search in a partition for a specified keys /// Search in a partition for a specified keys
/// </summary> /// </summary>
Task Find(IEnumerable<TKey> keys, Action<TKey, TValue> searchResultHandler); IAsyncEnumerable<KV<TKey, TValue>> Find(IEnumerable<TKey> keys);
/// <summary> /// <summary>
/// Iterating over all recorded data /// Iterating over all recorded data
/// </summary> /// </summary>

@ -88,7 +88,8 @@ namespace ZeroLevel.Services.PartitionStorage
Value = default Value = default
}; };
} }
public async Task Find(IEnumerable<TKey> keys, Action<TKey, TValue> searchResultHandler)
public async IAsyncEnumerable<KV<TKey, TValue>> Find(IEnumerable<TKey> keys)
{ {
var results = keys.Distinct() var results = keys.Distinct()
.GroupBy( .GroupBy(
@ -96,9 +97,13 @@ namespace ZeroLevel.Services.PartitionStorage
k => k, (key, g) => new { FileName = key, Keys = g.ToArray() }); k => k, (key, g) => new { FileName = key, Keys = g.ToArray() });
foreach (var group in results) foreach (var group in results)
{ {
await Find(group.FileName, group.Keys, searchResultHandler); await foreach (var kv in Find(group.FileName, group.Keys))
{
yield return kv;
}
} }
} }
public async IAsyncEnumerable<KV<TKey, TValue>> Iterate() public async IAsyncEnumerable<KV<TKey, TValue>> Iterate()
{ {
if (Directory.Exists(_catalog)) if (Directory.Exists(_catalog))
@ -204,10 +209,8 @@ namespace ZeroLevel.Services.PartitionStorage
#region Private methods #region Private methods
private async Task Find(string fileName, TKey[] keys, Action<TKey, TValue> searchResultHandler) private async IAsyncEnumerable<KV<TKey, TValue>> Find(string fileName, TKey[] keys)
{ {
TKey k;
TValue v;
var filePath = Path.Combine(_catalog, fileName); var filePath = Path.Combine(_catalog, fileName);
if (File.Exists(filePath)) if (File.Exists(filePath))
{ {
@ -242,7 +245,7 @@ namespace ZeroLevel.Services.PartitionStorage
var c = _options.KeyComparer(searchKey, kv.Value); var c = _options.KeyComparer(searchKey, kv.Value);
if (c == 0) if (c == 0)
{ {
searchResultHandler.Invoke(kv.Value, vv.Value); yield return new KV<TKey, TValue>(kv.Value, vv.Value);
break; break;
} }
else if (c == -1) else if (c == -1)
@ -274,7 +277,7 @@ namespace ZeroLevel.Services.PartitionStorage
var c = _options.KeyComparer(keys_arr[index], kv.Value); var c = _options.KeyComparer(keys_arr[index], kv.Value);
if (c == 0) if (c == 0)
{ {
searchResultHandler.Invoke(kv.Value, vv.Value); yield return new KV<TKey, TValue>(kv.Value, vv.Value);
index++; index++;
} }
else if (c == -1) else if (c == -1)

@ -70,38 +70,29 @@ namespace ZeroLevel.Services.PartitionStorage
_fileAccessorCachee.DropAllIndexReaders(); _fileAccessorCachee.DropAllIndexReaders();
} }
public async Task<StoreSearchResult<TKey, TValue, TMeta>> Search(StoreSearchRequest<TKey, TMeta> searchRequest) public async IAsyncEnumerable<KV<TKey, TValue>> Search(StoreSearchRequest<TKey, TMeta> searchRequest)
{ {
var result = new StoreSearchResult<TKey, TValue, TMeta>();
var results = new ConcurrentDictionary<TMeta, IEnumerable<KV<TKey, TValue>>>();
if (searchRequest.PartitionSearchRequests?.Any() ?? false) if (searchRequest.PartitionSearchRequests?.Any() ?? false)
{ {
var partitionsSearchInfo = searchRequest var partitionsSearchInfo = searchRequest
.PartitionSearchRequests .PartitionSearchRequests
.ToDictionary(r => r.Info, r => r.Keys); .ToDictionary(r => r.Info, r => r.Keys);
var options = new ParallelOptions foreach(var pair in partitionsSearchInfo)
{
MaxDegreeOfParallelism = _options.MaxDegreeOfParallelism
};
await Parallel.ForEachAsync(partitionsSearchInfo, options, async (pair, _) =>
{ {
var accessor = CreateAccessor(pair.Key); var accessor = CreateAccessor(pair.Key);
if (accessor != null) if (accessor != null)
{ {
using (accessor) using (accessor)
{ {
var set = new List<KV<TKey, TValue>>(); var set = new ConcurrentBag<KV<TKey, TValue>>();
await foreach (var kv in accessor.Iterate()) await foreach (var kv in accessor.Find(pair.Value))
{ {
set.Add(new KV<TKey, TValue>(kv.Key, kv.Value)); yield return kv;
}
} }
results[pair.Key] = set;
} }
} }
});
} }
result.Results = results;
return result;
} }
public void Dispose() public void Dispose()

Loading…
Cancel
Save

Powered by TurnKey Linux.