tbf/TBF/BenchControl/Output/SensusTestInfo.cs

350 lines
20 KiB
C#

///
/// Copyright (c) 2018-2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
namespace TBF.BenchControl.Output
{
public enum LogType
{
Just_Q3Q2Q1, /// pNrs = 3,2,1
Just_Q3Q2Q1_Alt, /// pNrs = 5,2,1
Just_Q3Q2adjQ1, /// pNrs = 3,2,1
Just_Q3Q2adjQ1_Alt, /// pNrs = 5,2,1
DEWA, /// Q1, Q2adj, Q2, Q3, Q4
Suez, /// Two directions, with Q2 and Q2ac
Suez_smart, /// There is only Q2ac in both directions
Suez_Repeatability, /// 3xQ3, 3xQ2, 3xQ1
Suez_EMP_DN15, /// EMP: 12 flow rates
Suez_EMP_DN20, /// EMP: 12 flow rates
Suez_EMP_DN32, /// EMP: 12 flow rates
Suez_EMP_DN40, /// EMP: 12 flow rates
Count,
None,
}
public enum Range
{
Undefined,
R90_100,
R95_105,
R100_110,
}
///
/// Information extracted from VT_PRUEFPUNKT_SOLL_SD for a given watermeter by query:
/// SELECT * FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=x AND Rev_WZTyp=y
///
public class SensusTestInfo
{
public string TestName; /// Test name in TBF procedures
public int PruefungsNrDB; /// Identification of a flow
public string QBezeichnungDB; /// Flow name in Oracle database
public int PruefungsNrOpto; /// Identification of a flow - string form for log files
public string QBezeichnungOpto; /// Flow name in Oracle database
public int PruefungsNrLog; /// Identification of a flow
public string QBezeichnungLog; /// Flow name in Oracle database
public Range Range; /// Range.R90_100 or Range.R100_110 (flow range in % of a target flow)
public SensusTestInfo(string tstName, int pnDB, string qbDB, int pnOpto, string qbOpto, int pnLog, string qbLog, Range range)
{
TestName = tstName;
PruefungsNrDB = pnDB;
QBezeichnungDB = qbDB;
PruefungsNrOpto = pnOpto;
QBezeichnungOpto = qbOpto;
PruefungsNrLog = pnLog;
QBezeichnungLog = qbLog;
Range = range;
}
/// <summary>
/// Determines whether test infos are compatible with procedure tests.
/// </summary>
/// <returns>true when compatible</returns>
public static bool AreCompatible(SensusTestInfo[] completeTestInfo, IList<string> testNames)
{
/// All TBF tests in the completeTestInfo must exist in the procedure
foreach (var cti in completeTestInfo)
{
bool testExists = false;
foreach (var tn in testNames)
{
if (cti.TestName == tn)
{
testExists = true;
break;
}
}
if (!testExists) return false;
}
return true;
}
/// <summary>
/// Determines whether Oracle and complete test infos are compatible.
/// </summary>
/// <returns>true when compatible</returns>
public static bool AreCompatible(IList<SensusTestInfo> oracleTestInfo, SensusTestInfo[] completeTestInfo)
{
/// All tests in oracleTestInfo must exist in completeTestInfo
foreach (var oti in oracleTestInfo)
{
bool testExists = false;
foreach (var cti in completeTestInfo)
{
if ((cti.PruefungsNrDB == oti.PruefungsNrDB) && oti.QBezeichnungDB.Contains(cti.QBezeichnungDB))
{
testExists = true;
break;
}
}
if (!testExists) return false;
}
return true;
}
/// <summary>
/// Get best matching TBF complete test infos (never null).
/// </summary>
/// <param name="oracleTestInfo">Raw test info from Oracle</param>
/// <returns>Complete test info</returns>
public static SensusTestInfo[] GetBestMatch(IList<SensusTestInfo> oracleTestInfo, IList<string> testNames)
{
LogType bestLT = LogType.None;
SensusTestInfo[] bestMatch = null;
int bestMatchLen = 0;
///
/// Find the longest match that is compatible with TBF procedure _AND_ 'oracleTestInfo'.
///
for (LogType lt = 0; lt < LogType.Count; lt++)
{
SensusTestInfo[] candidateTinfo = SensusTestInfo.GetTestInfos(lt);
if (AreCompatible(candidateTinfo, testNames) && AreCompatible(oracleTestInfo, candidateTinfo) &&
((bestMatch == null) || (candidateTinfo.Length > bestMatchLen)))
{
bestLT = lt;
bestMatch = candidateTinfo;
bestMatchLen = candidateTinfo.Length;
}
}
if (bestMatch == null)
{
///
/// No matching complete test info found so far => Find a match that is compatible with TBF procedure _ONLY_.
///
for (LogType lt = 0; lt < LogType.Count; lt++)
{
SensusTestInfo[] candidateTinfo = SensusTestInfo.GetTestInfos(lt);
if (AreCompatible(candidateTinfo, testNames) && ((bestMatch == null) || (candidateTinfo.Length < bestMatchLen)))
{
bestLT = lt;
bestMatch = candidateTinfo;
bestMatchLen = candidateTinfo.Length;
}
}
}
return (bestLT != LogType.None) ? bestMatch : GetTestInfos(LogType.Just_Q3Q2Q1); /// Never return null
}
/// <summary>
/// Get on eof the pre-defined complete test infos.
/// </summary>
/// <param name="logType">Type</param>
/// <returns>Complete test info</returns>
public static SensusTestInfo[] GetTestInfos(LogType logType)
{
switch (logType)
{
default:
case LogType.Just_Q3Q2Q1: /// Standard R160, R250, R400
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Adjustment", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Q3", 3, "Q3", 3, "03", 3, "Q3", Range.R90_100),
new SensusTestInfo("Q2", 2, "Q2", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Just_Q3Q2Q1_Alt: /// Alternative R160, R250, R400
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Adjustment", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Q3", 5, "Q3", 5, "05", 5, "Q3", Range.R90_100),
new SensusTestInfo("Q2", 2, "Q2", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Just_Q3Q2adjQ1: /// Standard R800
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q2adj", 0, "", 2, "02", 0, "", Range.R100_110),
new SensusTestInfo("Adjustment", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Q3", 3, "Q3", 3, "03", 3, "Q3", Range.R90_100),
new SensusTestInfo("Q2", 2, "Q2", 0, "", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Just_Q3Q2adjQ1_Alt: /// Alternative R800
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q2adj", 0, "", 2, "02", 0, "", Range.R100_110),
new SensusTestInfo("Adjustment", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Q3", 5, "Q3", 5, "05", 5, "Q3", Range.R90_100),
new SensusTestInfo("Q2", 2, "Q2", 0, "", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.DEWA: /// DEWA (with Q4 and Q2 after correction)
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Adjustment", -1, "Just", -1, "-1", -1, "Q-1", Range.R95_105),
new SensusTestInfo("Q4", 5, "Q4", 5, "05", 10, "Q10", Range.R90_100),
new SensusTestInfo("Q3", 4, "Q3", 4, "04", 9, "Q9", Range.R90_100),
new SensusTestInfo("Q2adj", 3, "Q2", 3, "03", 8, "Q8", Range.R100_110),
new SensusTestInfo("Q2", 2, "Q2ac", 2, "02", 7, "Q7", Range.R100_110),
new SensusTestInfo("Q1", 1, "Q1", 1, "01", 6, "Q6", Range.R100_110),
};
case LogType.Suez:
return new SensusTestInfo[] /// SUEZ (2 directions)
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Qjust_A0", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Qjust_A4", -2, "Just", -2, "-2", -2, "Just", Range.R95_105),
new SensusTestInfo("Q3_rl", 10, "Q3", 10, "10", 10, "Q3", Range.R90_100),
new SensusTestInfo("Q2_rl", 8, "Q2", 8, "08", 8, "Q2", Range.R100_110),
new SensusTestInfo("Q2ac_rl", 7, "Q2ac", 7, "07", 7, "Q2ac", Range.R100_110),
new SensusTestInfo("Q1_rl", 6, "Q1", 6, "06", 6, "Q1", Range.R100_110),
new SensusTestInfo("Q3_lr", 5, "Q3", 5, "05", 5, "Q3", Range.R90_100),
new SensusTestInfo("Q2_lr", 3, "Q2", 3, "03", 3, "Q2", Range.R100_110),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2ac", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_smart:
return new SensusTestInfo[] /// SUEZ (2 directions)
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Qjust_A0", -1, "Just", -1, "-1", -1, "Just", Range.R95_105),
new SensusTestInfo("Qjust_A4", -2, "Just", -2, "-2", -2, "Just", Range.R95_105),
new SensusTestInfo("Q3_rl", 10, "Q3", 10, "10", 10, "Q3", Range.R90_100),
new SensusTestInfo("Q2ac_rl", 7, "Q2ac", 7, "07", 7, "Q2ac", Range.R100_110),
new SensusTestInfo("Q1_rl", 6, "Q1", 6, "06", 6, "Q1", Range.R100_110),
new SensusTestInfo("Q3_lr", 5, "Q3", 5, "05", 5, "Q3", Range.R90_100),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2ac", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_Repeatability:
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q3_lr (1/3)", 5, "Q3", 9, "09", 9, "Q3", Range.R90_100),
new SensusTestInfo("Q3_lr (2/3)", 5, "Q3", 8, "08", 8, "Q3", Range.R90_100),
new SensusTestInfo("Q3_lr (3/3)", 5, "Q3", 7, "07", 7, "Q3", Range.R90_100),
new SensusTestInfo("Q2ac_lr (1/3)", 2, "Q2ac", 6, "06", 6, "Q2ac", Range.R100_110),
new SensusTestInfo("Q2ac_lr (2/3)", 2, "Q2ac", 5, "05", 5, "Q2ac", Range.R100_110),
new SensusTestInfo("Q2ac_lr (3/3)", 2, "Q2ac", 4, "04", 4, "Q2ac", Range.R100_110),
new SensusTestInfo("Q1_lr (1/3)", 1, "Q1", 3, "03", 3, "Q1", Range.R100_110),
new SensusTestInfo("Q1_lr (2/3)", 1, "Q1", 2, "02", 2, "Q1", Range.R100_110),
new SensusTestInfo("Q1_lr (3/3)", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_EMP_DN15:
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q4", 0, "", 12, "12", 12, "Q4", Range.R90_100),
new SensusTestInfo("Q3_lr", 5, "Q3", 11, "11", 11, "Q3", Range.R90_100),
new SensusTestInfo("Q1.35", 0, "", 10, "10", 10, "Q1.35", Range.R95_105),
new SensusTestInfo("Q0.7", 0, "", 9, "09", 9, "Q0.7", Range.R95_105),
new SensusTestInfo("Q0.28", 0, "", 8, "08", 8, "Q0.28", Range.R95_105),
new SensusTestInfo("Q0.15", 0, "", 7, "07", 7, "Q0.15", Range.R95_105),
new SensusTestInfo("Q0.08", 0, "", 6, "06", 6, "Q0.08", Range.R95_105),
new SensusTestInfo("Q0.04", 0, "", 5, "05", 5, "Q0.04", Range.R95_105),
new SensusTestInfo("Q0.0236", 0, "", 4, "04", 4, "Q0.0236", Range.R95_105),
new SensusTestInfo("Q0.010", 0, "", 3, "03", 3, "Q0.010", Range.R95_105),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_EMP_DN20:
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q4", 0, "", 12, "12", 12, "Q4", Range.R90_100),
new SensusTestInfo("Q3_lr", 5, "Q3", 11, "11", 11, "Q3", Range.R90_100),
new SensusTestInfo("Q2.16", 0, "", 10, "10", 10, "Q2.16", Range.R95_105),
new SensusTestInfo("Q1.35", 0, "", 9, "09", 9, "Q1.35", Range.R95_105),
new SensusTestInfo("Q0.7", 0, "", 8, "08", 8, "Q0.7", Range.R95_105),
new SensusTestInfo("Q0.28", 0, "", 7, "07", 7, "Q0.28", Range.R95_105),
new SensusTestInfo("Q0.15", 0, "", 6, "06", 6, "Q0.15", Range.R95_105),
new SensusTestInfo("Q0.08", 0, "", 5, "05", 5, "Q0.08", Range.R95_105),
new SensusTestInfo("Q0.04", 0, "", 4, "04", 4, "Q0.04", Range.R95_105),
new SensusTestInfo("Q0.02", 0, "", 3, "03", 3, "Q0.02", Range.R95_105),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_EMP_DN32:
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q4", 0, "", 12, "12", 12, "Q4", Range.R90_100),
new SensusTestInfo("Q3_lr", 5, "Q3", 11, "11", 11, "Q3", Range.R90_100),
new SensusTestInfo("Q5", 0, "", 10, "10", 10, "Q5", Range.R95_105),
new SensusTestInfo("Q2.5", 0, "", 9, "09", 9, "Q2.5", Range.R95_105),
new SensusTestInfo("Q1.35", 0, "", 8, "08", 8, "Q1.35", Range.R95_105),
new SensusTestInfo("Q0.65", 0, "", 7, "07", 7, "Q0.65", Range.R95_105),
new SensusTestInfo("Q0.35", 0, "", 6, "06", 6, "Q0.35", Range.R95_105),
new SensusTestInfo("Q0.16", 0, "", 5, "05", 5, "Q0.16", Range.R95_105),
new SensusTestInfo("Q0.09", 0, "", 4, "04", 4, "Q0.09", Range.R95_105),
new SensusTestInfo("Q0.04", 0, "", 3, "03", 3, "Q0.04", Range.R95_105),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
case LogType.Suez_EMP_DN40:
return new SensusTestInfo[]
{
/// TBF Oracle DB Opto RAW LU logfiles
new SensusTestInfo("Q4", 0, "", 12, "12", 12, "Q4", Range.R90_100),
new SensusTestInfo("Q3_lr", 5, "Q3", 11, "11", 11, "Q3", Range.R90_100),
new SensusTestInfo("Q8", 0, "", 10, "10", 10, "Q8", Range.R95_105),
new SensusTestInfo("Q5", 0, "", 9, "09", 9, "Q5", Range.R95_105),
new SensusTestInfo("Q2.5", 0, "", 8, "08", 8, "Q2.5", Range.R95_105),
new SensusTestInfo("Q1.35", 0, "", 7, "07", 7, "Q1.35", Range.R95_105),
new SensusTestInfo("Q0.65", 0, "", 6, "06", 6, "Q0.65", Range.R95_105),
new SensusTestInfo("Q0.35", 0, "", 5, "05", 5, "Q0.35", Range.R95_105),
new SensusTestInfo("Q0.16", 0, "", 4, "04", 4, "Q0.16", Range.R95_105),
new SensusTestInfo("Q0.09", 0, "", 3, "03", 3, "Q0.09", Range.R95_105),
new SensusTestInfo("Q2ac_lr", 2, "Q2ac", 2, "02", 2, "Q2", Range.R100_110),
new SensusTestInfo("Q1_lr", 1, "Q1", 1, "01", 1, "Q1", Range.R100_110),
};
}
}
public override string ToString()
{
return string.Format("{0} DB={1}/'{2}' Opto={3}/'{4}' Log={5}/'{6}'/{7}", TestName, PruefungsNrDB, QBezeichnungDB, PruefungsNrOpto, QBezeichnungOpto, PruefungsNrLog, QBezeichnungLog, Range);
}
}
}