/// <summary> /// Parses source definitions for an annotation query. /// </summary> /// <param name="annotation">Grafana annotation.</param> /// <param name="type">Annotation type.</param> /// <param name="source">Metadata of source definitions.</param> /// <param name="useFilterExpression">Determines if query is using a filter expression.</param> /// <returns>Parsed source definitions from <paramref name="annotation"/>.</returns> public static Dictionary <string, DataRow> ParseSourceDefinitions(this Annotation annotation, AnnotationType type, DataSet source, bool useFilterExpression) { if ((object)annotation == null) { throw new ArgumentNullException(nameof(annotation)); } if ((object)source == null) { throw new ArgumentNullException(nameof(source)); } if (type == AnnotationType.Undefined) { throw new InvalidOperationException("Unrecognized type or syntax for annotation query expression."); } string query = annotation.query ?? ""; return(TargetCache <Dictionary <string, DataRow> > .GetOrAdd(query, () => { DataRow[] rows; if (useFilterExpression) { string tableName, expression, sortField; int takeCount; if (AdapterBase.ParseFilterExpression(query, out tableName, out expression, out sortField, out takeCount)) { rows = source.Tables[tableName.Translate()].Select(expression, sortField).Take(takeCount).ToArray(); } else { throw new InvalidOperationException("Invalid FILTER syntax for annotation query expression."); } } else { // Assume all records if no filter expression was provided rows = source.Tables[type.TableName().Translate()].Rows.Cast <DataRow>().ToArray(); } Dictionary <string, DataRow> definitions = new Dictionary <string, DataRow>(StringComparer.OrdinalIgnoreCase); foreach (DataRow row in rows) { MeasurementKey key = GetTargetFromGuid(row[type.TargetFieldName()].ToString()); if (key != MeasurementKey.Undefined) { definitions[key.TagFromKey(source)] = row; } } return definitions; })); }