Update FSDB

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

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

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

@ -88,7 +88,8 @@ namespace ZeroLevel.Services.PartitionStorage
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()
.GroupBy(
@ -96,9 +97,13 @@ namespace ZeroLevel.Services.PartitionStorage
k => k, (key, g) => new { FileName = key, Keys = g.ToArray() });
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()
{
if (Directory.Exists(_catalog))
@ -204,10 +209,8 @@ namespace ZeroLevel.Services.PartitionStorage
#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);
if (File.Exists(filePath))
{
@ -242,7 +245,7 @@ namespace ZeroLevel.Services.PartitionStorage
var c = _options.KeyComparer(searchKey, kv.Value);
if (c == 0)
{
searchResultHandler.Invoke(kv.Value, vv.Value);
yield return new KV<TKey, TValue>(kv.Value, vv.Value);
break;
}
else if (c == -1)
@ -274,7 +277,7 @@ namespace ZeroLevel.Services.PartitionStorage
var c = _options.KeyComparer(keys_arr[index], kv.Value);
if (c == 0)
{
searchResultHandler.Invoke(kv.Value, vv.Value);
yield return new KV<TKey, TValue>(kv.Value, vv.Value);
index++;
}
else if (c == -1)

@ -70,38 +70,29 @@ namespace ZeroLevel.Services.PartitionStorage
_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)
{
var partitionsSearchInfo = searchRequest
.PartitionSearchRequests
.ToDictionary(r => r.Info, r => r.Keys);
var options = new ParallelOptions
{
MaxDegreeOfParallelism = _options.MaxDegreeOfParallelism
};
await Parallel.ForEachAsync(partitionsSearchInfo, options, async (pair, _) =>
foreach(var pair in partitionsSearchInfo)
{
var accessor = CreateAccessor(pair.Key);
if (accessor != null)
{
using (accessor)
{
var set = new List<KV<TKey, TValue>>();
await foreach (var kv in accessor.Iterate())
var set = new ConcurrentBag<KV<TKey, TValue>>();
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()

Loading…
Cancel
Save

Powered by TurnKey Linux.