@@ -93,21 +93,45 @@ private[micro] class SqliteStorage(readXa: Transactor[IO], writeXa: Transactor[I
9393 s " ( ${bucket.start.toEpochMilli}, ${bucket.end.toEpochMilli}, $idx) "
9494 }.mkString(" , " )
9595
96+ // Split into two queries so that the timestamp + failed index can be used for each
9697 val query = sql """
9798 WITH buckets(bucket_start, bucket_end, bucket_order) AS (
9899 VALUES """ ++ Fragment .const(bucketValues) ++ sql """
100+ ),
101+ valid_counts AS (
102+ SELECT
103+ bucket_start,
104+ bucket_end,
105+ bucket_order,
106+ COUNT(events.rowid) as valid_count
107+ FROM buckets
108+ LEFT JOIN events ON events.timestamp >= buckets.bucket_start
109+ AND events.timestamp < buckets.bucket_end
110+ AND events.failed = false
111+ GROUP BY bucket_start, bucket_end, bucket_order
112+ ),
113+ failed_counts AS (
114+ SELECT
115+ bucket_start,
116+ bucket_end,
117+ bucket_order,
118+ COUNT(events.rowid) as failed_count
119+ FROM buckets
120+ INNER JOIN events ON events.timestamp >= buckets.bucket_start
121+ AND events.timestamp < buckets.bucket_end
122+ AND events.failed = true
123+ GROUP BY bucket_start, bucket_end, bucket_order
99124 )
100125 SELECT
101- bucket_start,
102- bucket_end,
103- bucket_order,
104- COUNT(CASE WHEN events.failed = 0 THEN 1 END) as valid_count,
105- COUNT(CASE WHEN events.failed = 1 THEN 1 END) as failed_count
106- FROM buckets
107- LEFT JOIN events ON events.timestamp >= buckets.bucket_start
108- AND events.timestamp < buckets.bucket_end
109- GROUP BY bucket_start, bucket_end, bucket_order
110- ORDER BY bucket_order
126+ v.bucket_start,
127+ v.bucket_end,
128+ v.bucket_order,
129+ COALESCE(v.valid_count, 0) as valid_count,
130+ COALESCE(f.failed_count, 0) as failed_count
131+ FROM valid_counts v
132+ LEFT JOIN failed_counts f ON v.bucket_start = f.bucket_start
133+ AND v.bucket_end = f.bucket_end
134+ ORDER BY v.bucket_order
111135 """
112136
113137 query
0 commit comments