internal override SqlSelect VisitSelect(SqlSelect select)
        {
            SqlSelect saveSelect = this.outerSelect;

            this.outerSelect = select;

            // big-joins may need to lift PK's out for default ordering, so don't allow big-join if we see these
            this.canJoin &= select.GroupBy.Count == 0 && select.Top == null && !select.IsDistinct;

            bool saveIsTopLevel = this.isTopLevel;

            this.isTopLevel = false;

            select = this.VisitSelectCore(select);

            this.isTopLevel  = saveIsTopLevel;
            select.Selection = this.VisitExpression(select.Selection);

            this.isTopLevel  = saveIsTopLevel;
            this.outerSelect = saveSelect;

            if (select.IsDistinct && HierarchyChecker.HasHierarchy(select.Selection))
            {
                // distinct across heirarchy is a NO-OP
                select.IsDistinct = false;
            }
            return(select);
        }
        public static List <string> RemoveAdditionalSpacingAndUnneccearyFields(List <string> mergefieldsToTest, string logFile)
        {
            var  amendedMergefields = new List <string>();
            var  usableMergefields  = new List <string>();
            bool usable;
            var  ignoreList = HierarchyChecker.ConfigImport(ConfigurationManager.AppSettings.Get("SpecificTextToIgnore").Split(','));

            foreach (var field in mergefieldsToTest)
            {
                var amended = field.Replace("{  ", "{").Replace("{ ", "{").Replace("  }", "}").Replace(" }", "}").Replace("MERGEFIELD  ", "MERGEFIELD ").Replace("  \\* MERGEFORMAT", "").Replace(" \\* MERGEFORMAT", "").Replace("\\* MERGEFORMAT", "");
                amendedMergefields.Add(amended);
            }

            foreach (var field in amendedMergefields)
            {
                usable = true;
                foreach (var parameter in ignoreList)
                {
                    if (field.Contains(parameter) | field.Contains("\""))
                    {
                        File.AppendAllText(logFile, Environment.NewLine + field + " Was removed from the test data due to \"" + parameter + "\" appearing in it");
                        usable = false;
                    }
                }
                if (!field.Contains("}") && !field.Contains("{"))
                {
                    usable = false;
                }
                if (usable == true)
                {
                    usableMergefields.Add(field);
                }
            }

            return(usableMergefields);
        }
        //Confirmation Button
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            selectAndLoad_Grid.Visibility = Visibility.Hidden;
            progress_Grid.Visibility      = Visibility.Visible;
            processingStatus_Text.AppendText(DateTime.Now.ToString("HH'.'mm'.'ss") + ": Creating Log File");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Creates a Log file - and folder if one doesn't exist
            var installLocation = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Custom Report Debugger Logs";

            Directory.CreateDirectory(installLocation);
            logFile = installLocation + "\\" + DateTime.Now.ToString("dd-MM-yy HH'.'mm'.'ss") + ".txt";
            var log = File.Create(logFile);

            log.Close();

            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Log file created at: " + logFile);
            progress_bar.Value = 10;
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Beginning Test");
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Removing excluded fields listed in config");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Loads excluded Fields and removes any test fields that match
            var mergefieldsToTest = ExistenceCheck.RemoveAdditionalSpacingAndUnneccearyFields(mergefieldsInDoc, logFile);

            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Field exclusion complete");
            progress_bar.Value = 20;
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Loads legal Mergefields from config
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Loading legal mergefields from config in to MergeField database");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
            var(uniqueMergefields, duplicateMergefields) = ExistenceCheck.DefineLegalMergefields(ConfigurationManager.AppSettings.Get("DataDictionary").Split(','));  //Grabs config arguements for the legal mergefields so I don't have to hardcode
            File.AppendAllText(logFile, "The following fields were loaded as legal fields from the config file, if any fields are missing or incorrect, please add them to the config:" + Environment.NewLine);
            foreach (var field in uniqueMergefields)
            {
                File.AppendAllText(logFile, Environment.NewLine + field);
            }
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Database Loaded");
            progress_bar.Value = 30;
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Checks if Test Fields exist in the config
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Comparing submitted fields against the MergeField database");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
            failedMergefields_doNotExist = ExistenceCheck.CheckExistenceOfMergefield(mergefieldsToTest, uniqueMergefields, logFile);
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Comparison complete, a total of " + failedMergefields_doNotExist.Count + " MergeFields were found to not exist in the database");
            progress_bar.Value = 50;
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Checks for missing Begin or End groups
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Checking for missing begin and end groups");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
            (failedMergefields_MissingBegin, failedMergefields_MissingEnd) = BeginAndEndGroups.CheckAllBeginGroupsHaveEndGroups(mergefieldsToTest);
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Check complete, a total of " + failedMergefields_MissingBegin.Count + " begin groups and " + failedMergefields_MissingEnd.Count + " end groups appear to be missing");
            progress_bar.Value = 75;
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);

            //Checks Hierarchy
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Checking hierarchy against the database");
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
            failedMergefields_Hierarchy = HierarchyChecker.HierarchyManagement(mergefieldsToTest, logFile);
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Check complete, a total of " + failedMergefields_Hierarchy.Count + " fields did not appear to match the expected Hierarchy");
            progress_bar.Value = 100;
            processingStatus_Text.AppendText(Environment.NewLine + DateTime.Now.ToString("HH'.'mm'.'ss") + ": Test Complete");

            doggo_pic.Opacity             = 0.2;
            kitty_pic.Opacity             = 0.2;
            hamster_pic.Opacity           = 0.2;
            softwareRunning_Label.Content = "Checks Complete! Press continue to view the results";
            viewResults_Button.Visibility = Visibility.Visible;
            Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
        }