Red_Alert_Investigations / delivery_queries.py
github-actions[bot]
sync: automatic content update from github
08c9602
import re
def _quote_identifier(identifier: str) -> str:
"""Quote SQL identifiers that contain special characters."""
def quote_part(part: str) -> str:
if re.match(r"^[A-Za-z_][A-Za-z0-9_]*$", part):
return part
return f'"{part}"'
return ".".join(quote_part(p) for p in identifier.split("."))
def get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
"""Returns the main impression count query filtered by integration and ad format."""
table = _quote_identifier(table)
# Build optional filters to apply after the CTE union.
# Filtering on the calculated aliases (Integration/Ad_Format)
# in the CTE `WHERE` clause would force Snowflake to interpret
# those names as existing columns and attempt type coercion,
# which triggered errors like:
# Numeric value 'bciq1rts' is not recognized
# Instead we apply the filters on the outer SELECT where the
# aliases are available.
post_union_filter = ""
if integration_filter:
post_union_filter += f" AND Integration = '{integration_filter}'"
if ad_format_filter:
post_union_filter += f" AND Ad_Format = '{ad_format_filter}'"
return f"""
WITH today AS (
SELECT
to_date(convert_timezone('UTC','America/New_York',datetime)) AS EST_DATE,
extract(hour FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_HOUR,
extract(minute FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_MINUTE,
CASE
WHEN body[0]:yieldGroupIds[0]::varchar IN ('397722') THEN 'HBT_OB'
WHEN body[0]:campaignId::varchar = '2204701358' THEN 'House'
WHEN b.name LIKE '%Prebid%' THEN 'Prebid'
WHEN b.name LIKE '%TAM%' OR b.name LIKE '%Amazon%' THEN 'TAM'
WHEN b.name LIKE '%AdX%' THEN 'AdX'
WHEN len(body[0]:lineItemId::varchar) > 10 THEN 'AdX'
WHEN c.name LIKE '%TAM%' OR c.name LIKE '%Amazon%' THEN 'TAM'
WHEN c.name LIKE '%AdX%' THEN 'AdX'
WHEN c.name LIKE '%CS%' OR c.name LIKE '%S2S%' THEN 'Prebid'
WHEN b.name LIKE '39_%_%' THEN 'Direct'
WHEN b.name LIKE '38_%_%' THEN 'Direct'
WHEN b.name LIKE '8_%_%_%' AND b.name LIKE '%IX%' THEN 'Prebid'
WHEN b.name LIKE '8_%_%_%' THEN 'Ignore - House, Test, Pub Deal'
WHEN b.name LIKE '7_%_%_%' THEN 'PG'
WHEN b.name LIKE '5_%_%_%' THEN 'PG'
WHEN LEFT(b.name,1) = '4'
AND RIGHT(LEFT(b.name,2),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,3),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,4),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,5),1) = '_' THEN 'Affiliate'
WHEN b.name LIKE '0_%_%_%' THEN 'Ignore'
WHEN (body[0]:campaignId IS NULL
AND body[0]:slotTargeting:hb_bidder[0]::varchar IS NOT NULL)
THEN 'Prebid'
WHEN body[0]:companyIds IS NOT NULL THEN 'OB'
WHEN c.id IS NOT NULL THEN 'Prebid'
ELSE 'OB'
END AS Integration,
CASE
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Outstream%' THEN 'Display'
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Video%' THEN 'Video'
ELSE 'Display'
END AS Ad_Format,
COUNT(*) AS CNT,
'Today' AS timeframe
FROM {table} a
LEFT JOIN ANALYTICS.GAM360.ORDERS b
ON a.body[0]:campaignId::VARCHAR = b.ID::VARCHAR
LEFT JOIN ANALYTICS.GAM360.LINEITEM c
ON c.id::VARCHAR = a.body[0]:lineItemId::VARCHAR
WHERE convert_timezone('UTC','America/New_York',datetime)
BETWEEN '{start_datetime}' AND '{end_datetime}'
AND message = 'SlotRenderEnded::adImpression'
GROUP BY ALL
),
prev1 AS (
-- 1 Week Ago
SELECT
to_date(convert_timezone('UTC','America/New_York',datetime)) AS EST_DATE,
extract(hour FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_HOUR,
extract(minute FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_MINUTE,
CASE
WHEN body[0]:yieldGroupIds[0]::varchar IN ('397722') THEN 'HBT_OB'
WHEN body[0]:campaignId::varchar = '2204701358' THEN 'House'
WHEN b.name LIKE '%Prebid%' THEN 'Prebid'
WHEN b.name LIKE '%TAM%' OR b.name LIKE '%Amazon%' THEN 'TAM'
WHEN b.name LIKE '%AdX%' THEN 'AdX'
WHEN len(body[0]:lineItemId::varchar) > 10 THEN 'AdX'
WHEN c.name LIKE '%TAM%' OR c.name LIKE '%Amazon%' THEN 'TAM'
WHEN c.name LIKE '%AdX%' THEN 'AdX'
WHEN c.name LIKE '%CS%' OR c.name LIKE '%S2S%' THEN 'Prebid'
WHEN b.name LIKE '39_%_%' THEN 'Direct'
WHEN b.name LIKE '38_%_%' THEN 'Direct'
WHEN b.name LIKE '8_%_%_%' AND b.name LIKE '%IX%' THEN 'Prebid'
WHEN b.name LIKE '8_%_%_%' THEN 'Ignore - House, Test, Pub Deal'
WHEN b.name LIKE '7_%_%_%' THEN 'PG'
WHEN b.name LIKE '5_%_%_%' THEN 'PG'
WHEN LEFT(b.name,1) = '4'
AND RIGHT(LEFT(b.name,2),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,3),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,4),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,5),1) = '_' THEN 'Affiliate'
WHEN b.name LIKE '0_%_%_%' THEN 'Ignore'
WHEN (body[0]:campaignId IS NULL
AND body[0]:slotTargeting:hb_bidder[0]::varchar IS NOT NULL)
THEN 'Prebid'
WHEN body[0]:companyIds IS NOT NULL THEN 'OB'
WHEN c.id IS NOT NULL THEN 'Prebid'
ELSE 'OB'
END AS Integration,
CASE
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Outstream%' THEN 'Display'
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Video%' THEN 'Video'
ELSE 'Display'
END AS Ad_Format,
COUNT(*) AS CNT,
'1 Week Ago' AS timeframe
FROM {table} a
LEFT JOIN ANALYTICS.GAM360.ORDERS b
ON a.body[0]:campaignId::VARCHAR = b.ID::VARCHAR
LEFT JOIN ANALYTICS.GAM360.LINEITEM c
ON c.id::VARCHAR = a.body[0]:lineItemId::VARCHAR
WHERE convert_timezone('UTC','America/New_York',datetime)
BETWEEN dateadd(DAY,-7,'{start_datetime}') AND dateadd(DAY,-7,'{end_datetime}')
AND message = 'SlotRenderEnded::adImpression'
GROUP BY ALL
),
prev2 AS (
-- 2 Weeks Ago
SELECT
to_date(convert_timezone('UTC','America/New_York',datetime)) AS EST_DATE,
extract(hour FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_HOUR,
extract(minute FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_MINUTE,
CASE
WHEN body[0]:yieldGroupIds[0]::varchar IN ('397722') THEN 'HBT_OB'
WHEN body[0]:campaignId::varchar = '2204701358' THEN 'House'
WHEN b.name LIKE '%Prebid%' THEN 'Prebid'
WHEN b.name LIKE '%TAM%' OR b.name LIKE '%Amazon%' THEN 'TAM'
WHEN b.name LIKE '%AdX%' THEN 'AdX'
WHEN len(body[0]:lineItemId::varchar) > 10 THEN 'AdX'
WHEN c.name LIKE '%TAM%' OR c.name LIKE '%Amazon%' THEN 'TAM'
WHEN c.name LIKE '%AdX%' THEN 'AdX'
WHEN c.name LIKE '%CS%' OR c.name LIKE '%S2S%' THEN 'Prebid'
WHEN b.name LIKE '39_%_%' THEN 'Direct'
WHEN b.name LIKE '38_%_%' THEN 'Direct'
WHEN b.name LIKE '8_%_%_%' AND b.name LIKE '%IX%' THEN 'Prebid'
WHEN b.name LIKE '8_%_%_%' THEN 'Ignore - House, Test, Pub Deal'
WHEN b.name LIKE '7_%_%_%' THEN 'PG'
WHEN b.name LIKE '5_%_%_%' THEN 'PG'
WHEN LEFT(b.name,1) = '4'
AND RIGHT(LEFT(b.name,2),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,3),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,4),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,5),1) = '_' THEN 'Affiliate'
WHEN b.name LIKE '0_%_%_%' THEN 'Ignore'
WHEN (body[0]:campaignId IS NULL
AND body[0]:slotTargeting:hb_bidder[0]::varchar IS NOT NULL)
THEN 'Prebid'
WHEN body[0]:companyIds IS NOT NULL THEN 'OB'
WHEN c.id IS NOT NULL THEN 'Prebid'
ELSE 'OB'
END AS Integration,
CASE
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Outstream%' THEN 'Display'
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Video%' THEN 'Video'
ELSE 'Display'
END AS Ad_Format,
COUNT(*) AS CNT,
'2 Weeks Ago' AS timeframe
FROM {table} a
LEFT JOIN ANALYTICS.GAM360.ORDERS b
ON a.body[0]:campaignId::VARCHAR = b.ID::VARCHAR
LEFT JOIN ANALYTICS.GAM360.LINEITEM c
ON c.id::VARCHAR = a.body[0]:lineItemId::VARCHAR
WHERE convert_timezone('UTC','America/New_York',datetime)
BETWEEN dateadd(DAY,-14,'{start_datetime}')
AND dateadd(DAY,-14,'{end_datetime}')
AND message = 'SlotRenderEnded::adImpression'
GROUP BY ALL
),
prev3 AS (
-- 3 Weeks Ago
SELECT
to_date(convert_timezone('UTC','America/New_York',datetime)) AS EST_DATE,
extract(hour FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_HOUR,
extract(minute FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_MINUTE,
CASE
WHEN body[0]:yieldGroupIds[0]::varchar IN ('397722') THEN 'HBT_OB'
WHEN body[0]:campaignId::varchar = '2204701358' THEN 'House'
WHEN b.name LIKE '%Prebid%' THEN 'Prebid'
WHEN b.name LIKE '%TAM%' OR b.name LIKE '%Amazon%' THEN 'TAM'
WHEN b.name LIKE '%AdX%' THEN 'AdX'
WHEN len(body[0]:lineItemId::varchar) > 10 THEN 'AdX'
WHEN c.name LIKE '%TAM%' OR c.name LIKE '%Amazon%' THEN 'TAM'
WHEN c.name LIKE '%AdX%' THEN 'AdX'
WHEN c.name LIKE '%CS%' OR c.name LIKE '%S2S%' THEN 'Prebid'
WHEN b.name LIKE '39_%_%' THEN 'Direct'
WHEN b.name LIKE '38_%_%' THEN 'Direct'
WHEN b.name LIKE '8_%_%_%' AND b.name LIKE '%IX%' THEN 'Prebid'
WHEN b.name LIKE '8_%_%_%' THEN 'Ignore - House, Test, Pub Deal'
WHEN b.name LIKE '7_%_%_%' THEN 'PG'
WHEN b.name LIKE '5_%_%_%' THEN 'PG'
WHEN LEFT(b.name,1) = '4'
AND RIGHT(LEFT(b.name,2),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,3),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,4),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,5),1) = '_' THEN 'Affiliate'
WHEN b.name LIKE '0_%_%_%' THEN 'Ignore'
WHEN (body[0]:campaignId IS NULL
AND body[0]:slotTargeting:hb_bidder[0]::varchar IS NOT NULL)
THEN 'Prebid'
WHEN body[0]:companyIds IS NOT NULL THEN 'OB'
WHEN c.id IS NOT NULL THEN 'Prebid'
ELSE 'OB'
END AS Integration,
CASE
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Outstream%' THEN 'Display'
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Video%' THEN 'Video'
ELSE 'Display'
END AS Ad_Format,
COUNT(*) AS CNT,
'3 Weeks Ago' AS timeframe
FROM {table} a
LEFT JOIN ANALYTICS.GAM360.ORDERS b
ON a.body[0]:campaignId::VARCHAR = b.ID::VARCHAR
LEFT JOIN ANALYTICS.GAM360.LINEITEM c
ON c.id::VARCHAR = a.body[0]:lineItemId::VARCHAR
WHERE convert_timezone('UTC','America/New_York',datetime)
BETWEEN dateadd(DAY,-21,'{start_datetime}')
AND dateadd(DAY,-21,'{end_datetime}')
AND message = 'SlotRenderEnded::adImpression'
GROUP BY ALL
)
SELECT * FROM (
SELECT * FROM today
UNION ALL SELECT * FROM prev1
UNION ALL SELECT * FROM prev2
UNION ALL SELECT * FROM prev3
)
WHERE 1=1 {post_union_filter}
"""
def get_bidder_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
base = get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter,
ad_format_filter,
)
# inject hb_bidder field
return base.replace(
"COUNT(*) AS CNT",
"COUNT(*) AS CNT, body[0]:slotTargeting:hb_bidder[0]::varchar AS hb_bidder",
)
def get_flex_bucket_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
base = get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter,
ad_format_filter,
)
return base.replace("COUNT(*) AS CNT", "COUNT(*) AS CNT, bucket")
def get_device_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
base = get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter,
ad_format_filter,
)
# inject device case
device_case = (
"CASE "
"WHEN useragent LIKE '%iPad%' OR useragent LIKE '%Tablet%' THEN 'tablet' "
"WHEN useragent LIKE '%Windows%' OR useragent LIKE '%Macintosh%' THEN 'desktop' "
"WHEN useragent LIKE '%Android%' OR useragent LIKE '%iPhone%' OR useragent LIKE '%Mobi%' THEN 'phone' "
"ELSE 'other' END AS device"
)
return base.replace("COUNT(*) AS CNT", f"COUNT(*) AS CNT, {device_case}")
def get_ad_unit_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
base = get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter,
ad_format_filter,
)
ad_unit_case = (
"CASE "
"WHEN body[0]:slotElementId::varchar LIKE '%Content%' THEN 'Content' "
"WHEN body[0]:slotElementId::varchar LIKE '%Footer%' THEN 'Footer' "
"WHEN body[0]:slotElementId::varchar LIKE '%Recipe%' THEN 'Recipe' "
"WHEN body[0]:slotElementId::varchar LIKE '%Sidebar%' THEN 'Sidebar' "
"WHEN body[0]:slotElementId::varchar LIKE '%Header%' THEN 'Header' "
"WHEN body[0]:slotElementId::varchar LIKE '%Below_Post%' THEN 'Below_Post' "
"WHEN body[0]:slotElementId::varchar LIKE '%Outstream%' THEN 'Sticky Outstream' "
"WHEN body[0]:slotElementId::varchar LIKE '%Video%' THEN 'Video' "
"ELSE 'Other' END AS ad_unit_group"
)
return base.replace("COUNT(*) AS CNT", f"COUNT(*) AS CNT, {ad_unit_case}")
def get_refresh_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter=None,
ad_format_filter=None,
):
base = get_main_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
integration_filter,
ad_format_filter,
)
refresh_field = "body[0]:slotTargeting:refresh[0]::varchar AS Refresh"
return base.replace("COUNT(*) AS CNT", f"COUNT(*) AS CNT, {refresh_field}")
def get_main_int_sov_query(
table,
start_datetime,
end_datetime,
message_filter,
campaign_id,
# integration_filter no longer used for SOV
ad_format_filter=None,
):
"""
Returns the share-of-voice query filtered only by ad format.
"""
table = _quote_identifier(table)
# Only apply Ad_Format filtering after the CTE so that the alias
# can be referenced safely.
post_union_filter = ""
if ad_format_filter:
post_union_filter = f" AND Ad_Format = '{ad_format_filter}'"
return f"""
WITH today AS (
SELECT
to_date(convert_timezone('UTC','America/New_York',datetime)) AS EST_DATE,
extract(hour FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_HOUR,
extract(minute FROM convert_timezone('UTC','America/New_York',datetime)) AS EST_MINUTE,
CASE
WHEN body[0]:yieldGroupIds[0]::varchar IN ('397722') THEN 'HBT_OB'
WHEN body[0]:campaignId::varchar = '2204701358' THEN 'House'
WHEN b.name LIKE '%Prebid%' THEN 'Prebid'
WHEN b.name LIKE '%TAM%' OR b.name LIKE '%Amazon%' THEN 'TAM'
WHEN b.name LIKE '%AdX%' THEN 'AdX'
WHEN len(body[0]:lineItemId::varchar) > 10 THEN 'AdX'
WHEN c.name LIKE '%TAM%' OR c.name LIKE '%Amazon%' THEN 'TAM'
WHEN c.name LIKE '%AdX%' THEN 'AdX'
WHEN c.name LIKE '%CS%' OR c.name LIKE '%S2S%' THEN 'Prebid'
WHEN b.name LIKE '39_%_%' THEN 'Direct'
WHEN b.name LIKE '38_%_%' THEN 'Direct'
WHEN b.name LIKE '8_%_%_%' AND b.name LIKE '%IX%' THEN 'Prebid'
WHEN b.name LIKE '8_%_%_%' THEN 'Ignore - House, Test, Pub Deal'
WHEN b.name LIKE '7_%_%_%' THEN 'PG'
WHEN b.name LIKE '5_%_%_%' THEN 'PG'
WHEN LEFT(b.name,1) = '4'
AND RIGHT(LEFT(b.name,2),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,3),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,4),1) BETWEEN '0' AND '9'
AND RIGHT(LEFT(b.name,5),1) = '_' THEN 'Affiliate'
WHEN b.name LIKE '0_%_%_%' THEN 'Ignore'
WHEN (body[0]:campaignId IS NULL
AND body[0]:slotTargeting:hb_bidder[0]::varchar IS NOT NULL)
THEN 'Prebid'
WHEN body[0]:companyIds IS NOT NULL THEN 'OB'
WHEN c.id IS NOT NULL THEN 'Prebid'
ELSE 'OB'
END AS Integration,
CASE
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Outstream%' THEN 'Display'
WHEN split(body[0]['adUnitPath'],'/')[2]::varchar LIKE '%Video%' THEN 'Video'
ELSE 'Display'
END AS Ad_Format,
COUNT(*) AS CNT,
'Today' AS timeframe
FROM {table} a
LEFT JOIN ANALYTICS.GAM360.ORDERS b
ON a.body[0]:campaignId::VARCHAR = b.ID::VARCHAR
LEFT JOIN ANALYTICS.GAM360.LINEITEM c
ON c.id::VARCHAR = a.body[0]:lineItemId::VARCHAR
WHERE convert_timezone('UTC','America/New_York',datetime)
BETWEEN '{start_datetime}' AND '{end_datetime}'
AND message = 'SlotRenderEnded::adImpression'
GROUP BY ALL
)
SELECT * FROM today
WHERE 1=1 {post_union_filter}
"""