oi-metrology/Server/Repositories/OpenInsightV1Repository.cs

85 lines
3.7 KiB
C#

using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using System.Data;
using System.Data.Common;
using System.Text;
#pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625
namespace OI.Metrology.Server.Repositories;
public class OpenInsightV1Repository : IOpenInsightV1Repository
{
private readonly string _MockRoot;
private readonly string _RepositoryName;
private readonly IDbConnectionFactory _DBConnectionFactory;
public OpenInsightV1Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory)
{
_MockRoot = appSettings.MockRoot;
_DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(OpenInsightV1Repository)[..^10];
}
string IOpenInsightV1Repository.GetCommandText(string rds, string? insertDate, string? recipe)
{
StringBuilder result = new();
if (string.IsNullOrEmpty(rds))
throw new ArgumentException(null, nameof(rds));
if (string.IsNullOrEmpty(insertDate))
throw new ArgumentException(null, nameof(insertDate));
if (string.IsNullOrEmpty(recipe))
throw new ArgumentException(null, nameof(recipe));
_ = result
.AppendLine(" select header.RDS, ")
.AppendLine(" child.AttachmentId, ")
.AppendLine(" child.Slot, ")
.AppendLine(" child.SumOfDefects, ")
.AppendLine(" child.Sort, ")
.AppendLine(" child.InsertDate ")
.AppendLine(" from metrology.dbo.tencorRunHeader header ")
.AppendLine(" inner join metrology.dbo.TencorRunData child ")
.AppendLine(" on header.id = child.headerId ")
.Append(" where header.rds = '").Append(rds).AppendLine("' ")
.Append(" and header.recipe like '").Append(recipe).AppendLine("%' ")
.Append(" and child.insertdate between (select(dateadd(minute, -5, '").Append(insertDate).AppendLine("'))) ")
.Append(" and (select(dateadd(minute, 5, '").Append(insertDate).AppendLine("'))) ")
.AppendLine(" order by header.insertdate desc, ")
.AppendLine(" child.slot asc ")
.AppendLine(" for json path; ");
return result.ToString();
}
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText)
{
StringBuilder stringBuilder = new();
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection();
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = commandText;
DbDataReader dbDataReader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess);
while (dbDataReader.Read())
_ = stringBuilder.Append(dbDataReader.GetString(0));
return stringBuilder;
}
string IOpenInsightV1Repository.GetTencorRun(string rds, string? insertDate, string? recipe)
{
StringBuilder result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IOpenInsightV1Repository.GetTencorRun)}.json"));
result = new(json);
}
else
{
IOpenInsightV1Repository openInsightRepository = this;
string commandText = openInsightRepository.GetCommandText(rds, insertDate, recipe);
result = GetForJsonPath(_DBConnectionFactory, commandText);
if (result.Length == 0)
result = new("{}");
}
return result.ToString();
}
}