@@ -348,12 +348,32 @@ async def compute_pixels_for_campaign_areas(
348348 area_pixel_count = cursor .rowcount
349349 total_pixels += area_pixel_count
350350
351- # Update cached_pixel_count on the campaign_area
351+ # Update cached_pixel_count, cached_population, and cached_building_count
352352 cursor .execute ("""
353+ WITH pixel_stats AS (
354+ SELECT
355+ COUNT(*) as pixel_count,
356+ COALESCE(SUM(p.population), 0) as total_population
357+ FROM pixel_area pa
358+ JOIN pixels p ON pa.quadkey = p.quadkey
359+ WHERE pa.campaign_area_id = %s
360+ ),
361+ location_counts AS (
362+ SELECT COUNT(l.id) as building_count
363+ FROM campaign_areas ca
364+ LEFT JOIN locations l ON l.campaign_id = ca.campaign_id
365+ AND l.latitude BETWEEN ca.bbox_min_lat AND ca.bbox_max_lat
366+ AND l.longitude BETWEEN ca.bbox_min_lng AND ca.bbox_max_lng
367+ AND ST_Intersects(l.geometry, ca.geometry)
368+ WHERE ca.id = %s
369+ )
353370 UPDATE campaign_areas
354- SET cached_pixel_count = %s, updated_at = NOW()
371+ SET cached_pixel_count = (SELECT pixel_count FROM pixel_stats),
372+ cached_population = (SELECT total_population FROM pixel_stats),
373+ cached_building_count = (SELECT building_count FROM location_counts),
374+ updated_at = NOW()
355375 WHERE id = %s
356- """ , (area_pixel_count , area_id ))
376+ """ , (area_id , area_id , area_id ))
357377
358378 conn .commit ()
359379 activity .logger .info (f"Computed { total_pixels } pixel associations for { len (campaign_area_ids )} areas" )
@@ -688,18 +708,22 @@ async def assign_pixels_to_round(
688708 WHERE id = %s AND NOT (%s = ANY(COALESCE(rounds, '{}')))
689709 """ , (round_number , coverage_id , round_number ))
690710
691- # Update cached_sampled_count on campaign_area (count pixels with any round)
711+ # Update cached_sampled_count and cached_sampled_population on campaign_area
692712 cursor .execute ("""
693713 WITH sampled AS (
694- SELECT COUNT(DISTINCT cp.quadkey) as cnt
714+ SELECT
715+ COUNT(DISTINCT cp.quadkey) as cnt,
716+ COALESCE(SUM(p.population), 0) as sampled_pop
695717 FROM coverage_pixel cp
696718 JOIN pixel_area pa ON cp.quadkey = pa.quadkey
719+ JOIN pixels p ON cp.quadkey = p.quadkey
697720 WHERE pa.campaign_area_id = %s
698721 AND cp.rounds IS NOT NULL
699722 AND array_length(cp.rounds, 1) > 0
700723 )
701724 UPDATE campaign_areas
702725 SET cached_sampled_count = (SELECT cnt FROM sampled),
726+ cached_sampled_population = (SELECT sampled_pop FROM sampled),
703727 updated_at = NOW()
704728 WHERE id = %s
705729 """ , (campaign_area_id , campaign_area_id ))
@@ -756,12 +780,15 @@ async def update_campaign_area_sampled_count_for_union(
756780
757781 area_id = str (row [0 ])
758782
759- # Count pixels with rounds assigned
783+ # Count pixels and population with rounds assigned
760784 cursor .execute ("""
761785 WITH sampled AS (
762- SELECT COUNT(DISTINCT cp.quadkey) as cnt
786+ SELECT
787+ COUNT(DISTINCT cp.quadkey) as cnt,
788+ COALESCE(SUM(p.population), 0) as sampled_pop
763789 FROM coverage_pixel cp
764790 JOIN pixel_area pa ON cp.quadkey = pa.quadkey
791+ JOIN pixels p ON cp.quadkey = p.quadkey
765792 WHERE pa.campaign_area_id = %s
766793 AND cp.campaign_id = %s
767794 AND cp.indicator_id = %s
@@ -770,6 +797,7 @@ async def update_campaign_area_sampled_count_for_union(
770797 )
771798 UPDATE campaign_areas
772799 SET cached_sampled_count = (SELECT cnt FROM sampled),
800+ cached_sampled_population = (SELECT sampled_pop FROM sampled),
773801 updated_at = NOW()
774802 WHERE id = %s
775803 RETURNING cached_sampled_count
@@ -814,28 +842,34 @@ async def update_campaign_area_sampled_counts(
814842 results = {}
815843
816844 for area_id in campaign_area_ids :
817- # Count pixels that have been sampled (have any round assigned)
845+ # Count pixels and population that have been sampled (have any round assigned)
818846 cursor .execute ("""
819- SELECT COUNT(DISTINCT cp.quadkey)
847+ SELECT
848+ COUNT(DISTINCT cp.quadkey),
849+ COALESCE(SUM(p.population), 0)
820850 FROM coverage_pixel cp
821851 JOIN pixel_area pa ON cp.quadkey = pa.quadkey
852+ JOIN pixels p ON cp.quadkey = p.quadkey
822853 WHERE pa.campaign_area_id = %s
823854 AND cp.campaign_id = %s
824855 AND cp.indicator_id = %s
825856 AND cp.rounds IS NOT NULL
826857 AND array_length(cp.rounds, 1) > 0
827858 """ , (area_id , campaign_id , indicator_id ))
828859
829- sampled_count = cursor .fetchone ()[0 ] or 0
860+ row = cursor .fetchone ()
861+ sampled_count = row [0 ] or 0
862+ sampled_population = row [1 ] or 0
830863 results [area_id ] = sampled_count
831864
832- # Update cached count
865+ # Update cached counts
833866 cursor .execute ("""
834867 UPDATE campaign_areas
835868 SET cached_sampled_count = %s,
869+ cached_sampled_population = %s,
836870 updated_at = NOW()
837871 WHERE id = %s
838- """ , (sampled_count , area_id ))
872+ """ , (sampled_count , sampled_population , area_id ))
839873
840874 conn .commit ()
841875
@@ -1192,18 +1226,22 @@ async def clear_round_from_pixels(
11921226
11931227 cleared_count = cursor .rowcount
11941228
1195- # Update cached_sampled_count (count pixels still having rounds)
1229+ # Update cached_sampled_count and cached_sampled_population (count pixels still having rounds)
11961230 cursor .execute ("""
11971231 WITH sampled AS (
1198- SELECT COUNT(DISTINCT cp.quadkey) as cnt
1232+ SELECT
1233+ COUNT(DISTINCT cp.quadkey) as cnt,
1234+ COALESCE(SUM(p.population), 0) as sampled_pop
11991235 FROM coverage_pixel cp
12001236 JOIN pixel_area pa ON cp.quadkey = pa.quadkey
1237+ JOIN pixels p ON cp.quadkey = p.quadkey
12011238 WHERE pa.campaign_area_id = %s
12021239 AND cp.rounds IS NOT NULL
12031240 AND array_length(cp.rounds, 1) > 0
12041241 )
12051242 UPDATE campaign_areas
12061243 SET cached_sampled_count = (SELECT cnt FROM sampled),
1244+ cached_sampled_population = (SELECT sampled_pop FROM sampled),
12071245 updated_at = NOW()
12081246 WHERE id = %s
12091247 """ , (campaign_area_id , campaign_area_id ))
0 commit comments