public List<PVTimeSeries> GetPrivateSessionTimeSeries(string gameShort, TimeInterval interval, DateTime startDate, DateTime endDate) { #region Validation GameMonitoringConfig game = Games.Instance.GetMonitoredGames().Where(x => x.ShortTitle == gameShort).FirstOrDefault(); #endregion List<PVTimeSeries> timeSeriesData = new List<PVTimeSeries>(); startDate = startDate.RoundDown(interval); endDate = endDate.RoundDown(interval); // Create a chart for each privacy comparison session type foreach (string sessionType in GetPrivateSessionCompareTypes(game)) { string query = String.Format( @"SELECT RecordTimestamp, 'Private', PrivateSessions, 'Non-Private', Sessions FROM {0} WHERE GameId = '{1}' AND SessionType = '{2}' AND RecordTimestamp BETWEEN '{3}' AND '{4}' GROUP BY RecordTimestamp ORDER BY RecordTimestamp;", String.Format("GameSessionUserStats{0}", interval.GetTimeIntervalString()), game.Id, sessionType, startDate.ToString("yyyy-MM-dd HH:mm:ss"), endDate.ToString("yyyy-MM-dd HH:mm:ss")); try { // Get time series data DataTable queryResults = DBManager.Instance.Query(Datastore.Monitoring, query); if (queryResults.HasRows()) { foreach (DataRow row in queryResults.Rows) { PVTimeSeries series = timeSeriesData.FirstOrDefault(x => x.name == row["Private"].ToString()); if (series == default(PVTimeSeries)) { series = new PVTimeSeries(); series.name = row["Private"].ToString(); series.data = new List<int>(); series.pointStart = queryResults.Rows[0].Field<DateTime>("RecordTimestamp").ToUnixTimestamp() * 1000; //JS unix timestamp is in milliseconds series.pointInterval = (int)interval * 60 * 1000; //JS unix timestamp is in milliseconds series.type = "area"; timeSeriesData.Add(series); } PVTimeSeries nonPrivateSeries = timeSeriesData.FirstOrDefault(x => x.name == row["Non-Private"].ToString()); if (nonPrivateSeries == default(PVTimeSeries)) { nonPrivateSeries = new PVTimeSeries(); nonPrivateSeries.name = row["Non-Private"].ToString(); nonPrivateSeries.data = new List<int>(); nonPrivateSeries.pointStart = queryResults.Rows[0].Field<DateTime>("RecordTimestamp").ToUnixTimestamp() * 1000; //JS unix timestamp is in milliseconds nonPrivateSeries.pointInterval = (int)interval * 60 * 1000; //JS unix timestamp is in milliseconds nonPrivateSeries.type = "area"; timeSeriesData.Add(nonPrivateSeries); } series.data.Add(Convert.ToInt32(row["PrivateSessions"].ToString())); nonPrivateSeries.data.Add(Convert.ToInt32(row["Sessions"].ToString())); } } } catch (Exception ex) { Logger.Instance.Exception(ex.Message, ex.StackTrace); } } return timeSeriesData; }