/// <summary>
    /// Get All Qfs for non numerical values
    /// </summary>
    /// <param name="Workload"></param>
    /// <param name="columname"></param>
    public static void GetNonNumericalQfs(SQLQuery[] Workload, string columname)
    {
        Dictionary <object, int> pairing = new Dictionary <object, int>(); //coupling between the location in the timeDictionary and a string
        List <int> timeDictionary        = new List <int>();               //raw amount of occurrences
        int        counter = 0;

        foreach (SQLQuery query in Workload)
        {
            if (query.requiredValues.ContainsKey(columname))
            {
                object[] values = query.requiredValues[columname];
                int      times  = query.times;
                foreach (var value in values)
                {
                    if (!pairing.ContainsKey(value))//saves pairing between location in timedictionary and string index
                    {
                        pairing.Add(value, counter);
                        timeDictionary.Add(times);
                        counter++;
                    }
                    else
                    {
                        int index = pairing[value];
                        timeDictionary[index] += times;
                    }
                }
            }
        }
        Dictionary <string, double> qfs = new Dictionary <string, double>();

        if (timeDictionary.Count == 0)
        {
            foreach (var entry in (MetaDbFiller.idfs[columname] as Dictionary <string, double>))
            {
                qfs.Add(entry.Key, 1.0);//add qf value of 1 if never searched for yet
            }
        }
        else
        {
            double rqfmax = (double)timeDictionary.Max();
            foreach (var pair in pairing)
            {
                double qf = timeDictionary[pair.Value] / rqfmax;


                if (double.IsNaN(qf))
                {
                    throw new Exception("value is NaN in column: " + columname);
                }

                qfs.Add(pair.Key.ToString(), qf);//add scalar qf if not
            }
        }
        MetaDbFiller.AddQfMetaTable(columname, qfs);
    }
    /// <summary>
    /// get all numerical qfs
    /// </summary>
    /// <param name="Workload"></param>
    /// <param name="columname"></param>
    public static void GetNumericalQf(SQLQuery[] Workload, string columname)
    {
        double           size            = TableProccessor.GetIntervalSize(columname);
        ColumnProperties properties      = TableProccessor.ColumnProperties[columname];
        List <SQLQuery>  relevantQueries = new List <SQLQuery>();
        int total = 0;

        foreach (var query in Workload)
        {
            if (query.requiredValues.ContainsKey(columname))//only relevant queries are being used
            {
                relevantQueries.Add(query);
                total += query.times;
            }
        }
        Dictionary <double, double> Qfs  = new Dictionary <double, double>();
        Dictionary <double, double> RQfs = new Dictionary <double, double>();
        double RQfMax = 0;

        for (double d /*bij het ontbijt*/ = properties.min; d <= properties.max; d += size)
        {
            double qf = getNumericalQFFromU(d, relevantQueries, columname, total);
            RQfs.Add(d, qf);
            if (Math.Abs(RQfMax) < qf)//also take possible negative values into account
            {
                RQfMax = qf;
            }
        }

        foreach (var Qf in RQfs)
        {
            double d;
            if (RQfMax == 0)//never queried
            {
                d = 1;
            }
            else
            {
                d = Qf.Value / RQfMax;
            }

            if (double.IsNaN(d))
            {
                throw new Exception("value is NaN in column: " + columname);
            }

            Qfs.Add(Qf.Key, d);
        }
        MetaDbFiller.AddQfMetaTable(columname, Qfs);

        relevantQueries = null;//memory cleanup
        GC.Collect();
    }