core services and tests
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
[assembly: InternalsVisibleTo("QuantEngine.Core.Tests")]
|
||||
@@ -24,6 +24,14 @@ namespace QuantEngine.Infrastructure.Repositories
|
||||
_connectionFactory = connectionFactory;
|
||||
}
|
||||
|
||||
internal static IReadOnlyDictionary<string, string[]> GetDomainColumns() => DomainColumns;
|
||||
|
||||
internal static string BuildInsertSql(string domain, IReadOnlyList<string> insertColumns)
|
||||
=> $@"INSERT INTO engine_history.{domain} ({string.Join(", ", insertColumns)}) VALUES ({string.Join(", ", insertColumns.Select(column => $"@{column}"))})";
|
||||
|
||||
internal static string BuildSnapshotSql(string domain, int limit)
|
||||
=> $@"SELECT * FROM engine_history.{domain} ORDER BY created_at DESC LIMIT @Limit";
|
||||
|
||||
public async Task<int> AppendAsync(string domain, IDictionary<string, object?> payload)
|
||||
{
|
||||
if (!DomainColumns.TryGetValue(domain, out var columns))
|
||||
@@ -34,20 +42,17 @@ namespace QuantEngine.Infrastructure.Repositories
|
||||
|
||||
var values = new DynamicParameters();
|
||||
var insertColumns = new List<string>(columns.Length + 1);
|
||||
var placeholders = new List<string>(columns.Length + 1);
|
||||
foreach (var column in columns)
|
||||
{
|
||||
insertColumns.Add(column);
|
||||
placeholders.Add($"@{column}");
|
||||
values.Add(column, payload.TryGetValue(column, out var value) ? value : null);
|
||||
}
|
||||
|
||||
insertColumns.Add("provenance");
|
||||
placeholders.Add("@provenance");
|
||||
var provenance = payload.TryGetValue("provenance", out var provenanceValue) ? provenanceValue : new Dictionary<string, object?>();
|
||||
values.Add("provenance", provenance is string s ? s : JsonSerializer.Serialize(provenance));
|
||||
|
||||
var sql = $@"INSERT INTO engine_history.{domain} ({string.Join(", ", insertColumns)}) VALUES ({string.Join(", ", placeholders)})";
|
||||
var sql = BuildInsertSql(domain, insertColumns);
|
||||
return await conn.ExecuteAsync(sql, values);
|
||||
}
|
||||
|
||||
@@ -59,7 +64,7 @@ namespace QuantEngine.Infrastructure.Repositories
|
||||
using var conn = _connectionFactory.CreateConnection();
|
||||
conn.Open();
|
||||
|
||||
var sql = $@"SELECT * FROM engine_history.{domain} ORDER BY created_at DESC LIMIT @Limit";
|
||||
var sql = BuildSnapshotSql(domain, limit);
|
||||
var rows = await conn.QueryAsync(sql, new { Limit = limit });
|
||||
return rows.Select(row => (IDictionary<string, object?>)row).ToList();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user