DROP VIEW IF EXISTS fastrpc_timeline; CREATE VIEW fastrpc_timeline AS SELECT ts, LEAD(ts, 1, (SELECT end_ts FROM trace_bounds)) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur, RTRIM(SUBSTR(name, 13), ']') AS subsystem_name, track_id, value FROM counter JOIN counter_track ON counter.track_id = counter_track.id WHERE (name GLOB 'mem.fastrpc[[]*'); DROP VIEW IF EXISTS fastrpc_subsystem_stats; CREATE VIEW fastrpc_subsystem_stats AS SELECT subsystem_name, SUM(value * dur) / SUM(dur) AS avg_size, MIN(value) AS min_size, MAX(value) AS max_size FROM fastrpc_timeline GROUP BY 1; DROP VIEW IF EXISTS fastrpc_raw_allocs; CREATE VIEW fastrpc_raw_allocs AS SELECT RTRIM(SUBSTR(name, 20), ']') AS subsystem_name, ts, value AS instant_value, SUM(value) OVER win AS value FROM counter c JOIN thread_counter_track t ON c.track_id = t.id WHERE name GLOB 'mem.fastrpc_change*' AND value > 0 WINDOW win AS ( PARTITION BY name ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ); DROP VIEW IF EXISTS fastrpc_alloc_stats; CREATE VIEW fastrpc_alloc_stats AS SELECT subsystem_name, SUM(instant_value) AS total_alloc_size_bytes FROM fastrpc_raw_allocs GROUP BY 1; -- We need to group by ts here as we can have two events from -- different processes occurring at the same timestamp. We take the -- max as this will take both allocations into account at that -- timestamp. DROP VIEW IF EXISTS android_fastrpc_event; CREATE VIEW android_fastrpc_event AS SELECT 'counter' AS track_type, printf('fastrpc allocations (subsystem: %s)', subsystem_name) AS track_name, ts, MAX(value) AS value FROM fastrpc_raw_allocs GROUP BY 1, 2, 3; DROP VIEW IF EXISTS android_fastrpc_output; CREATE VIEW android_fastrpc_output AS SELECT AndroidFastrpcMetric( 'subsystem', RepeatedField( AndroidFastrpcMetric_Subsystem( 'name', subsystem_name, 'avg_size_bytes', avg_size, 'min_size_bytes', min_size, 'max_size_bytes', max_size, 'total_alloc_size_bytes', total_alloc_size_bytes ) )) FROM fastrpc_subsystem_stats JOIN fastrpc_alloc_stats USING (subsystem_name);