Line data Source code
1 : import { DataFrame, generateTableName } from '../data_frame.js';
2 : import { DataSearchTask, DataSearchTable } from '../computation_types.js';
3 : import { LoggableException, LoggerLike, stringifyError } from '../../platform/logger/logger.js';
4 : import { buildDataSearchSQL, DATA_SEARCH_ROW_FIELD } from '../sql/query_result_search_sql.js';
5 : import { ComputeQueryExecution, executeDirectly } from '../computation_tasks.js';
6 :
7 1 : const LOG_CTX = "compute";
8 :
9 1 : export async function searchData(
10 1 : task: DataSearchTask,
11 1 : logger: LoggerLike,
12 1 : executeQuery: ComputeQueryExecution = executeDirectly,
13 1 : ): Promise<DataSearchTable> {
14 1 : const sql = buildDataSearchSQL(
15 1 : task.inputDataFrame.tableName,
16 1 : task.rowNumberColumnName,
17 1 : task.columns,
18 1 : task.pattern,
19 1 : );
20 1 : try {
21 1 : logger.info('Searching table data', {
22 1 : version: task.tableVersion.toString(),
23 1 : requestId: task.requestId.toString(),
24 1 : }, LOG_CTX);
25 1 : const tableName = generateTableName('__search');
26 1 : const dataFrame = await executeQuery(sql, clientContext => DataFrame.fromSQL(
27 0 : task.inputDataFrame.database,
28 0 : sql,
29 0 : tableName,
30 0 : task.abortController.signal,
31 0 : clientContext,
32 1 : ));
33 1 : try {
34 1 : const dataTable = await dataFrame.readTable({ orderBy: [{ field: DATA_SEARCH_ROW_FIELD }], abort: task.abortController.signal });
35 1 : return {
36 1 : inputRowNumberColumnName: task.rowNumberColumnName,
37 1 : dataTable,
38 1 : dataFrame,
39 1 : version: task.tableVersion,
40 1 : requestId: task.requestId,
41 1 : };
42 1 : } catch (error) {
43 1 : await dataFrame.destroy();
44 1 : throw error;
45 1 : }
46 1 : } catch (error) {
47 1 : if (error instanceof LoggableException) throw error;
48 1 : throw new LoggableException('Failed to search table data', { error: stringifyError(error) }, LOG_CTX);
49 1 : }
50 1 : }
|