// 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. // Object to facilitate generation of SELECT statement using // generateSqlWithInternalLayout. // // Fields: // @columns: a string array list of the columns to be selected from the table. // required by the internal_layout function. // @sourceTable: the table in the FROM clause, source of the data. // @whereClause: the WHERE clause to filter data from the source table. // @orderByClause: the ORDER BY clause for the query data. interface GenerateSqlArgs { columns: string[]; sourceTable: string; ts: string; dur: string; whereClause?: string; orderByClause?: string; } // Function to generate a SELECT statement utilizing the internal_layout // SQL function as a depth field. export function generateSqlWithInternalLayout( sqlArgs: GenerateSqlArgs, ): string { let sql = `SELECT ` + sqlArgs.columns.toString() + `, internal_layout(${sqlArgs.ts}, ${sqlArgs.dur}) OVER (ORDER BY ${sqlArgs.ts}` + ' ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS depth' + ' FROM ' + sqlArgs.sourceTable; if (sqlArgs.whereClause !== undefined) { sql += ' WHERE ' + sqlArgs.whereClause; } if (sqlArgs.orderByClause !== undefined) { sql += ' ORDER BY ' + sqlArgs.orderByClause; } return sql; }