2024-02-02 17:14:41 +08:00
|
|
|
|
using MesETL.App.Options;
|
2024-01-29 09:29:16 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
2024-02-02 17:14:41 +08:00
|
|
|
|
namespace MesETL.App.Services.ETL;
|
2024-01-29 09:29:16 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 截取提供ZST文件中的第一行,然后复制成指定数量的数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ZstMockReader : ZstReader
|
|
|
|
|
{
|
|
|
|
|
private long _currentCount;
|
|
|
|
|
private readonly long _mockCount;
|
|
|
|
|
private DataRecord? _template;
|
|
|
|
|
private readonly bool _deepCopy;
|
|
|
|
|
private readonly string[]? _autoIncrementColumn;
|
|
|
|
|
|
|
|
|
|
static readonly IReadOnlyList<int> Range = [500, 1500, 2500];
|
|
|
|
|
|
|
|
|
|
public ZstMockReader(TableMockConfig mockConfig, string filePath, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(filePath, tableName, headers, delimiter, quoteChar, logger)
|
|
|
|
|
{
|
|
|
|
|
_mockCount = mockConfig.MockCount;
|
|
|
|
|
_deepCopy = mockConfig.UseDeepCopy;
|
|
|
|
|
_autoIncrementColumn = mockConfig.AutoIncrementColumn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ZstMockReader(TableMockConfig mockConfig, Stream stream, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(stream, tableName, headers, delimiter, quoteChar, logger)
|
|
|
|
|
{
|
|
|
|
|
_mockCount = mockConfig.MockCount;
|
|
|
|
|
_deepCopy = mockConfig.UseDeepCopy;
|
|
|
|
|
_autoIncrementColumn = mockConfig.AutoIncrementColumn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override async ValueTask<bool> ReadAsync()
|
|
|
|
|
{
|
|
|
|
|
if (_template is null)
|
|
|
|
|
{
|
|
|
|
|
if (!await base.ReadAsync())
|
|
|
|
|
throw new InvalidOperationException("所提供的ZST源为空,无法生成模板数据");
|
|
|
|
|
_template = Current.Clone() as DataRecord;
|
|
|
|
|
if (_template is null)
|
|
|
|
|
throw new ApplicationException("记录拷贝失败");
|
|
|
|
|
_currentCount++;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_deepCopy)
|
|
|
|
|
{
|
|
|
|
|
Current = _template.Clone() as DataRecord ?? throw new ApplicationException("记录拷贝失败");
|
|
|
|
|
if(_autoIncrementColumn is not null)
|
|
|
|
|
{
|
|
|
|
|
foreach (var column in _autoIncrementColumn)
|
|
|
|
|
{
|
|
|
|
|
Current[column] = (Convert.ToInt64(Current[column]) + 1).ToString();
|
|
|
|
|
_template = Current;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Current["CompanyID"] = Range[Random.Shared.Next(0, Range.Count)].ToString();//随机CompanyID
|
|
|
|
|
}
|
|
|
|
|
else Current = _template;
|
|
|
|
|
_currentCount++;
|
|
|
|
|
return _currentCount < _mockCount;
|
|
|
|
|
}
|
|
|
|
|
}
|