diff options
Diffstat (limited to 'ui/src/controller/aggregation/frame_aggregation_controller.ts')
-rw-r--r-- | ui/src/controller/aggregation/frame_aggregation_controller.ts | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/ui/src/controller/aggregation/frame_aggregation_controller.ts b/ui/src/controller/aggregation/frame_aggregation_controller.ts new file mode 100644 index 000000000..cca211013 --- /dev/null +++ b/ui/src/controller/aggregation/frame_aggregation_controller.ts @@ -0,0 +1,103 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {ColumnDef} from '../../common/aggregation_data'; +import {Engine} from '../../common/engine'; +import {Area, Sorting} from '../../common/state'; +import {toNs} from '../../common/time'; +import { + ACTUAL_FRAMES_SLICE_TRACK_KIND, + Config +} from '../../tracks/actual_frames/common'; +import {globals} from '../globals'; + +import {AggregationController} from './aggregation_controller'; + +export class FrameAggregationController extends AggregationController { + async createAggregateView(engine: Engine, area: Area) { + await engine.query(`drop view if exists ${this.kind};`); + + const selectedSqlTrackIds = []; + for (const trackId of area.tracks) { + const track = globals.state.tracks[trackId]; + // Track will be undefined for track groups. + if (track !== undefined && + track.kind === ACTUAL_FRAMES_SLICE_TRACK_KIND) { + selectedSqlTrackIds.push((track.config as Config).trackIds); + } + } + if (selectedSqlTrackIds.length === 0) return false; + + const query = `create view ${this.kind} as + SELECT + jank_type, + count(1) as occurrences, + MIN(dur) as minDur, + AVG(dur) as meanDur, + MAX(dur) as maxDur + FROM actual_frame_timeline_slice + WHERE track_id IN (${selectedSqlTrackIds}) AND + ts + dur > ${toNs(area.startSec)} AND + ts < ${toNs(area.endSec)} group by jank_type`; + + await engine.query(query); + return true; + } + + getTabName() { + return 'Frames'; + } + + async getExtra() {} + + getDefaultSorting(): Sorting { + return {column: 'occurrences', direction: 'DESC'}; + } + + getColumnDefinitions(): ColumnDef[] { + return [ + { + title: 'Jank Type', + kind: 'STRING', + columnConstructor: Uint16Array, + columnId: 'jank_type', + }, + { + title: 'Min duration', + kind: 'NUMBER', + columnConstructor: Uint16Array, + columnId: 'minDur', + }, + { + title: 'Max duration', + kind: 'NUMBER', + columnConstructor: Uint16Array, + columnId: 'maxDur', + }, + { + title: 'Mean duration', + kind: 'NUMBER', + columnConstructor: Uint16Array, + columnId: 'meanDur', + }, + { + title: 'Occurrences', + kind: 'NUMBER', + columnConstructor: Uint16Array, + columnId: 'occurrences', + sum: true + } + ]; + } +} |