614 lines
28 KiB
C#

using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Adaptation.Shared
{
public class ExtractResult
{
public object ProcessData { get; internal set; }
public long LastTicksDuration { get; private set; }
public long BreakAfterSeconds { get; private set; }
public Enum[] EnumColumns { get; protected set; }
public List<string> SourceFiles { get; private set; }
public Column[] PairedColumns { get; protected set; }
public Dictionary<Enum, List<string>> Headers { get; protected set; }
public Dictionary<Enum, List<string>> Details { get; protected set; }
public Dictionary<Enum, List<string>> Parameters { get; protected set; }
public Dictionary<Enum, List<ExtendedParameter>> ExtendedParameters { get; protected set; }
public Dictionary<Enum, List<string>> DatabaseHeaders { get; protected set; }
public Dictionary<Enum, List<string>> DatabaseDetails { get; protected set; }
public Dictionary<Description.RowColumn, List<int>> RowColumns { get; protected set; }
public Dictionary<Test, Dictionary<Enum, List<int>>> IgnoreIndeices { get; protected set; }
public Dictionary<Description.LogisticsColumn, List<string>> LogisticsColumns { get; protected set; }
public ExtractResult(ExtractResult extractResult, long breakAfterSeconds, Enum[] enumColumns, Column[] pairedColumns)
{
if (enumColumns is null)
enumColumns = new Enum[] { };
if (pairedColumns is null)
pairedColumns = new Column[] { };
ProcessData = null;
EnumColumns = enumColumns;
PairedColumns = pairedColumns;
SourceFiles = new List<string>();
if (!(extractResult is null) && !(extractResult.SourceFiles is null))
SourceFiles.AddRange(extractResult.SourceFiles);
BreakAfterSeconds = breakAfterSeconds;
List<Enum> headers = new List<Enum>();
List<Enum> details = new List<Enum>();
List<Enum> parameters = new List<Enum>();
List<Enum> databaseHeaders = new List<Enum>();
List<Enum> databaseDetails = new List<Enum>();
UpdateLastTicksDuration(breakAfterSeconds * 10000000);
Common(headers, details, parameters, databaseHeaders, databaseDetails);
}
private void Common(List<Enum> headers, List<Enum> details, List<Enum> parameters, List<Enum> databaseHeaders, List<Enum> databaseDetails)
{
Headers = new Dictionary<Enum, List<string>>();
Details = new Dictionary<Enum, List<string>>();
Parameters = new Dictionary<Enum, List<string>>();
ExtendedParameters = new Dictionary<Enum, List<ExtendedParameter>>();
DatabaseHeaders = new Dictionary<Enum, List<string>>();
DatabaseDetails = new Dictionary<Enum, List<string>>();
IgnoreIndeices = new Dictionary<Test, Dictionary<Enum, List<int>>>();
LogisticsColumns = new Dictionary<Description.LogisticsColumn, List<string>>();
foreach (Enum item in headers)
Headers.Add(item, new List<string>());
foreach (Enum item in details)
Details.Add(item, new List<string>());
foreach (Enum item in parameters)
Parameters.Add(item, new List<string>());
foreach (Enum item in parameters)
ExtendedParameters.Add(item, new List<ExtendedParameter>());
foreach (Enum item in databaseHeaders)
DatabaseHeaders.Add(item, new List<string>());
foreach (Enum item in databaseDetails)
DatabaseDetails.Add(item, new List<string>());
Array array;
array = Enum.GetValues(typeof(Description.RowColumn));
RowColumns = new Dictionary<Description.RowColumn, List<int>>();
foreach (Description.RowColumn item in array)
RowColumns.Add(item, new List<int>());
array = Enum.GetValues(typeof(Description.LogisticsColumn));
foreach (Description.LogisticsColumn item in array)
LogisticsColumns.Add(item, new List<string>());
}
internal void Reset()
{
ProcessData = null;
SourceFiles.Clear();
List<Enum> headers = new List<Enum>();
List<Enum> details = new List<Enum>();
List<Enum> parameters = new List<Enum>();
List<Enum> databaseHeaders = new List<Enum>();
List<Enum> databaseDetails = new List<Enum>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
headers.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Details)
details.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
parameters.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
databaseHeaders.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
databaseDetails.Add(item.Key);
Common(headers, details, parameters, databaseHeaders, databaseDetails);
}
public ExtractResult ShallowCopy()
{
return (ExtractResult)this.MemberwiseClone();
}
internal void HeadersAddRange(Enum column)
{
Headers.Add(column, new List<string>());
}
internal void HeadersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Headers.Add(item, new List<string>());
}
internal void HeadersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Headers.Add(item, new List<string>());
}
internal void DetailsAddRange(Enum column)
{
Details.Add(column, new List<string>());
}
internal void DetailsAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Details.Add(item, new List<string>());
}
internal void DetailsAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Details.Add(item, new List<string>());
}
internal void ParametersAddRange(Enum column)
{
Parameters.Add(column, new List<string>());
}
internal void ParametersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Parameters.Add(item, new List<string>());
}
internal void ParametersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Parameters.Add(item, new List<string>());
}
internal void DatabaseHeadersAddRange(Enum column)
{
DatabaseHeaders.Add(column, new List<string>());
}
internal void DatabaseHeadersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
DatabaseHeaders.Add(item, new List<string>());
}
internal void DatabaseHeadersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
DatabaseHeaders.Add(item, new List<string>());
}
internal void DatabaseDetailsAddRange(Enum column)
{
DatabaseDetails.Add(column, new List<string>());
}
internal void DatabaseDetailsAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
DatabaseDetails.Add(item, new List<string>());
}
internal void DatabaseDetailsAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
DatabaseDetails.Add(item, new List<string>());
}
internal int GetCount()
{
int result;
List<int> counts = new List<int>
{
RowColumns[Description.RowColumn.Test].Count()
};
foreach (KeyValuePair<Enum, List<string>> item in Headers)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in Details)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
counts.Add(item.Value.Count());
result = counts.Max();
if (counts.Distinct().Count() != 1)
throw new Exception();
return result;
}
private Dictionary<Enum, List<string>> Merge(List<KeyValuePair<Enum, List<string>>> keyValuePairs)
{
Dictionary<Enum, List<string>> results = new Dictionary<Enum, List<string>>();
foreach (KeyValuePair<Enum, List<string>> element in keyValuePairs)
results.Add(element.Key, element.Value);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetAllColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetAllColumnCollection()
{
Dictionary<Enum, List<string>> results;
if (!EnumColumns.Any())
{
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetAllColumnKeyValuePairs();
results = Merge(keyValuePairs);
}
else
{
results = new Dictionary<Enum, List<string>>();
foreach (Enum item in EnumColumns)
results.Add(item, new List<string>());
foreach (Column item in PairedColumns)
results.Add(item, new List<string>());
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in Details)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results[item.Key].AddRange(item.Value);
int count = GetCount();
foreach (KeyValuePair<Enum, List<string>> keyValuePair in results)
{
for (int i = keyValuePair.Value.Count; i < count; i++)
results[keyValuePair.Key].Add(string.Empty);
}
}
return results;
}
private Dictionary<Enum, string> Merge(List<KeyValuePair<Enum, string>> keyValuePairs)
{
Dictionary<Enum, string> results = new Dictionary<Enum, string>();
foreach (KeyValuePair<Enum, string> element in keyValuePairs)
results.Add(element.Key, element.Value);
return results;
}
private List<KeyValuePair<Enum, string>> GetAllColumnKeyValuePairs(int? i)
{
List<KeyValuePair<Enum, string>> results = new List<KeyValuePair<Enum, string>>();
if (i.HasValue)
{
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
}
return results;
}
internal Dictionary<Enum, string> GetAllColumnCollection(int? i)
{
Dictionary<Enum, string> results;
List<KeyValuePair<Enum, string>> keyValuePairs = GetAllColumnKeyValuePairs(i);
results = Merge(keyValuePairs);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetToolHeadersAndDatabaseHeadersCollection()
{
Dictionary<Enum, List<string>> results;
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs();
results = Merge(keyValuePairs);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetToolDetailsAndDatabaseDetailsCollection()
{
Dictionary<Enum, List<string>> results;
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs();
results = Merge(keyValuePairs);
return results;
}
internal Dictionary<Test, List<int>> GetTests()
{
Dictionary<Test, List<int>> results = new Dictionary<Test, List<int>>();
Test test;
for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count; i++)
{
test = (Test)RowColumns[Description.RowColumn.Test][i];
if (!results.ContainsKey(test))
results.Add(test, new List<int>());
results[test].Add(i);
}
return results;
}
internal void FillIn(string nullData, int count, Enum[] currentColumns)
{
foreach (Enum column in Headers.Keys)
{
for (int i = Headers[column].Count(); i < count; i++)
Headers[column].Add(nullData);
}
foreach (Enum column in Details.Keys)
{
for (int i = Details[column].Count(); i < count; i++)
Details[column].Add(nullData);
}
if (!(currentColumns is null))
{
foreach (Enum column in currentColumns)
{
for (int i = Parameters[column].Count(); i < count; i++)
Parameters[column].Add(nullData);
}
}
foreach (Enum column in Parameters.Keys)
{
for (int i = Parameters[column].Count(); i < count; i++)
Parameters[column].Add(string.Empty);
}
foreach (Enum column in DatabaseHeaders.Keys)
{
for (int i = DatabaseHeaders[column].Count(); i < count; i++)
DatabaseHeaders[column].Add(string.Empty);
}
foreach (Enum column in DatabaseDetails.Keys)
{
for (int i = DatabaseDetails[column].Count(); i < count; i++)
DatabaseDetails[column].Add(string.Empty);
}
if (RowColumns[Description.RowColumn.Count].Count() != RowColumns[Description.RowColumn.Test].Count())
{
count = RowColumns[Description.RowColumn.Test].Count();
RowColumns[Description.RowColumn.Count].Clear();
for (int i = 0; i < count; i++)
RowColumns[Description.RowColumn.Count].Add(count);
}
}
internal void SetCollections(Logistics logistics, Dictionary<Test, Dictionary<string, List<string>>> rawData)
{
Array array;
Column? column;
bool recordStartPresent = false;
Description.RowColumn? rowColumn;
Description.LogisticsColumn? logisticsColumn;
array = Enum.GetValues(typeof(Description.RowColumn));
Dictionary<string, Enum> headers = new Dictionary<string, Enum>();
Dictionary<string, Enum> details = new Dictionary<string, Enum>();
Dictionary<string, Enum> parameters = new Dictionary<string, Enum>();
Dictionary<string, Enum> databaseHeaders = new Dictionary<string, Enum>();
Dictionary<string, Enum> databaseDetails = new Dictionary<string, Enum>();
Dictionary<Description.RowColumn, List<string>> rowColumns = new Dictionary<Description.RowColumn, List<string>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
headers.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Details)
details.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
parameters.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
databaseHeaders.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
databaseDetails.Add(item.Key.ToString(), item.Key);
foreach (Description.RowColumn item in array)
rowColumns.Add(item, new List<string>());
foreach (KeyValuePair<Test, Dictionary<string, List<string>>> element in rawData)
{
foreach (KeyValuePair<string, List<string>> item in element.Value)
{
column = null;
rowColumn = null;
logisticsColumn = null;
if (item.Key == "Time")
continue;
else if (item.Key == "A_LOGISTICS")
continue;
else if (item.Key == "B_LOGISTICS")
continue;
else if (item.Key == "EventId")
continue;
else if (item.Key == ProcessDataStandardFormat.RecordStart)
{
recordStartPresent = true;
continue;
}
if (Enum.TryParse(item.Key, out Column columnTry))
column = columnTry;
else
{
if (Enum.TryParse(item.Key, out Description.LogisticsColumn logisticsColumnTry))
logisticsColumn = logisticsColumnTry;
else
{
if (Enum.TryParse(item.Key, out Description.RowColumn rowColumnTry))
rowColumn = rowColumnTry;
}
}
if (rowColumn.HasValue)
rowColumns[rowColumn.Value].AddRange(item.Value);
else if (logisticsColumn.HasValue)
LogisticsColumns[logisticsColumn.Value].AddRange(item.Value);
else if (column.HasValue)
{
if (Headers.ContainsKey(column.Value))
Headers[column.Value].AddRange(item.Value);
else if (Details.ContainsKey(column.Value))
Details[column.Value].AddRange(item.Value);
else if (Parameters.ContainsKey(column.Value))
Parameters[column.Value].AddRange(item.Value);
else if (DatabaseHeaders.ContainsKey(column.Value))
DatabaseHeaders[column.Value].AddRange(item.Value);
else if (DatabaseDetails.ContainsKey(column.Value))
DatabaseDetails[column.Value].AddRange(item.Value);
else
{
if (!recordStartPresent)
throw new Exception();
}
}
else
{
if (headers.ContainsKey(item.Key))
Headers[headers[item.Key]].AddRange(item.Value);
else if (details.ContainsKey(item.Key))
Details[details[item.Key]].AddRange(item.Value);
else if (parameters.ContainsKey(item.Key))
Parameters[parameters[item.Key]].AddRange(item.Value);
else if (databaseHeaders.ContainsKey(item.Key))
DatabaseHeaders[databaseHeaders[item.Key]].AddRange(item.Value);
else if (databaseDetails.ContainsKey(item.Key))
DatabaseDetails[databaseDetails[item.Key]].AddRange(item.Value);
else
{
if (!recordStartPresent)
throw new Exception();
}
}
}
}
foreach (KeyValuePair<Description.RowColumn, List<string>> element in rowColumns)
{
for (int i = 0; i < element.Value.Count(); i++)
{
int.TryParse(element.Value[i], out int rowColumnTry);
RowColumns[element.Key].Add(rowColumnTry);
}
}
array = Enum.GetValues(typeof(Description.RowColumn));
foreach (Description.RowColumn item in array)
{
if (!RowColumns.ContainsKey(item))
throw new Exception();
}
array = Enum.GetValues(typeof(Description.LogisticsColumn));
foreach (Description.LogisticsColumn item in array)
{
if (!LogisticsColumns.ContainsKey(item))
throw new Exception();
}
int count = rowColumns[Description.RowColumn.Test].Count();
foreach (KeyValuePair<Enum, List<string>> element in DatabaseHeaders)
{
for (int i = element.Value.Count(); i < count; i++)
element.Value.Add(string.Empty);
}
foreach (KeyValuePair<Enum, List<string>> element in DatabaseDetails)
{
for (int i = element.Value.Count(); i < count; i++)
element.Value.Add(string.Empty);
}
string nullData;
if (logistics.NullData is null)
nullData = string.Empty;
else
nullData = logistics.NullData.ToString();
Dictionary<Enum, List<string>> keyValuePairs;
foreach (Test key in rawData.Keys)
{
IgnoreIndeices.Add(key, new Dictionary<Enum, List<int>>());
for (int g = 1; g < 4; g++)
{
switch (g)
{
case 1: keyValuePairs = Details; break;
case 2: keyValuePairs = Parameters; break;
case 3: keyValuePairs = DatabaseDetails; break;
default: throw new Exception();
}
foreach (KeyValuePair<Enum, List<string>> element in keyValuePairs)
{
IgnoreIndeices[key].Add(element.Key, new List<int>());
if (!element.Value.Any())
{
for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count(); i++)
{
IgnoreIndeices[key][element.Key].Add(i);
element.Value.Add(string.Empty);
}
}
else
{
for (int i = 0; i < element.Value.Count(); i++)
{
if (RowColumns[Description.RowColumn.Test][i] == (int)key)
{
if (string.IsNullOrEmpty(element.Value[i]))
IgnoreIndeices[key][element.Key].Add(i);
else if (!(logistics.NullData is null) && element.Value[i] == nullData)
IgnoreIndeices[key][element.Key].Add(i);
}
}
}
}
}
}
if (recordStartPresent)
FillIn(string.Empty, RowColumns[Description.RowColumn.Test].Count(), currentColumns: null);
GetCount();
}
internal void UpdateLastTicksDuration(long ticksDuration)
{
if (ticksDuration < 50000000)
ticksDuration = 50000000;
LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667);
}
internal void AutoAdd(Enum key, string value)
{
if (Headers.ContainsKey(key))
Headers[key].Add(value);
else if (Details.ContainsKey(key))
Details[key].Add(value);
else if (Parameters.ContainsKey(key))
Parameters[key].Add(value);
else if (DatabaseHeaders.ContainsKey(key))
DatabaseHeaders[key].Add(value);
else if (DatabaseDetails.ContainsKey(key))
DatabaseDetails[key].Add(value);
else
throw new Exception();
}
}
}