public List <CounterSeriesData> GetCounterData(DateTime beginDate, DateTime endDate, int counterCategoryId,
                                                       int counterNameId, int counterSourceId, int counterInstanceId,
                                                       int counterExtDataId, List <string> seriesFilter)
        {
            List <CounterSeriesData> resultData = new List <CounterSeriesData>();

            if (seriesFilter.Count == 0)
            {
                return(resultData);
            }
            bool          getAllSeries = seriesFilter.Contains("*");
            List <string> seriesNames  = new List <string>();


            MongoCollection <BsonDocument> items = Database.GetCollection("countersData");
            string mappedCategoryName            = CountersMapper.GetMappedCategoryName(counterCategoryId);
            string mappedCounterName             = CountersMapper.GetMappedCounterName(counterCategoryId, counterNameId);
            string mappedCounterInstance         = CountersMapper.GetMappedCounterInstanceName(counterCategoryId, counterNameId,
                                                                                               counterInstanceId);
            string mappedCounterSource = CountersMapper.GetMappedCounterSourceName(counterCategoryId, counterNameId,
                                                                                   counterSourceId);
            string mappedCounterExtData = CountersMapper.GetMappedCounterExtDataName(counterCategoryId, counterNameId,
                                                                                     counterExtDataId);


            QueryComplete qb = beginDate == endDate
                                   ? Query.EQ("date", beginDate)
                                   : Query.GT("date", beginDate).LTE(endDate);

            QueryComplete qb2       = Query.EQ("counterCategory", mappedCategoryName);
            QueryComplete qb3       = Query.EQ("counterName", mappedCounterName);
            SortByBuilder sortOrder = new SortByBuilder().Ascending("date");
            var           cursor    = items.Find(Query.And(qb, qb2, qb3));

            cursor.SetSortOrder(sortOrder);
            string counterDescription = counterSourceId + "/" + counterInstanceId + "/" + counterExtDataId;

            cursor.SetFields(Fields.Include("type", "date", "data." + counterDescription));

            foreach (BsonDocument cnt in cursor)
            {
                var dateTime     = cnt["date"].AsDateTime;
                var countersData = cnt["data"].AsBsonDocument;
                if (!countersData.Contains(counterDescription))
                {
                    foreach (string seriesName in seriesNames)
                    {
                        if (getAllSeries || seriesFilter.Contains(seriesName))
                        {
                            resultData.Find(f => f.SeriesName == seriesName).AddSeriesPoint(new SeriesPoint(dateTime, null));
                        }
                    }
                    continue;
                }
                var seriesPoints = countersData[counterDescription].AsBsonDocument;

                foreach (BsonElement seriesPoint in seriesPoints)
                {
                    string seriesName = seriesPoint.Name;
                    if (!seriesNames.Contains(seriesName))
                    {
                        seriesNames.Add(seriesName);
                    }
                    if (!getAllSeries && !seriesFilter.Contains(seriesName))
                    {
                        continue;
                    }
                    var value = seriesPoint.Value.IsString
                                    ? new UniversalValue(
                        TimeSpan.Parse(seriesPoint.Value.AsString))
                                    : new UniversalValue(
                        seriesPoint.Value.ToDouble());

                    var a = resultData.Find(f => f.SeriesName == seriesName);
                    if (a == null)
                    {
                        a = new CounterSeriesData(seriesName, value.Type, mappedCategoryName, mappedCounterName,
                                                  mappedCounterSource, mappedCounterInstance, mappedCounterExtData);
                        resultData.Add(a);
                    }
                    a.AddSeriesPoint(new SeriesPoint(dateTime, value));
                }
            }
            return(resultData);
        }
        public List<CounterSeriesData> GetCounterData(DateTime beginDate, DateTime endDate, int counterCategoryId,
                                                      int counterNameId, int counterSourceId, int counterInstanceId,
                                                      int counterExtDataId, List<string> seriesFilter)
        {
            List<CounterSeriesData> resultData = new List<CounterSeriesData>();
            if (seriesFilter.Count == 0)
                return resultData;
            bool getAllSeries = seriesFilter.Contains("*");
            List<string> seriesNames = new List<string>();
            
            
            MongoCollection<BsonDocument> items = Database.GetCollection("countersData");
            string mappedCategoryName = CountersMapper.GetMappedCategoryName(counterCategoryId);
            string mappedCounterName = CountersMapper.GetMappedCounterName(counterCategoryId, counterNameId);
            string mappedCounterInstance = CountersMapper.GetMappedCounterInstanceName(counterCategoryId, counterNameId,
                                                                                       counterInstanceId);
            string mappedCounterSource = CountersMapper.GetMappedCounterSourceName(counterCategoryId, counterNameId,
                                                                                   counterSourceId);
            string mappedCounterExtData = CountersMapper.GetMappedCounterExtDataName(counterCategoryId, counterNameId,
                                                                                     counterExtDataId);


            QueryComplete qb = beginDate == endDate
                                   ? Query.EQ("date", beginDate)
                                   : Query.GT("date", beginDate).LTE(endDate);

            QueryComplete qb2 = Query.EQ("counterCategory", mappedCategoryName);
            QueryComplete qb3 = Query.EQ("counterName", mappedCounterName);
            SortByBuilder sortOrder = new SortByBuilder().Ascending("date");
            var cursor = items.Find(Query.And(qb, qb2, qb3));
            cursor.SetSortOrder(sortOrder);
            string counterDescription = counterSourceId + "/" + counterInstanceId + "/" + counterExtDataId;
            cursor.SetFields(Fields.Include("type", "date", "data." + counterDescription));

            foreach (BsonDocument cnt in cursor)
            {
                var dateTime = cnt["date"].AsDateTime;
                var countersData = cnt["data"].AsBsonDocument;
                if (!countersData.Contains(counterDescription))
                {
                    foreach (string seriesName in seriesNames)
                        if (getAllSeries || seriesFilter.Contains(seriesName))
                            resultData.Find(f => f.SeriesName == seriesName).AddSeriesPoint(new SeriesPoint(dateTime, null));
                    continue;
                }
                var seriesPoints = countersData[counterDescription].AsBsonDocument;

                foreach (BsonElement seriesPoint in seriesPoints)
                {
                    string seriesName = seriesPoint.Name;
                    if (!seriesNames.Contains(seriesName))
                        seriesNames.Add(seriesName);
                    if (!getAllSeries && !seriesFilter.Contains(seriesName)) continue;
                    var value = seriesPoint.Value.IsString
                                    ? new UniversalValue(
                                          TimeSpan.Parse(seriesPoint.Value.AsString))
                                    : new UniversalValue(
                                          seriesPoint.Value.ToDouble());

                    var a = resultData.Find(f => f.SeriesName == seriesName);
                    if (a == null)
                    {
                        a = new CounterSeriesData(seriesName, value.Type, mappedCategoryName, mappedCounterName,
                                                  mappedCounterSource, mappedCounterInstance, mappedCounterExtData);
                        resultData.Add(a);
                    }
                    a.AddSeriesPoint(new SeriesPoint(dateTime, value));
                }
            }
            return resultData;
        }