/// <summary>
        /// Adds the preaggregate.
        /// </summary>
        /// <param name="preaggregate">The preaggregate.</param>
        public void AddPreaggregation(IPreaggregation preaggregate)
        {
            if (!this.CanAddPreaggregation(preaggregate))
            {
                throw new ConfigurationValidationException("Duplicate preaggregates cannot be added.", ValidationType.DuplicatePreaggregate);
            }

            this.preaggregations.Add(preaggregate);
        }
        /// <summary>
        /// Determines whether this instance can add preaggregation to the metric configuration.
        /// </summary>
        /// <param name="preaggregationToAdd">The preaggregation to add.</param>
        /// <returns>
        /// True if the preaggregation can be added.
        /// </returns>
        public bool CanAddPreaggregation(IPreaggregation preaggregationToAdd)
        {
            if (preaggregationToAdd == null)
            {
                throw new ArgumentNullException(nameof(preaggregationToAdd));
            }

            foreach (var preaggregation in this.preaggregations)
            {
                if (string.Equals(preaggregationToAdd.Name, preaggregation.Name, StringComparison.OrdinalIgnoreCase))
                {
                    return(false);
                }

                if (preaggregation.Dimensions.SequenceEqual(preaggregationToAdd.Dimensions, StringComparer.OrdinalIgnoreCase))
                {
                    return(false);
                }
            }

            return(true);
        }