blob: f4a65431940c6fa5658e1c848d7e14f6dedea460 [file] [log] [blame]
// Copyright (C) 2023 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 {sqliteString} from '../../base/string_utils';
import {
ArgSetIdColumn,
dependendentColumns,
DisplayConfig,
RegularSqlTableColumn,
} from './table_description';
// This file contains the defintions of different column types that can be
// displayed in the table viewer.
export interface Column {
// SQL expression calculating the value of this column.
expression: string;
// Unique name for this column.
// The relevant bit of SQL fetching this column will be ${expression} as
// ${alias}.
alias: string;
// Title to be displayed in the table header.
title: string;
// How the value of this column should be rendered.
display?: DisplayConfig;
}
export function columnFromSqlTableColumn(c: RegularSqlTableColumn): Column {
return {
expression: c.name,
alias: c.name,
title: c.title || c.name,
display: c.display,
};
}
export function argColumn(c: ArgSetIdColumn, argName: string): Column {
const escape = (name: string) => name.replace(/[^A-Za-z0-9]/g, '_');
return {
expression: `extract_arg(${c.name}, ${sqliteString(argName)})`,
alias: `_arg_${c.name}_${escape(argName)}`,
title: `${c.title ?? c.name} ${argName}`,
};
}
// A single instruction from a select part of the SQL statement, i.e.
// select `expression` as `alias`.
export type SqlProjection = {
expression: string,
alias: string,
};
export function formatSqlProjection(p: SqlProjection): string {
return `${p.expression} as ${p.alias}`;
}
// Returns a list of projections (i.e. parts of the SELECT clause) that should
// be added to the query fetching the data to be able to display the given
// column (e.g. `foo` or `f(bar) as baz`).
// Some table columns are backed by multiple SQL columns (e.g. slice_id is
// backed by id, ts, dur and track_id), so we need to return a list.
export function sqlProjectionsForColumn(column: Column): SqlProjection[] {
const result: SqlProjection[] = [{
expression: column.expression,
alias: column.alias,
}];
for (const dependency of dependendentColumns(column.display)) {
result.push({
expression: dependency,
alias: dependency,
});
}
return result;
}