Exemple #1
0
        /// <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;
            }));
        }