/// <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(); }