# Copyright (C) 2022 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. """Contains the public API for generating C++ tables.""" from dataclasses import dataclass from enum import auto from enum import Flag as enum_Flag from typing import Dict from typing import List from typing import Optional from typing import Union @dataclass(frozen=True) class CppColumnType: """ The type of a column on a C++ table. See below for subclasses of this class which can be used. """ class ColumnFlag(enum_Flag): """ Flags which should be associated to the C++ table column. For more information on each option here, see the Column::Flag enum. Keep this in sync with Column::Flag. """ NONE = 0 SORTED = auto() HIDDEN = auto() DENSE = auto() SET_ID = auto() @dataclass(frozen=True) class Column: """ Representation of a column of a C++ table. Attributes: name: The name of the column. type: The type of the column. flags: Flags for the column, ColumnFlag.NONE by default. """ name: str type: CppColumnType flags: ColumnFlag = ColumnFlag.NONE @dataclass(frozen=True) class ColumnDoc: """ Documentation for the C++ table column. Used to generate reference pages on the docs website. Attributes: doc: Freeform docstring for the column. joinable: Indicates this column is joinable with a column from another table. Should have the format "table.column". """ doc: str joinable: Optional[str] = None @dataclass(frozen=True) class TableDoc: """ Documentation for the C++ table. Used to generate reference pages on the docs website. Attributes: doc: Freeform docstring for the table. group: The group of tables this table belongs to. Examples include "Tracks", "Events", "ART Heap Graphs" etc: see the docs page for all the existing groups. columns: Documentation for each table column. skip_id_and_type: Skips publishing these columns in the documentation. Should only be used when these columns are not meaningful or are aliased to something better. """ doc: str group: str columns: Dict[str, Union[ColumnDoc, str]] skip_id_and_type: bool = False @dataclass(frozen=True) class WrappingSqlView: """ Specifies information about SQL view wrapping a table. Useful for tables which are not exposed directly to SQL but instead are wrapped with a SQL view. Attributes: view_name: The name of the SQL view exposed to SQL. """ view_name: str @dataclass(frozen=True) class Table: """ Representation of of a C++ table. Attributes: python_module: Path to the Python module this table is defined in. Always pass __file__. class_name: Name of the C++ table class. sql_name: Name of the table in SQL. columns: The columns in this table. tabledoc: Documentation for this table. Can include documentation overrides for auto-added columns (i.e. id and type) and aliases added in |wrapping_sql_view|. parent: The parent table for this table. All columns are inherited from the specified table. wrapping_sql_view: See |WrappingSqlView|. """ python_module: str class_name: str sql_name: str columns: List[Column] parent: Optional['Table'] = None tabledoc: Optional[TableDoc] = None wrapping_sql_view: Optional[WrappingSqlView] = None @dataclass(frozen=True) class CppInt64(CppColumnType): """Represents the int64_t C++ type.""" @dataclass(frozen=True) class CppUint32(CppColumnType): """Represents the uint32_t C++ type.""" @dataclass(frozen=True) class CppInt32(CppColumnType): """Represents the int32_t C++ type.""" @dataclass(frozen=True) class CppDouble(CppColumnType): """Represents the double C++ type.""" @dataclass(frozen=True) class CppString(CppColumnType): """Represents the StringPool::Id C++ type.""" @dataclass(frozen=True) class CppOptional(CppColumnType): """Represents the base::Optional C++ type.""" inner: CppColumnType @dataclass(frozen=True) class CppTableId(CppColumnType): """Represents the Table::Id C++ type.""" table: Table @dataclass(frozen=True) class CppSelfTableId(CppColumnType): """Represents the Id C++ type.""" @dataclass(frozen=True) class Alias(CppColumnType): """Represents a column which aliases another column. Aliasing refers to re-exporting a column with a different name. This is useful especially for exporting "id" columns which names which associate it to the table name: e.g. exporting thread.id as thread.utid""" underlying_column: str