private static TimeSpan getTimespan(DataFrequencyType freqType_, int freqNum_)
    {
      TimeSpan ret = TimeSpan.MaxValue;

      switch (freqType_)
      {
        case DataFrequencyType.D: ret = new TimeSpan(days: freqNum_, hours: 0, minutes: 0, seconds: 0); break;
        case DataFrequencyType.M: ret = new TimeSpan(hours: 0, minutes: freqNum_, seconds: 0); break;
        case DataFrequencyType.H: ret = new TimeSpan(hours: freqNum_, minutes: 0, seconds: 0); break;
      }
      return ret;
    }
    public static string GetDataAsXml(StaticFuture sf_, DateTime startDate_, DateTime endDate_, TZ timezone_, int freqNum_, DataFrequencyType freqType_)
    {
      Constructs.ConstructGen<double> con = null;

      if (estimateReturnRowCount(startDate_, endDate_, freqNum_, freqType_) > _maxReturnRowCount)
        return XmlStringForGenericTableErrorMessage(string.Format("Call would exceed max row return row count of {0}", _maxReturnRowCount));

      using (var db = new DBHelper())
      {
        con = GetHistData(sf_, startDate_, endDate_, timezone_, freqNum_, freqType_, db);
      }

      if (con == null) return null;


      return con.Dates.Select(x => new { Date = x.ToString("dd-MMM-yyyy HH:mm"), Price = con.GetValue(x, 0) }).ToGenericTableXml();
    }
    private static Constructs.ConstructGen<double> GetHistData(StaticFuture sf_, DateTime startDate_, DateTime endDate_, TZ timezone_, int freqNum_, DataFrequencyType freqType_, DBHelper db_)
    {
      var retriever = DataRetrievers.RetrieverBase.GetRetriever(timezone_, freqType_, startDate_, endDate_);

      var rawData = retriever.GetData(db_, sf_);

      if (rawData == null || rawData.Dates == null || rawData.Dates.Count == 0)
        return null;

      SLog.log.Debug(string.Format("RawDataCount from Database: {0}", rawData.Dates.Count.ToString()));

      var timespan = getTimespan(freqType_, freqNum_);

      var filled = rawData.GetSubsetOnTimespan(startDate_, timespan);

      SLog.log.Debug(string.Format("After fillout, datacount is: {0}", filled.Dates.Count.ToString()));

      if (filled.NeedsToSortKeys()) filled.SortKeys();

      return filled;
    }
    private static int estimateReturnRowCount(DateTime startDate_, DateTime endDate_, int freqNum_, DataFrequencyType freqType_)
    {
      var timespan = endDate_ - startDate_;
      int estimatedRowCount = 0;

      switch (freqType_)
      {
        case DataFrequencyType.D:
          estimatedRowCount = Convert.ToInt32(timespan.TotalDays / (double)freqNum_);
          break;
        case DataFrequencyType.H:
          estimatedRowCount = Convert.ToInt32(timespan.TotalHours / (double)freqNum_);
          break;
        case DataFrequencyType.M:
          estimatedRowCount = Convert.ToInt32(timespan.TotalMinutes / (double)freqNum_);
          break;
      }

      return estimatedRowCount;

    }
    public static RetrieverBase GetRetriever(TZ tz_, DataFrequencyType freqType_, DateTime startDate_, DateTime endDate_)
    {
      RetrieverBase ret = null;


      switch (freqType_)
      {
        case DataFrequencyType.D:
          ret = new DailyRetriever(startDate_, endDate_, tz_);
          break;
        case DataFrequencyType.H:
        case DataFrequencyType.M:
          ret = new AllRetriever(startDate_, endDate_, tz_);
          break;
      }
      return ret;
    }