This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
---
source_files:
- Common/DTS.CommonCore/Interface/Graphs/IGraph.cs
- Common/DTS.CommonCore/Interface/Graphs/IGraphRecord.cs
generated_at: "2026-04-16T02:23:21.443229+00:00"
model: "Qwen/Qwen3-Coder-Next-FP8"
schema_version: 1
sha256: "a5e5bc31a5802f38"
---
# Graphs
## Documentation: `IGraph` Interface
---
### 1. **Purpose**
The `IGraph` interface defines the contract for a graph entity that aggregates and manages a collection of `IGroupChannel` instances, along with associated display and persistence metadata. It extends `IGraphRecord` to combine database-backed metadata (e.g., name, axis limits, thresholds) with runtime graph composition logic (adding/removing channels, XML serialization/deserialization). This module serves as the core abstraction for graph configuration in the system—enabling programmatic manipulation of channel groupings and persistence of graph state to/from XML and database records.
---
### 2. **Public Interface**
#### `IGraph` Interface (inherits `IGraphRecord`)
- **`void AddChannel(IGroupChannel groupChannel)`**
Adds the specified `IGroupChannel` to the graphs internal collection of channels. Must be called before serialization to ensure the channel is included in `ChannelsString`.
- **`void RemoveChannel(IGroupChannel groupChannel)`**
Removes the specified `IGroupChannel` from the graphs internal collection of channels. Must be followed by `UpdateChannelAndThresholdStrings()` to persist the change to `ChannelsString`.
- **`void ReadXML(System.Xml.XmlElement root, IReadOnlyDictionary<long, IGroupChannel> channelLookup)`**
Deserializes graph state from an XML element (`root`). Uses `channelLookup` to resolve channel references by ID (keyed by `long`). Populates the graphs channels and metadata (e.g., axis limits, thresholds) from XML. *Note: Does not automatically call `UpdateChannelAndThresholdStrings()`—callers must do so explicitly if needed.*
- **`void WriteXML(ref System.Xml.XmlWriter writer)`**
Serializes the graphs state (including channels and thresholds) to XML using the provided `XmlWriter`. Relies on the current values of `ChannelsString` and `ThresholdsString`, which must be up-to-date (e.g., via `UpdateChannelAndThresholdStrings()`).
- **`void UpdateChannelAndThresholdStrings()`**
Synchronizes the `ChannelsString` and `ThresholdsString` properties with the current in-memory state of `GroupChannels` and `Thresholds`. *This method must be invoked before `WriteXML()` or any database persistence to ensure consistency.*
#### `IGraphRecord` Interface (inherited members)
| Member | Type | Description |
|--------|------|-------------|
| `GraphId` | `int` | Database primary key for the graph record. |
| `TestSetupId` | `int` | Foreign key linking the graph to a specific test setup. |
| `GraphName` | `string` | Human-readable name (max 50 chars). |
| `GraphDescription` | `string` | Human-readable description (max 50 chars). |
| `ChannelsString` | `string` | Serialized list of channel identifiers (max 2048 chars). |
| `UseDomainMin`, `DomainMin` | `bool`, `double` | Controls whether the domain (X) axis minimum is enforced. |
| `UseDomainMax`, `DomainMax` | `bool`, `double` | Controls whether the domain (X) axis maximum is enforced. |
| `UseRangeMin`, `RangeMin` | `bool`, `double` | Controls whether the range (Y) axis minimum is enforced. |
| `UseRangeMax`, `RangeMax` | `bool`, `double` | Controls whether the range (Y) axis maximum is enforced. |
| `ThresholdsString` | `string` | Serialized list of threshold definitions (max 2048 chars). |
| `LocalOnly` | `bool` | **Deprecated** flag indicating whether the record is local-only (not synced to central DB). |
> **Note**: `IGraphRecord` does *not* expose `GroupChannels` or `Thresholds` as properties—these are inferred to be internal to implementations of `IGraph`. The `ChannelsString` and `ThresholdsString` are the persisted representations.
---
### 3. **Invariants**
- `ChannelsString` and `ThresholdsString` **must** be kept in sync with the in-memory channel/threshold state via `UpdateChannelAndThresholdStrings()` before persistence (e.g., `WriteXML`, DB save).
- `GraphName` and `GraphDescription` are constrained to ≤ 50 characters (via `[MaxLength(50)]`).
- `ChannelsString` and `ThresholdsString` are constrained to ≤ 2048 characters (via `[MaxLength(2048)]`).
- Axis limits (`DomainMin`, `DomainMax`, etc.) are only semantically valid when their corresponding `Use*` flag is `true`.
- `LocalOnly` is deprecated and should be ignored in new logic.
---
### 4. **Dependencies**
- **Depends on**:
- `DTS.Common.Interface.Channels.IGroupChannel` (for channel management).
- `System.Collections.Generic.IReadOnlyDictionary<long, IGroupChannel>` (for XML deserialization channel resolution).
- `System.Xml.XmlElement`, `System.Xml.XmlWriter` (for XML I/O).
- `System.ComponentModel.DataAnnotations` (for metadata annotations like `[MaxLength]`).
- **Depended on by**:
- Likely consumed by UI layers (graph rendering), persistence services (DB/XML I/O), and test setup configuration modules (given `TestSetupId`).
- Implementations (not shown) would be concrete graph types (e.g., `Graph`, `TimeSeriesGraph`).
---
### 5. **Gotchas**
- **Critical**: `ReadXML` does *not* automatically call `UpdateChannelAndThresholdStrings()`—implementations or callers must ensure strings are updated post-deserialization if persistence is required.
- **Critical**: `AddChannel`/`RemoveChannel` modify internal state but do *not* update `ChannelsString`; `UpdateChannelAndThresholdStrings()` must be called explicitly afterward.
- **Ambiguity**: The interface does not expose `GroupChannels` or `Thresholds` as properties—only their serialized string forms (`ChannelsString`, `ThresholdsString`). This implies implementations manage these collections internally, but the exact structure (e.g., `List<IGroupChannel>`, `HashSet<IGroupChannel>`) is unknown.
- **Deprecated Flag**: `LocalOnly` is marked as deprecated but remains part of the interface—avoid using it in new code.
- **String Length Limits**: `ChannelsString` and `ThresholdsString` are capped at 2048 characters; implementations must ensure serialization does not exceed this (e.g., by truncating or rejecting channels).
- **No Validation on Axis Values**: While `Use*` flags control whether min/max values are applied, the interface does not enforce logical consistency (e.g., `DomainMin < DomainMax`).