示例#1
0
        // ----------------
        // Grouped by feature
        // ----------------

        public async Task <AggregatedResult <string> > SelectGroupedByFeatureAsync(DateTimeOffset start, DateTimeOffset end)
        {
            // Sql query
            const string sql = @"
                SELECT 
                    f.ModuleId AS [Aggregate] ,
                    COUNT(m.Id) AS Count
                FROM 
                    {prefix}_Metrics m INNER JOIN {prefix}_ShellFeatures f ON f.Id = m.FeatureId
                WHERE 
                    m.CreatedDate >= '{start}' AND m.CreatedDate <= '{end}'
                GROUP BY 
                    f.ModuleId
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{start}"] = start.ToSortableDateTimePattern(),
                ["{end}"]   = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <string>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <string>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
        // ----------------
        // Grouped by reputation name
        // ----------------

        public async Task <AggregatedResult <DateTimeOffset> > SelectGroupedByNameAsync(
            string reputationName,
            string groupBy,
            DateTimeOffset start,
            DateTimeOffset end)
        {
            // Sql query
            const string sql = @"
                SELECT 
                    COUNT(Id) AS [Count], 
                    MAX({groupBy}) AS [Aggregate] 
                FROM 
                    {prefix}_UserReputations 
                WHERE 
                    [Name] = '{reputationName}' AND
                    {groupBy} >= '{start}' AND {groupBy} <= '{end}'
                GROUP BY 
                    YEAR({groupBy}),
                    MONTH({groupBy}), 
                    DAY({groupBy})
            ";

            // Sql replacements
            // Note user supplied input should never be passed into this method
            var replacements = new Dictionary <string, string>()
            {
                ["{reputationName}"] = reputationName.Replace("'", "''"),
                ["{groupBy}"]        = groupBy.Replace("'", "''"),
                ["{start}"]          = start.ToSortableDateTimePattern(),
                ["{end}"]            = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <DateTimeOffset>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <DateTimeOffset>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
        public async Task <AggregatedResult <int> > SelectSummedByIntAsync(
            string groupBy,
            DateTimeOffset start,
            DateTimeOffset end,
            int featureId)
        {
            // Sql query
            const string sql = @"             
                SELECT  
                    MAX(ur.{groupBy}) AS [Aggregate], 
                    SUM(ur.Points) AS [Count]
                FROM 
                    {prefix}_UserReputations ur INNER JOIN {prefix}_Users u ON ur.CreatedUserId = u.Id
                  WHERE (
                    (ur.CreatedDate >= '{start}' AND ur.CreatedDate <= '{end}') AND
                    (ur.FeatureId = {featureId})
                )
                GROUP BY 
                    ur.{groupBy}
                ORDER BY 
                    [Count] DESC
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{groupBy}"]   = groupBy,
                ["{start}"]     = start.ToSortableDateTimePattern(),
                ["{end}"]       = end.ToSortableDateTimePattern(),
                ["{featureId}"] = featureId.ToString()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <int>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <int>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
示例#4
0
        // ----------------
        // Grouped by string Title, Url etc
        // ----------------

        public async Task <AggregatedResult <string> > SelectGroupedByStringAsync(
            string groupBy,
            DateTimeOffset start,
            DateTimeOffset end,
            int limit = 10)
        {
            // Sql query
            const string sql = @"
                SELECT TOP {limit}
                    m.{groupBy} AS [Aggregate] ,
                    COUNT(m.Id) AS [Count]
                FROM 
                    {prefix}_Metrics m 
                WHERE 
                    m.CreatedDate >= '{start}' AND m.CreatedDate <= '{end}'
                GROUP BY 
                    m.{groupBy}
                ORDER BY [Count] DESC
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{groupBy}"] = groupBy,
                ["{limit}"]   = limit.ToString(),
                ["{start}"]   = start.ToSortableDateTimePattern(),
                ["{end}"]     = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <string>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <string>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
示例#5
0
        public async Task <AggregatedResult <DateTimeOffset> > SelectGroupedByDateAsync(string groupBy, DateTimeOffset start, DateTimeOffset end, int featureId)
        {
            // Sql query
            const string sql = @"
                SELECT 
                    COUNT(em.Id) AS [Count], 
                    MAX(em.{groupBy}) AS [Aggregate] 
                FROM 
                    {prefix}_EntityMetrics em INNER JOIN {prefix}_Entities e ON e.Id = em.EntityId
                WHERE (
                    (em.{groupBy} >= '{start}' AND em.{groupBy} <= '{end}') AND
                    (e.FeatureId = {featureId})                    
                )
                GROUP BY 
                    YEAR(em.{groupBy}),
                    MONTH(em.{groupBy}), 
                    DAY(em.{groupBy})
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{groupBy}"]   = groupBy,
                ["{start}"]     = start.ToSortableDateTimePattern(),
                ["{end}"]       = end.ToSortableDateTimePattern(),
                ["{featureId}"] = featureId.ToString()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <DateTimeOffset>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <DateTimeOffset>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
        // ----------------
        // Grouped by date
        // ----------------

        public async Task <AggregatedResult <DateTimeOffset> > SelectGroupedByDateAsync(
            string groupBy,
            DateTimeOffset start,
            DateTimeOffset end)
        {
            // Sql query
            const string sql = @"
                SELECT 
                    COUNT(Id) AS [Count], 
                    MAX({groupBy}) AS [Aggregate] 
                FROM 
                    {prefix}_EntityReplies
                WHERE 
                    {groupBy} >= '{start}' AND {groupBy} <= '{end}'
                GROUP BY 
                    YEAR({groupBy}),
                    MONTH({groupBy}), 
                    DAY({groupBy})
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{groupBy}"] = groupBy,
                ["{start}"]   = start.ToSortableDateTimePattern(),
                ["{end}"]     = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await DbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <DateTimeOffset>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <DateTimeOffset>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
        public async Task <AggregatedResult <int> > SelectGroupedByIntAsync(string groupBy, DateTimeOffset start, DateTimeOffset end)
        {
            // Sql query
            const string sql = @"             
                SELECT                   
                    COUNT(em.Id) AS [Count], 
                    MAX(em.{groupBy}) AS [Aggregate] 
                FROM 
                    {prefix}_EntityMetrics em INNER JOIN {prefix}_Entities e ON em.EntityId = e.Id
                WHERE 
                    em.CreatedDate >= '{start}' AND em.CreatedDate <= '{end}'                
                GROUP BY 
                    em.{groupBy}
                ORDER BY 
                    [Count] DESC
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{groupBy}"] = groupBy,
                ["{start}"]   = start.ToSortableDateTimePattern(),
                ["{end}"]     = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await DbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <int>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <int>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
示例#8
0
        // ----------------
        // Grouped by role
        // ----------------

        public async Task <AggregatedResult <string> > SelectGroupedByRoleAsync(DateTimeOffset start, DateTimeOffset end)
        {
            // Sql query
            const string sql = @"                                
                DECLARE @temp TABLE
                (
	                [Aggregate] nvarchar(255) NOT NULL,
	                [Count] int NOT NULL
                );

                INSERT INTO @temp
	                SELECT 
		                r.[Name] AS [Aggregate],
		                COUNT(m.Id) AS Count
	                FROM 
		                {prefix}_Metrics m 
		                RIGHT OUTER JOIN {prefix}_UserRoles ur ON ur.UserId = m.CreatedUserId
		                RIGHT OUTER JOIN {prefix}_Roles r ON r.Id = ur.RoleId
                    WHERE 
                        m.CreatedDate >= '{start}' AND m.CreatedDate <= '{end}'
	                GROUP BY 
		                r.[Name]
		                
                -- Get anonymous count
                DECLARE @anonymousCount int;
                SET @anonymousCount = (
	                SELECT 
		                COUNT(m.Id) AS Count
	                FROM 
		                {prefix}_Metrics m 
	                WHERE                     
                        m.CreatedDate >= '{start}' AND m.CreatedDate <= '{end}' AND
                        m.CreatedUserId = 0
                );

                UPDATE @temp SET 
                    [Count] = (@anonymousCount) 
                WHERE [Aggregate] = '{anonymousName}'

                SELECT [Aggregate] AS Aggregate, [Count] AS Count FROM @temp

            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{start}"]         = start.ToSortableDateTimePattern(),
                ["{end}"]           = end.ToSortableDateTimePattern(),
                ["{anonymousName}"] = DefaultRoles.Anonymous
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <string>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <string>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }
示例#9
0
        public async Task <AggregatedResult <string> > SelectUserMetricsAsync(DateTimeOffset start, DateTimeOffset end)
        {
            // Sql query
            const string sql = @"                                
              
                DECLARE @totalUsers int;
                DECLARE @returningUsers int;
                DECLARE @newUsers int;
                DECLARE @totalBadges int;
                DECLARE @newBadges int;
                DECLARE @totalReputations int;
                DECLARE @newReputations int;
                    
                SET @totalUsers = (SELECT COUNT(Id) FROM {prefix}_Users);
                
                SET @newUsers = (
	                SELECT COUNT(Id) FROM {prefix}_Users
	                WHERE CreatedDate >= '{start}' AND CreatedDate <= '{end}'
                );

                SET @returningUsers = (
	                SELECT COUNT(Id) FROM {prefix}_Users
	                WHERE CreatedDate <= '{start}' AND Id IN (
                         SELECT DISTINCT CreatedUserId FROM {prefix}_UserReputations    
	                    WHERE ([Name] = 'Visit') AND (CreatedDate >= '{start}' AND CreatedDate <= '{end}')
                    )
                );

                SET @totalBadges = (
	                SELECT COUNT(Id) FROM {prefix}_UserBadges
                );

               SET @newBadges = (
	                SELECT COUNT(Id) FROM {prefix}_UserBadges 
	                WHERE CreatedDate >= '{start}' AND CreatedDate <= '{end}'
                );

                SET @totalReputations = (
	                SELECT COUNT(Id) FROM {prefix}_UserReputations
                );

                SET @newReputations = (
	                SELECT COUNT(Id) FROM {prefix}_UserReputations  
	                WHERE CreatedDate >= '{start}' AND CreatedDate <= '{end}'
                );

                DECLARE @temp TABLE
                (
	                [Aggregate] nvarchar(100) NOT NULL,
	                [Count] int NOT NULL
                );

                INSERT INTO @temp SELECT 'TotalUsers', @totalUsers;
                INSERT INTO @temp SELECT 'NewUsers', @newUsers;
                INSERT INTO @temp SELECT 'ReturningUsers', @returningUsers;
                INSERT INTO @temp SELECT 'TotalBadges', @totalBadges;
                INSERT INTO @temp SELECT 'NewBadges', @newBadges;
                INSERT INTO @temp SELECT 'TotalReputations', @totalReputations;
                INSERT INTO @temp SELECT 'NewReputations', @newReputations;             

                SELECT * FROM @temp;
            ";

            // Sql replacements
            var replacements = new Dictionary <string, string>()
            {
                ["{start}"] = start.ToSortableDateTimePattern(),
                ["{end}"]   = end.ToSortableDateTimePattern()
            };

            // Execute and return results
            return(await _dbHelper.ExecuteReaderAsync(sql, replacements, async reader =>
            {
                var output = new AggregatedResult <string>();
                while (await reader.ReadAsync())
                {
                    var aggregatedCount = new AggregatedCount <string>();
                    aggregatedCount.PopulateModel(reader);
                    output.Data.Add(aggregatedCount);
                }
                return output;
            }));
        }