Skip to content

Commit 0f2d5f3

Browse files
authored
Merge pull request #111 from FromDoppler/doi-2688-normalizing-information-using-sp
[DOI-2688] Normalizing information using SP
2 parents 978d433 + 26ddebd commit 0f2d5f3

1 file changed

Lines changed: 40 additions & 280 deletions

File tree

Doppler.ReportingApi/Infrastructure/CampaignRepository.cs

Lines changed: 40 additions & 280 deletions
Original file line numberDiff line numberDiff line change
@@ -124,157 +124,38 @@ GROUP BY
124124
}
125125
}
126126

127-
public async Task<List<SentCampaignMetrics>> GetSentCampaignsMetrics(string userName, int pageNumber, int pageSize, DateTime? startDate = null, DateTime? endDate = null, string campaignName = null, string campaignType = null, string fromEmail = null, List<int> labels = null)
127+
public async Task<List<SentCampaignMetrics>> GetSentCampaignsMetrics(
128+
string userName,
129+
int pageNumber,
130+
int pageSize,
131+
DateTime? startDate = null,
132+
DateTime? endDate = null,
133+
string campaignName = null,
134+
string campaignType = null,
135+
string fromEmail = null,
136+
List<int> labels = null)
128137
{
129-
var labelsCount = labels?.Count ?? 0;
130-
131138
using (var connection = _connectionFactory.GetConnection())
132139
{
133-
var dummyDatabaseQuery = @"
134-
DECLARE @timezone INT
135-
DECLARE @idUser INT
136-
137-
SELECT
138-
@timezone = offset
139-
,@idUser = u.IdUser
140-
FROM dbo.usertimezone timezone
141-
INNER JOIN dbo.[user] u ON u.idusertimezone = timezone.idusertimezone
142-
WHERE u.[Email] = @userName;
143-
144-
SELECT
145-
RPT.[IdUser]
146-
,RPT.[IdCampaign]
147-
,RPT.[Name]
148-
,dateadd(MINUTE, @timezone, RPT.[UTCSentDate]) AS [UTCSentDate]
149-
,RPT.[FromEmail]
150-
,RPT.[CampaignType]
151-
,RPT.[IdTestAB]
152-
,SUM(RPT.[Subscribers]) [Subscribers]
153-
,SUM(RPT.[Sent]) [Sent]
154-
,CASE
155-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
156-
ELSE CAST(SUM(RPT.[Sent]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2))
157-
END AS [DlvRate]
158-
,SUM(RPT.[Opens]) [Opens]
159-
,CASE
160-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
161-
ELSE CAST(SUM(RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2))
162-
END AS [OpenRate]
163-
,SUM(RPT.[Unopens]) AS [Unopens]
164-
,CASE
165-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
166-
ELSE CAST(SUM(RPT.[Sent] - RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2))
167-
END AS [UnopenRate]
168-
,SUM(RPT.[Clicks]) [Clicks]
169-
,CASE
170-
WHEN SUM(RPT.[Opens]) = 0 THEN 0
171-
ELSE CAST(SUM(RPT.[Clicks]) * 100.0 / SUM(RPT.[Opens]) AS DECIMAL(10,2))
172-
END AS [ClickToOpenRate]
173-
,SUM(RPT.[Hard] + RPT.[Soft]) [Bounces]
174-
,CASE
175-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
176-
ELSE CAST(SUM(RPT.[Hard] + RPT.[Soft]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2))
177-
END AS [BounceRate]
178-
,SUM(RPT.[Unsubscribes]) [Unsubscribes]
179-
,CASE
180-
WHEN SUM(RPT.[Sent]) = 0 THEN 0
181-
ELSE CAST(SUM(RPT.[Unsubscribes]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(10,2))
182-
END AS [UnsubscribeRate]
183-
,SUM(RPT.[Spam]) [Spam]
184-
,CASE
185-
WHEN SUM(RPT.[Sent]) = 0 THEN 0
186-
ELSE CAST(SUM(RPT.[Spam]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(10,2))
187-
END AS [SpamRate]
188-
,RPT.[LabelName]
189-
,RPT.[LabelColour]
190-
FROM(
191-
SELECT
192-
C.[IdUser]
193-
,C.[IdCampaign]
194-
,C.[Name]
195-
,C.[UTCSentDate]
196-
,C.[FromEmail]
197-
,C.[CampaignType]
198-
,C.[IdTestAB]
199-
,ISNULL(C.[AmountSentSubscribers],0) [Subscribers]
200-
,(ISNULL(C.[DistinctOpenedMailCount],0) + ISNULL(C.[UnopenedMailCount],0)) AS [Sent]
201-
,ISNULL(C.[DistinctOpenedMailCount],0) [Opens]
202-
,ISNULL(C.[UnopenedMailCount], 0) [Unopens]
203-
,ISNULL(C.[DistinctClickCount],0) [Clicks]
204-
,ISNULL(C.[HardBouncedMailCount],0) [Hard]
205-
,ISNULL (C.[SoftBouncedMailCount],0) [Soft]
206-
,ISNULL(C.[UnsubscriptionsCount], Unsubscribes.Unsubscribes) [Unsubscribes]
207-
,Unsubscribes.Spam [Spam]
208-
,L.[Name] [LabelName]
209-
,LC.[Colour] [LabelColour]
210-
FROM [dbo].[Campaign] C WITH (NOLOCK)
211-
JOIN [dbo].[User] U WITH (NOLOCK)
212-
ON C.[IdUser] = U.[IdUser]
213-
LEFT JOIN [dbo].[Label] L WITH (NOLOCK)
214-
ON C.[IdLabel] = L.[IdLabel]
215-
LEFT JOIN [dbo].[Colour] LC WITH (NOLOCK)
216-
ON L.[IdColour] = LC.[IdColour]
217-
LEFT JOIN (
218-
SELECT
219-
COUNT(
220-
CASE
221-
WHEN S.IdUnsubscriptionReason <> 2
222-
AND S.UnsubscriptionSubreason NOT IN (2,3,4)
223-
THEN 1
224-
END
225-
) [Unsubscribes]
226-
,COUNT(
227-
CASE
228-
WHEN S.IdUnsubscriptionReason = 2
229-
OR S.UnsubscriptionSubreason IN (2,3,4)
230-
THEN 1
231-
END
232-
) [Spam]
233-
,c.IdCampaign
234-
FROM dbo.campaign c
235-
INNER JOIN dbo.subscriber s ON c.idcampaign = s.IdCampaign
236-
WHERE c.iduser = @idUser
237-
AND c.STATUS in (5, 9)
238-
AND c.IdTestCampaign IS NULL
239-
AND s.IdSubscribersStatus = 5
240-
GROUP BY c.IdCampaign
241-
) Unsubscribes ON c.idcampaign = Unsubscribes.IdCampaign
242-
WHERE
243-
U.[Email] = @userName
244-
AND C.[Status] IN (5,9)
245-
AND C.Active = 1
246-
AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate)
247-
AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate)
248-
AND (@campaignName IS NULL OR LOWER(LTRIM(RTRIM(C.[Name]))) LIKE '%' + LOWER(LTRIM(RTRIM(@campaignName))) + '%')
249-
AND (
250-
@campaignType IS NULL
251-
OR (LTRIM(RTRIM(@campaignType)) = '')
252-
OR (@campaignType = 'TEST_AB' AND C.IdTestAB IS NOT NULL)
253-
OR (C.CampaignType = @campaignType AND C.IdTestAB IS NULL)
254-
)
255-
AND (@fromEmail IS NULL OR LOWER(LTRIM(RTRIM(C.[FromEmail]))) LIKE LOWER(LTRIM(RTRIM(@fromEmail))))
256-
AND C.[IdTestCampaign] IS NULL
257-
AND C.[IdScheduledTask] IS NULL
258-
AND (C.TestABCategory IS NULL OR C.TestABCategory = 3)
259-
AND (
260-
@labelsCount = 0
261-
OR C.[IdLabel] IN @labels
262-
)
263-
) RPT
264-
GROUP BY RPT.[IdUser]
265-
,RPT.[IdCampaign]
266-
,RPT.[Name]
267-
,RPT.[UTCSentDate]
268-
,RPT.[FromEmail]
269-
,RPT.[CampaignType]
270-
,RPT.[IdTestAB]
271-
,RPT.[LabelName]
272-
,RPT.[LabelColour]
273-
ORDER BY RPT.[UTCSentDate] DESC
274-
OFFSET @pageNumber * @pageSize ROWS
275-
FETCH NEXT @pageSize ROWS ONLY";
140+
var labelsStr = (labels != null && labels.Count > 0)
141+
? string.Join(",", labels)
142+
: null;
276143

277-
var results = await connection.QueryAsync<SentCampaignMetrics>(dummyDatabaseQuery, new { userName, pageNumber, pageSize, startDate, endDate, campaignName, campaignType, fromEmail, labelsCount, labels });
144+
var results = await connection.QueryAsync<SentCampaignMetrics>(
145+
"[dbo].[CampaignsSent_CampaignsMetrics]",
146+
new
147+
{
148+
userName,
149+
startdate = startDate,
150+
enddate = endDate,
151+
campaignName,
152+
campaignType,
153+
fromEmail,
154+
labels = labelsStr,
155+
pageNumber,
156+
pageSize
157+
},
158+
commandType: System.Data.CommandType.StoredProcedure);
278159

279160
return results.ToList();
280161
}
@@ -325,139 +206,18 @@ public async Task<List<MonthlyCampaignMetrics>> GetMonthlyCampaignsMetrics(strin
325206
{
326207
using (var connection = _connectionFactory.GetConnection())
327208
{
328-
var dummyDatabaseQuery = @"
329-
DECLARE @timezone INT
330-
331-
SELECT @timezone = offset
332-
FROM dbo.usertimezone timezone
333-
INNER JOIN dbo.[user] u ON u.idusertimezone = timezone.idusertimezone
334-
WHERE u.[Email] = @userName
335-
336-
SELECT
337-
RPT.[IdUser]
338-
,YEAR(dateadd(MINUTE, @timezone, UTCSentDate)) [Year]
339-
,MONTH(dateadd(MINUTE, @timezone, UTCSentDate)) [Month]
340-
,COUNT(DISTINCT RPT.[IdCampaign]) [CampaginsCount]
341-
,SUM(RPT.[Subscribers]) [Subscribers]
342-
,SUM(RPT.[Sent]) [Sent]
343-
,CASE
344-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
345-
ELSE CAST(SUM(RPT.[Sent]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2))
346-
END AS [DlvRate]
347-
,SUM(RPT.[Opens]) [Opens]
348-
,CASE
349-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
350-
ELSE CAST(SUM(RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2))
351-
END AS [OpenRate]
352-
,SUM(RPT.[Unopens]) AS [Unopens]
353-
,CASE
354-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
355-
ELSE CAST(SUM(RPT.[Sent] - RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2))
356-
END AS [UnopenRate]
357-
,SUM(RPT.[Clicks]) [Clicks]
358-
,CASE
359-
WHEN SUM(RPT.[Opens]) = 0 THEN 0
360-
ELSE CAST(SUM(RPT.[Clicks]) * 100.0 / SUM(RPT.[Opens]) AS DECIMAL(5,2))
361-
END AS [ClickToOpenRate]
362-
,SUM(RPT.[Hard] + RPT.[Soft]) [Bounces]
363-
,CASE
364-
WHEN SUM(RPT.[Subscribers]) = 0 THEN 0
365-
ELSE CAST(SUM(RPT.[Hard] + RPT.[Soft]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2))
366-
END AS [BounceRate]
367-
,SUM(RPT.[Unsubscribes]) [Unsubscribes]
368-
,CASE
369-
WHEN SUM(RPT.[Sent]) = 0 THEN 0
370-
ELSE CAST(SUM(RPT.[Unsubscribes]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(5,2))
371-
END AS [UnsubscribeRate]
372-
,SUM(RPT.[Spam]) [Spam]
373-
,CASE
374-
WHEN SUM(RPT.[Sent]) = 0 THEN 0
375-
ELSE CAST(SUM(RPT.[Spam]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(5,2))
376-
END AS [SpamRate]
377-
FROM(
378-
SELECT
379-
C.[IdUser]
380-
,C.[IdCampaign]
381-
,C.[UTCSentDate]
382-
,ISNULL(C.[AmountSentSubscribers],0) [Subscribers]
383-
,(ISNULL(C.AmountSentSubscribers, 0) - (ISNULL(C.HardBouncedMailCount, 0) + ISNULL(C.SoftBouncedMailCount, 0))) AS [Sent]
384-
,ISNULL(C.[DistinctOpenedMailCount],0) [Opens]
385-
,ISNULL(C.[UnopenedMailCount], 0) [Unopens]
386-
,ISNULL(C.[DistinctClickCount],0) [Clicks]
387-
,ISNULL(C.[HardBouncedMailCount],0) [Hard]
388-
,ISNULL(C.[SoftBouncedMailCount],0) [Soft]
389-
,ISNULL(C.[UnsubscriptionsCount],0) [Unsubscribes]
390-
,0 [Spam]
391-
FROM [dbo].[Campaign] C WITH (NOLOCK)
392-
JOIN [dbo].[User] U WITH (NOLOCK)
393-
ON C.[IdUser] = U.[IdUser]
394-
WHERE
395-
U.[Email] = @userName
396-
AND C.[Status] IN (5,9)
397-
AND C.Active = 1
398-
AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate)
399-
AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate)
400-
AND C.[IdTestCampaign] IS NULL
401-
AND C.[IdScheduledTask] IS NULL
402-
AND (C.TestABCategory IS NULL OR C.TestABCategory = 3)
403-
UNION ALL
404-
SELECT
405-
S.[IdUser]
406-
,S.[IdCampaign]
407-
,C.[UTCSentDate]
408-
,0 [Subscribers]
409-
,0 [Sent]
410-
,0 [Opens]
411-
,0 [Unopens]
412-
,0 [Clicks]
413-
,0 [Hard]
414-
,0 [Soft]
415-
,COUNT(
416-
CASE
417-
WHEN S.IdUnsubscriptionReason <> 2
418-
AND S.UnsubscriptionSubreason NOT IN (2,3,4)
419-
THEN 1
420-
END
421-
) [Unsubscribes]
422-
,COUNT(
423-
CASE
424-
WHEN S.IdUnsubscriptionReason = 2
425-
OR S.UnsubscriptionSubreason IN (2,3,4)
426-
THEN 1
427-
END
428-
) [Spam]
429-
FROM [dbo].[Subscriber] S WITH (NOLOCK)
430-
JOIN [dbo].[Campaign] C WITH (NOLOCK)
431-
ON S.[IdUser] = C.[IdUser] AND S.[IdCampaign] = C.[IdCampaign]
432-
JOIN [dbo].[User] U WITH (NOLOCK)
433-
ON S.[IdUser] = U.[IdUser]
434-
WHERE
435-
U.[Email] = @userName
436-
AND C.[Status] IN (5,9)
437-
AND C.Active = 1
438-
AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate)
439-
AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate)
440-
AND C.[IdTestCampaign] IS NULL
441-
AND C.[IdScheduledTask] IS NULL
442-
AND (C.TestABCategory IS NULL OR C.TestABCategory = 3)
443-
AND S.IdSubscribersStatus = 5
444-
GROUP BY
445-
S.[IdUser]
446-
,S.[IdCampaign]
447-
,C.[Name]
448-
,C.[UTCSentDate]
449-
,C.[FromEmail]
450-
,C.[CampaignType]
451-
) RPT
452-
GROUP BY RPT.[IdUser]
453-
,YEAR(dateadd(MINUTE, @timezone, UTCSentDate))
454-
,MONTH(dateadd(MINUTE, @timezone, UTCSentDate))
455-
456-
ORDER BY [Year] DESC, [Month] DESC
457-
OFFSET @pageNumber * @pageSize ROWS
458-
FETCH NEXT @pageSize ROWS ONLY";
459-
460-
var results = await connection.QueryAsync<MonthlyCampaignMetrics>(dummyDatabaseQuery, new { userName, pageNumber, pageSize, startDate, endDate });
209+
var results = await connection.QueryAsync<MonthlyCampaignMetrics>(
210+
"[dbo].[CampaignsSent_CampaignsByMonthMetrics]",
211+
new
212+
{
213+
userName,
214+
startdate = startDate,
215+
enddate = endDate,
216+
pageNumber,
217+
pageSize
218+
},
219+
commandType: System.Data.CommandType.StoredProcedure
220+
);
461221

462222
return results.ToList();
463223
}

0 commit comments

Comments
 (0)