History

GrafanaAdapters: Improved operation of unique label validation.

J. Ritchie Carroll committed 6 years ago

Commit 42e79fb1 parent a63554a1 file · +34 −28Browse files

Unified · Split

Source/Libraries/Adapters/GrafanaAdapters/GrafanaDataSourceBase.cs+34−28
@@ -838,23 +838,22 @@ namespace GrafanaAdapters · 837 unmodified lines
838838 {
839839 return Task.Factory.StartNew(() =>
840840 {
841−
842841 const string SignalIDQuery = "SELECT TOP 1 SignalID FROM ActiveMeasurement WHERE PointTag = '{0}'";
843842
844843 foreach (Target target in request.targets)
845844 target.target = target.target?.Trim() ?? "";
846845
847− if (request.targets.Where(item => item.target != "").Count() < 1)
846+ if (request.targets.All(item => string.IsNullOrWhiteSpace(item.target)))
848847 return new List<GrafanaAlarm>();
849848
850− List<string> pointTags = request.targets.Select(item => item.target.Split(';').ToList()).Aggregate((acc, list) => { return acc.Concat(list).ToList(); });
849+ List<string> pointTags = request.targets.Select(item => item.target.Split(';').ToList()).Aggregate((acc, list) => acc.Concat(list).ToList());
851850 string query = string.Join("),(", pointTags.Select(item => string.Format(SignalIDQuery, item.Trim())));
852851
853852 query = "((" + query + "))";
854853
855854 using (AdoDataConnection connection = new AdoDataConnection("systemSettings"))
856855 {
857− query = string.Format("SignalID in {0}", query);
856+ query = $"SignalID in {query}";
858857 return new TableOperations<GrafanaAlarm>(connection).QueryRecordsWhere(query).ToList();
859858 }
860859 },
@@ -1177,12 +1176,12 @@ namespace GrafanaAdapters · 316 unmodified lines
11771176 if (label.StartsWith("\"") || label.StartsWith("'"))
11781177 label = label.Substring(1, label.Length - 2);
11791178
1180− DataSourceValueGroup[] groups = dataset.ToArray();
1181− string[] seriesLabels = new string[groups.Length];
1179+ DataSourceValueGroup[] valueGroups = dataset.ToArray();
1180+ string[] seriesLabels = new string[valueGroups.Length];
11821181
1183− for (int i = 0; i < groups.Length; i++)
1182+ for (int i = 0; i < valueGroups.Length; i++)
11841183 {
1185− string target = groups[i].RootTarget;
1184+ string target = valueGroups[i].RootTarget;
11861185
11871186 seriesLabels[i] = TargetCache<string>.GetOrAdd($"{label}@{target}", () =>
11881187 {
@@ -1210,27 +1209,34 @@ namespace GrafanaAdapters · 21 unmodified lines
12101209
12111210 // ReSharper disable once AccessToModifiedClosure
12121211 if (derivedLabel.Equals(label, StringComparison.Ordinal))
1213− derivedLabel = $"{label}{(groups.Length > 1 ? $" {i + 1}" : "")}";
1212+ derivedLabel = $"{label}{(valueGroups.Length > 1 ? $" {i + 1}" : "")}";
12141213
12151214 return derivedLabel;
12161215 });
12171216 }
12181217
12191218 // Verify that all series labels are unique
1220− if (seriesLabels.Length > 1 && seriesLabels.All(seriesLabel => seriesLabel.Equals(seriesLabels[0], StringComparison.OrdinalIgnoreCase)))
1219+ if (seriesLabels.Length > 1)
12211220 {
1222− for (int i = 1; i < seriesLabels.Length; i++)
1223− seriesLabels[i] = $"{seriesLabels[i]}{new string('\u00A0', i)}";
1221+ HashSet<string> uniqueLabelSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
1222+
1223+ for (int i = 0; i < seriesLabels.Length; i++)
1224+ {
1225+ while (uniqueLabelSet.Contains(seriesLabels[i]))
1226+ seriesLabels[i] = $"{seriesLabels[i]}\u00A0";
1227+
1228+ uniqueLabelSet.Add(seriesLabels[i]);
1229+ }
12241230 }
12251231
1226− for (int i = 0; i < groups.Length; i++)
1232+ for (int i = 0; i < valueGroups.Length; i++)
12271233 {
12281234 yield return new DataSourceValueGroup
12291235 {
12301236 Target = seriesLabels[i],
1231− RootTarget = groups[i].RootTarget,
1237+ RootTarget = valueGroups[i].RootTarget,
12321238 SourceTarget = sourceTarget,
1233− Source = groups[i].Source,
1239+ Source = valueGroups[i].Source,
12341240 DropEmptySeries = dropEmptySeries
12351241 };
12361242 }
@@ -1241,7 +1247,7 @@ namespace GrafanaAdapters · 4 unmodified lines
12411247 {
12421248 case GroupOperation.Set:
12431249 // Flatten all series into a single enumerable
1244− DataSourceValueGroup result = new DataSourceValueGroup
1250+ DataSourceValueGroup setValueGroup = new DataSourceValueGroup
12451251 {
12461252 Target = $"Set{seriesFunction}({string.Join(", ", parameters)}{(parameters.Length > 0 ? ", " : "")}{queryExpression})",
12471253 RootTarget = queryExpression,
@@ -1253,12 +1259,12 @@ namespace GrafanaAdapters · 5 unmodified lines
12531259 // Handle edge-case set operations - for these functions there is data in the target series as well
12541260 if (seriesFunction == SeriesFunction.Minimum || seriesFunction == SeriesFunction.Maximum || seriesFunction == SeriesFunction.Median)
12551261 {
1256− DataSourceValue dataValue = result.Source.First();
1257− result.Target = $"Set{seriesFunction} = {dataValue.Target}";
1258− result.RootTarget = dataValue.Target;
1262+ DataSourceValue dataValue = setValueGroup.Source.First();
1263+ setValueGroup.Target = $"Set{seriesFunction} = {dataValue.Target}";
1264+ setValueGroup.RootTarget = dataValue.Target;
12591265 }
12601266
1261− yield return result;
1267+ yield return setValueGroup;
12621268
12631269 break;
12641270 case GroupOperation.Slice:
@@ -1266,27 +1272,27 @@ namespace GrafanaAdapters · 1 unmodified line
12661272 parameters = parameters.Skip(1).ToArray();
12671273
12681274 // Flatten all series into a single enumerable
1269− foreach (DataSourceValueGroup seriesResult in ExecuteSeriesFunctionOverTimeSlices(scanner, seriesFunction, parameters))
1275+ foreach (DataSourceValueGroup sliceValueGroup in ExecuteSeriesFunctionOverTimeSlices(scanner, seriesFunction, parameters))
12701276 {
12711277 yield return new DataSourceValueGroup
12721278 {
1273− Target = $"Slice{seriesFunction}({string.Join(", ", parameters)}{(parameters.Length > 0 ? ", " : "")}{seriesResult.Target ?? queryExpression})",
1274− RootTarget = seriesResult.Target ?? queryExpression,
1279+ Target = $"Slice{seriesFunction}({string.Join(", ", parameters)}{(parameters.Length > 0 ? ", " : "")}{sliceValueGroup.Target ?? queryExpression})",
1280+ RootTarget = sliceValueGroup.Target ?? queryExpression,
12751281 SourceTarget = sourceTarget,
1276− Source = seriesResult.Source,
1282+ Source = sliceValueGroup.Source,
12771283 DropEmptySeries = dropEmptySeries
12781284 };
12791285 }
12801286
12811287 break;
12821288 default:
1283− foreach (DataSourceValueGroup dataValues in dataset)
1289+ foreach (DataSourceValueGroup valueGroup in dataset)
12841290 yield return new DataSourceValueGroup
12851291 {
1286− Target = $"{seriesFunction}({string.Join(", ", parameters)}{(parameters.Length > 0 ? ", " : "")}{dataValues.Target})",
1287− RootTarget = dataValues.RootTarget ?? dataValues.Target,
1292+ Target = $"{seriesFunction}({string.Join(", ", parameters)}{(parameters.Length > 0 ? ", " : "")}{valueGroup.Target})",
1293+ RootTarget = valueGroup.RootTarget ?? valueGroup.Target,
12881294 SourceTarget = sourceTarget,
1289− Source = ExecuteSeriesFunctionOverSource(dataValues.Source, seriesFunction, parameters),
1295+ Source = ExecuteSeriesFunctionOverSource(valueGroup.Source, seriesFunction, parameters),
12901296 DropEmptySeries = dropEmptySeries
12911297 };
12921298

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t