public static List <string> Generate(baseContext ctx, int numberOfRowsToGenerate, DatabaseColumn column, Dictionary <string, List <string> > valuesGeneratedForDatabase, int sqlPlatformId, DatabaseTable table)
        {
            List <string> listOfValues = new List <string>();

            switch (column.GenerationModeId)
            {
            case SERIAL_ID:
                listOfValues = IntegerGeneratorsClass.GenerateListOfSerials(numberOfRowsToGenerate);
                break;

            case COUNTRY_NAME_RANDOM_ENGLISH_ID:
                listOfValues = new LimitCharactersDecorator(new RandomCountryesEnglish(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();     //CountryGenerators.GenerateListOfRandomCountryesEnglish(numberOfRowsToGenerate, ctx, column.MaxNumber);
                break;

            case COUNTRY_NAME_SEQUENTIAL_ENGLISH_ID:
                listOfValues = new LimitCharactersDecorator(new SequentialCountryesEnglish(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case COUNTRY_SHORT_RANDOM_ENGLISH_ID:
                listOfValues = new LimitCharactersDecorator(new RandomCountryShortsEnglish(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case COUNTRY_SHORT_SEQUENTIAL_ENGLISH_ID:
                listOfValues = new LimitCharactersDecorator(new SequentialCountryShortsEnglish(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case NAME_RANDOM_GLOBAL_ID:
                listOfValues = new LimitCharactersDecorator(new NamesRandomGlobal(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();    //NameGenerators.GenerateListOfRandomNamesGlobal(numberOfRowsToGenerate, ctx);
                break;

            case NAME_FEMALE_RANDOM_GLOBAL_ID:
                listOfValues = new LimitCharactersDecorator(new FemaleNamesRandomGlobal(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case NAME_MALE_RANDOM_GLOBAL_ID:
                listOfValues = new LimitCharactersDecorator(new MaleNamesGlobal(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case LAST_NAME_RANDOM_GLOBAL_ID:
                listOfValues = new LimitCharactersDecorator(new LastNameRandomGlobal(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case VARCHAR_PATTERN:
                listOfValues = new LimitCharactersDecorator(new PatternGenerator(numberOfRowsToGenerate, column, ctx)).GenerateVarchar();
                break;

            case FOREIGN_KEY_RANDOM_ID:
                listOfValues = ForeignKeyGeneratorsClass.GenerateRandomValuesForForeignKey(numberOfRowsToGenerate, valuesGeneratedForDatabase, column, table);
                break;

            case FOREIGN_KEY_RANDOM_10PER_NULL_ID:
                listOfValues = ForeignKeyGeneratorsClass.GenerateRandomValuesForForeignKey10PercentNull(numberOfRowsToGenerate, valuesGeneratedForDatabase, column, table);
                break;

            case FOREIGN_KEY_ORDERED_UNIQUE:
                listOfValues = ForeignKeyGeneratorsClass.GenerateOrderedUniqueValuesForForeignKey(numberOfRowsToGenerate, valuesGeneratedForDatabase, column, table);
                break;

            case FOREIGN_KEY_ORDERED_REPEATED:
                listOfValues = ForeignKeyGeneratorsClass.GenerateOrderedRepeatedForeignKey(numberOfRowsToGenerate, valuesGeneratedForDatabase, column, table);
                break;

            case INTEGER_RANDOM_FROM_INTERVAL_ID:
                listOfValues = IntegerGeneratorsClass.GenerateListOfRandomIntegersInInterval(numberOfRowsToGenerate, column.MinNumber, column.MaxNumber, column, table, valuesGeneratedForDatabase);
                break;

            case INTEGER_ORDERED_REPEATED:
                listOfValues = IntegerGeneratorsClass.GenerateIncrementAfterN(numberOfRowsToGenerate, column);
                break;

            case INTEGER_COUNTRY_POPULATION:
                listOfValues = ctx.Countries.Select(c => c.Inhabitants.ToString()).ToList();
                break;

            case SMALLINT_RANDOM_FROM_INTERVAL_ID:
                listOfValues = IntegerGeneratorsClass.GenerateListOfRandomShortsInInterval(numberOfRowsToGenerate, column.MinNumber, column.MaxNumber, column, table, valuesGeneratedForDatabase);
                break;

            case BIGINT_RANDOM:
                listOfValues = IntegerGeneratorsClass.GenerateListOfRandomLongsInInterval(numberOfRowsToGenerate, column.MinNumber, column.MaxNumber, column, table, valuesGeneratedForDatabase);
                break;

            case NUMBERIC_RANDOM_FROM_INTERVAL:
                listOfValues = NumericGeneratorsClass.GenerateListOfRandomNumbericFromInterval(numberOfRowsToGenerate, column, table, valuesGeneratedForDatabase);
                break;

            case FLOAT_RANDOM:
                listOfValues = NumericGeneratorsClass.GenerateListOfRandomNumbericFromInterval(numberOfRowsToGenerate, column, table, valuesGeneratedForDatabase);
                break;

            case DOUBLE_RANDOM:
                listOfValues = NumericGeneratorsClass.GenerateListOfRandomNumbericFromInterval(numberOfRowsToGenerate, column, table, valuesGeneratedForDatabase);
                break;

            case DATE_RANDOM_FROM_INTERVAL_ID:
                string sqlPlatformName = ctx.SqlPlatforms.Where(p => p.SqlPlatformId == sqlPlatformId).FirstOrDefault().Name;
                listOfValues = DateGeneratorsClass.GenerateListOfDatesInInterval(numberOfRowsToGenerate, column, table, sqlPlatformName, valuesGeneratedForDatabase);
                break;

            case TIMESTAMPWOTZ_RANDOM_FROM_INTERVAL_ID:
                sqlPlatformName = ctx.SqlPlatforms.Where(p => p.SqlPlatformId == sqlPlatformId).FirstOrDefault().Name;
                listOfValues    = TimestampWOTZGenerator.GenerateListOfTimestampsWOTZInInterval(numberOfRowsToGenerate, sqlPlatformName, column, table, valuesGeneratedForDatabase);
                break;

            case INTERVAL_RANDOM_FROM_RANGE:
                sqlPlatformName = ctx.SqlPlatforms.Where(p => p.SqlPlatformId == sqlPlatformId).FirstOrDefault().Name;
                listOfValues    = IntervalGeneratorClass.GenerateListOfIntervalsFromRange(numberOfRowsToGenerate, column.TimeFrom, column.TimeTo, sqlPlatformName);
                break;

            case BOOLEAN_TRUE:
                listOfValues = BooleanGeneratorsClass.GenerateListOfTrue(numberOfRowsToGenerate);
                break;

            case BOOLEAN_FALSE:
                listOfValues = BooleanGeneratorsClass.GenerateListOfFalse(numberOfRowsToGenerate);
                break;

            default:
                throw new GenerationException($"Invalid generation mode id: {column.GenerationModeId}");
            }

            return(listOfValues);
        }
        public static List <string> GenerateListOfRandomNumbericFromInterval(int numberOfRowsToGenerate, DatabaseColumn column, DatabaseTable table, Dictionary <string, List <string> > valuesGeneratedForDatabase)
        {
            string min = column.MinNumber;
            string max = column.MaxNumber;

            Decimal minValue;
            Decimal maxValue;

            try
            {
                minValue = Decimal.Parse(min);
            }
            catch (Exception)
            {
                throw new GenerationException($"Could not parse {min}.");
            }

            try
            {
                maxValue = Decimal.Parse(max);
            }
            catch (Exception)
            {
                throw new GenerationException($"Could not parse {max}.");
            }

            if (minValue > maxValue)
            {
                throw new GenerationException($"Minimum value cannot be greater then maximum value");
            }

            minValue *= 100;
            maxValue *= 100;

            int intMinValue = Decimal.ToInt32(minValue);
            int intMaxValue = Decimal.ToInt32(maxValue);

            Random random = new Random();

            List <string> listOfNumerics = new List <string>(numberOfRowsToGenerate);

            List <string> tempListOfOtherNumerics = new List <string>();

            // List of dates, values generated here will be bigger
            List <Decimal> otherNumerics = new List <Decimal>();

            if (valuesGeneratedForDatabase.TryGetValue($"{table.Name}:{column.RelatedColumn}", out tempListOfOtherNumerics))
            {
                foreach (string numericString in tempListOfOtherNumerics)
                {
                    // substring to remove quotes
                    otherNumerics.Add(Decimal.Parse(numericString));
                }
            }

            for (int i = 0; i < numberOfRowsToGenerate; i++)
            {
                if (otherNumerics.Count() == 0)
                {
                    int randomInt = random.Next(intMinValue, intMaxValue + 1);
                    listOfNumerics.Add(ParseIntToNumericStringDivideBy100(randomInt));
                }
                else
                {
                    Decimal otherNumeric = otherNumerics[i];
                    otherNumeric *= 100;
                    int    otherValue = Decimal.ToInt32(otherNumeric);
                    string relation   = column.Relation;
                    string value;
                    switch (relation)
                    {
                    case GenerationConstants.LESSER_THAN:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.LesserThan(otherValue, intMinValue, intMaxValue));
                        break;

                    case GenerationConstants.LESSER_THAN_OR_EQUAL_TO:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.LesserThanOrEqual(otherValue, intMinValue, intMaxValue));
                        break;

                    case GenerationConstants.EQUAL_TO:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.Equal(otherValue, intMinValue, intMaxValue));
                        break;

                    case GenerationConstants.NOT_EQUAL_TO:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.NotEqual(otherValue, intMinValue, intMaxValue));
                        break;

                    case GenerationConstants.GREATER_THAN_OR_EQUAL_TO:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.GreaterThanOrEqual(otherValue, intMinValue, intMaxValue));
                        break;

                    case GenerationConstants.GREATER_THAN:
                        value = ParseIntToNumericStringDivideBy100(IntegerGeneratorsClass.GreaterThan(otherValue, intMinValue, intMaxValue));
                        break;

                    default:
                        throw new GenerationException($"{relation} is not a supported column relation");
                    }
                    listOfNumerics.Add(value);
                }
            }
            return(listOfNumerics);
        }