/// <summary>
        /// Defines a new set of known parameter values to achieve a given goal (e.g. identify 'diabetic drugs' in dataset prescriptions) in combination with a parent <see cref="IFilter"/>.
        /// <para>A single <see cref="ExtractionFilter"/> (e.g. 'Drug Prescriptions of X' with parameter @DrugList) could have many <see cref="ExtractionFilterParameterSet"/></para>
        /// </summary>
        /// <param name="repository"></param>
        /// <param name="filter"></param>
        /// <param name="name"></param>
        public ExtractionFilterParameterSet(ICatalogueRepository repository, ExtractionFilter filter, string name = null)
        {
            name = name ?? "New ExtractionFilterParameterSet " + Guid.NewGuid();

            repository.InsertAndHydrate(this, new Dictionary <string, object>()
            {
                { "Name", name },
                { "ExtractionFilter_ID", filter.ID }
            });
        }
        /// <summary>
        /// Identifies all parameters which do not exist yet as declared values
        /// </summary>
        /// <returns></returns>
        public IEnumerable <ExtractionFilterParameter> GetMissingEntries()
        {
            var existingCatalogueParameters = ExtractionFilter.GetAllParameters().Cast <ExtractionFilterParameter>().ToArray();

            var personalChildren = Values.ToArray();

            foreach (ExtractionFilterParameter catalogueParameter in existingCatalogueParameters)
            {
                if (personalChildren.All(c => c.ExtractionFilterParameter_ID != catalogueParameter.ID))
                {
                    yield return(catalogueParameter);
                }
            }
        }
        /// <summary>
        /// Creates new value entries for each parameter in the filter that does not yet have a value in this value set
        /// </summary>
        /// <returns></returns>
        public ExtractionFilterParameterSetValue[] CreateNewValueEntries()
        {
            List <ExtractionFilterParameterSetValue> toReturn = new List <ExtractionFilterParameterSetValue>();

            var existingMasters = ExtractionFilter.GetAllParameters().Cast <ExtractionFilterParameter>().ToArray();

            var personalChildren = Values.ToArray();

            foreach (ExtractionFilterParameter master in existingMasters)
            {
                if (personalChildren.All(c => c.ExtractionFilterParameter_ID != master.ID))
                {
                    //we have a master that does not have any child values yet
                    toReturn.Add(new ExtractionFilterParameterSetValue((ICatalogueRepository)Repository, this, master));
                }
            }

            return(toReturn.ToArray());
        }
 /// <summary>
 /// Creates a new parameter on the given <paramref name="parent"/>
 /// <para>It is better to use <see cref="ParameterCreator"/> to automatically generate parameters based on the WHERE Sql</para>
 /// </summary>
 /// <param name="repository"></param>
 /// <param name="parameterSQL"></param>
 /// <param name="parent"></param>
 public ExtractionFilterParameter(ICatalogueRepository repository, string parameterSQL, ExtractionFilter parent)
 {
     repository.InsertAndHydrate(this, new Dictionary <string, object>
     {
         { "ParameterSQL", parameterSQL },
         { "ExtractionFilter_ID", parent.ID }
     });
 }