feat(mtconnect): serve TIME_SERIES observations as variable-length double[] (#627)

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 14:25:45 -04:00
parent d898262c4a
commit da33f27544
8 changed files with 229 additions and 40 deletions
@@ -229,10 +229,25 @@ public sealed class MTConnectTagConfigModel
/// passed as null; it can only DEMOTE an item to String (DATA_SET/TABLE), which cannot create a false
/// warning because a numeric declaration on a String-inferred item is warned either way, and a SAMPLE
/// inferred Float64 is only warned about for a non-numeric, non-String declaration or an integer one.
/// TIME_SERIES arrays are not detectable without it and are not covered.
/// TIME_SERIES arrays are covered separately by the isArray rule in <see cref="Warnings"/>.
/// </remarks>
/// <returns>Zero or more human-readable warnings.</returns>
public IReadOnlyList<string> Warnings()
{
// #627: an array (TIME_SERIES) tag is served as double[] only. Independent of the probe metadata —
// the array flag is authored on the tag, and any other declared element type reads BadNotSupported.
var arrayWarning = _bag.TryGetPropertyValue("isArray", out var arr)
&& arr is JsonValue av && av.TryGetValue<bool>(out var isArray) && isArray
&& DataType != DriverDataType.Float64
? $"Data type {DataType} on an array tag: MTConnect TIME_SERIES arrays are served as Float64 (double[]) only; "
+ "declare Float64 or the tag reads BadNotSupported. Saving is still allowed."
: null;
var scalar = ScalarWarnings();
return arrayWarning is null ? scalar : [arrayWarning, .. scalar];
}
private IReadOnlyList<string> ScalarWarnings()
{
if (string.IsNullOrWhiteSpace(MtCategory)) { return []; }