diff --git a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts index d4b675570..ae1235665 100644 --- a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts +++ b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts @@ -161,6 +161,7 @@ export class GetTableRowsUseCase extends AbstractUseCase; @@ -79,6 +80,7 @@ export interface IMessageDataInfo { identityColumnName: string; referencedFieldName: string; email: string; + tableStructure: TableStructureDS[] | null; } export interface IPaginationRO { diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts index b774c0e47..ba20226bd 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts @@ -239,6 +239,7 @@ export class DataAccessObjectAgent implements IDataAccessObjectAgent { searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, userEmail: string, ): Promise { const jwtAuthToken = this.generateJWT(this.connection.token); @@ -256,6 +257,7 @@ export class DataAccessObjectAgent implements IDataAccessObjectAgent { filteringFields, autocompleteFields, email: userEmail, + tableStructure, }); if (commandResult instanceof Error) { diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-cassandra.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-cassandra.ts index aaa71c0fc..bd4d5eddc 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-cassandra.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-cassandra.ts @@ -179,6 +179,7 @@ export class DataAccessObjectCassandra extends BasicDataAccessObject implements searchedFieldValue: string, filteringFields: Array, autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { page = page > 0 ? page : DAO_CONSTANTS.DEFAULT_PAGINATION.page; perPage = @@ -189,7 +190,9 @@ export class DataAccessObjectCassandra extends BasicDataAccessObject implements : DAO_CONSTANTS.DEFAULT_PAGINATION.perPage; try { const client = await this.getCassandraClient(); - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); if (autocompleteFields?.value && autocompleteFields?.fields?.length > 0) { @@ -661,6 +664,7 @@ export class DataAccessObjectCassandra extends BasicDataAccessObject implements searchedFieldValue, filteringFields, null, + null, ); const readable = new Readable({ objectMode: true, diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-dynamodb.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-dynamodb.ts index 579887144..43f5e28b7 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-dynamodb.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-dynamodb.ts @@ -229,6 +229,7 @@ export class DataAccessObjectDynamoDB extends BasicDataAccessObject implements I searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { const { dynamoDb } = this.getDynamoDb(); @@ -240,7 +241,9 @@ export class DataAccessObjectDynamoDB extends BasicDataAccessObject implements I ? settings.list_per_page : DAO_CONSTANTS.DEFAULT_PAGINATION.perPage; - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); let filterExpression = ''; @@ -626,6 +629,7 @@ export class DataAccessObjectDynamoDB extends BasicDataAccessObject implements I searchedFieldValue, filteringFields, null, + null, ); return result.data as any; } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-elasticsearch.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-elasticsearch.ts index c0ce3da2f..e132d6635 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-elasticsearch.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-elasticsearch.ts @@ -179,6 +179,7 @@ export class DataAccessObjectElasticsearch extends BasicDataAccessObject impleme searchedFieldValue: string, filteringFields: Array, autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { const client = this.getElasticClient(); @@ -216,7 +217,9 @@ export class DataAccessObjectElasticsearch extends BasicDataAccessObject impleme searchQuery.size = DAO_CONSTANTS.AUTOCOMPLETE_ROW_LIMIT; } - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } let { search_fields } = settings; if ((!search_fields || search_fields.length === 0) && searchedFieldValue) { @@ -563,6 +566,7 @@ export class DataAccessObjectElasticsearch extends BasicDataAccessObject impleme searchedFieldValue, filteringFields, null, + null, ); return result.data as any; } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-ibmdb2.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-ibmdb2.ts index 7ebd864a7..b24379cba 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-ibmdb2.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-ibmdb2.ts @@ -192,6 +192,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { const connectionSchema = this.connection.schema.toUpperCase(); tableName = tableName.toUpperCase(); @@ -209,7 +210,9 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa const connectionToDb = await this.getConnectionToDatabase(); const { large_dataset, rowsCount } = await this.getRowsCount(tableName, this.connection.schema); - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); const lastPage = Math.ceil(rowsCount / perPage); @@ -592,6 +595,7 @@ WHERE searchedFieldValue, filteringFields, null, + null, )) as any; return rowsResult.data; } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mongodb.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mongodb.ts index 3498e8326..00c6130e4 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mongodb.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mongodb.ts @@ -172,6 +172,7 @@ export class DataAccessObjectMongo extends BasicDataAccessObject implements IDat searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { page = page > 0 ? page : DAO_CONSTANTS.DEFAULT_PAGINATION.page; perPage = @@ -185,7 +186,9 @@ export class DataAccessObjectMongo extends BasicDataAccessObject implements IDat const db = await this.getConnectionToDatabase(); const collection = db.collection(tableName); - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); if (autocompleteFields?.value && autocompleteFields.fields?.length > 0) { @@ -441,6 +444,7 @@ export class DataAccessObjectMongo extends BasicDataAccessObject implements IDat searchedFieldValue, filteringFields, null, + null, ); return result.data as any; } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mssql.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mssql.ts index fa1d4663f..6dccc43c9 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mssql.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mssql.ts @@ -125,6 +125,7 @@ export class DataAccessObjectMssql extends BasicDataAccessObject implements IDat searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { page = page > 0 ? page : DAO_CONSTANTS.DEFAULT_PAGINATION.page; perPage = @@ -135,10 +136,11 @@ export class DataAccessObjectMssql extends BasicDataAccessObject implements IDat : DAO_CONSTANTS.DEFAULT_PAGINATION.perPage; const knex = await this.configureKnex(); - const [tableStructure, tableSchema] = await Promise.all([ - this.getTableStructure(receivedTableName), - this.getSchemaName(receivedTableName), - ]); + + if (!tableStructure) { + tableStructure = await this.getTableStructure(receivedTableName); + } + const tableSchema = await this.getSchemaName(receivedTableName); const availableFields = this.findAvailableFields(tableSettings, tableStructure); const tableNameWithoutSchema = receivedTableName; diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mysql.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mysql.ts index 28e33de49..caa1d8808 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-mysql.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-mysql.ts @@ -175,6 +175,7 @@ export class DataAccessObjectMysql extends BasicDataAccessObject implements IDat searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { page = page > 0 ? page : DAO_CONSTANTS.DEFAULT_PAGINATION.page; perPage = @@ -185,7 +186,9 @@ export class DataAccessObjectMysql extends BasicDataAccessObject implements IDat : DAO_CONSTANTS.DEFAULT_PAGINATION.perPage; const knex = await this.configureKnex(); - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); if (autocompleteFields?.value && autocompleteFields?.fields?.length > 0) { diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts index 8d45e37d0..6efc518d1 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-oracle.ts @@ -187,6 +187,7 @@ export class DataAccessObjectOracle extends BasicDataAccessObject implements IDa searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { const knex = await this.configureKnex(); @@ -229,7 +230,9 @@ export class DataAccessObjectOracle extends BasicDataAccessObject implements IDa ? settings.list_per_page : DAO_CONSTANTS.DEFAULT_PAGINATION.perPage; - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); const timestampColumnNames = tableStructure .filter(({ data_type }) => isOracleTimeType(data_type)) diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-postgres.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-postgres.ts index ff3decdcc..e02eb4fd7 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-postgres.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-postgres.ts @@ -144,6 +144,7 @@ export class DataAccessObjectPostgres extends BasicDataAccessObject implements I searchedFieldValue: string, filteringFields: FilteringFieldsDS[], autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { page = page > 0 ? page : DAO_CONSTANTS.DEFAULT_PAGINATION.page; perPage = @@ -155,7 +156,9 @@ export class DataAccessObjectPostgres extends BasicDataAccessObject implements I const knex = await this.configureKnex(); const tableSchema = this.connection.schema ?? 'public'; - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } const availableFields = this.findAvailableFields(settings, tableStructure); if (autocompleteFields?.value && autocompleteFields.fields?.length > 0) { diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts index 12e857cce..3c6398c2f 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts @@ -157,6 +157,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat searchedFieldValue: string, filteringFields: Array, autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise { const redisClient = await this.getClient(); @@ -234,7 +235,10 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat const offset = (page - 1) * perPage; const paginatedRows = allRows.slice(offset, offset + perPage); - const tableStructure = await this.getTableStructure(tableName); + if (!tableStructure) { + tableStructure = await this.getTableStructure(tableName); + } + const availableFields = this.findAvailableFields(settings, tableStructure); const finalRows = paginatedRows.map((row) => { @@ -466,6 +470,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat searchedFieldValue, filteringFields, null, + null, )) as any; return rowsResult.data; } diff --git a/shared-code/src/data-access-layer/shared/interfaces/data-access-object-agent.interface.ts b/shared-code/src/data-access-layer/shared/interfaces/data-access-object-agent.interface.ts index beaf3ee08..a0d0325a8 100644 --- a/shared-code/src/data-access-layer/shared/interfaces/data-access-object-agent.interface.ts +++ b/shared-code/src/data-access-layer/shared/interfaces/data-access-object-agent.interface.ts @@ -54,6 +54,7 @@ export interface IDataAccessObjectAgent { searchedFieldValue: string, filteringFields: Array, autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, userEmail: string, ): Promise; diff --git a/shared-code/src/data-access-layer/shared/interfaces/data-access-object.interface.ts b/shared-code/src/data-access-layer/shared/interfaces/data-access-object.interface.ts index 2f139de92..b4bb9494b 100644 --- a/shared-code/src/data-access-layer/shared/interfaces/data-access-object.interface.ts +++ b/shared-code/src/data-access-layer/shared/interfaces/data-access-object.interface.ts @@ -43,6 +43,7 @@ export interface IDataAccessObject { searchedFieldValue: string, filteringFields: Array, autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, ): Promise; getTableForeignKeys(tableName: string): Promise>;