diff --git a/api/src/main/java/com/databasir/api/DocumentController.java b/api/src/main/java/com/databasir/api/DocumentController.java index f5ddd91..b6f8c62 100644 --- a/api/src/main/java/com/databasir/api/DocumentController.java +++ b/api/src/main/java/com/databasir/api/DocumentController.java @@ -24,6 +24,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.UUID; import static org.springframework.data.domain.Sort.Direction.DESC; @@ -86,10 +87,11 @@ public class DocumentController { return JsonData.ok(documentService.getSimpleOneByProjectId(projectId, version)); } - @GetMapping(Routes.Document.GET_TABLE_DETAIL) - public JsonData getTableDocument(@PathVariable Integer projectId, - @PathVariable Integer tableId) { - return JsonData.ok(documentService.getTableDetails(projectId, tableId)); + @PostMapping(Routes.Document.GET_TABLE_DETAIL) + public JsonData> getTableDocument(@PathVariable Integer projectId, + @PathVariable Integer documentId, + @RequestBody List tableIds) { + return JsonData.ok(documentService.getTableDetails(projectId, documentId, tableIds)); } } diff --git a/api/src/main/java/com/databasir/api/Routes.java b/api/src/main/java/com/databasir/api/Routes.java index bf24414..136699d 100644 --- a/api/src/main/java/com/databasir/api/Routes.java +++ b/api/src/main/java/com/databasir/api/Routes.java @@ -80,7 +80,7 @@ public interface Routes { String GET_SIMPLE_ONE = BASE + "/projects/{projectId}/documents/simple"; - String GET_TABLE_DETAIL = BASE + "/projects/{projectId}/table_documents/{tableId}"; + String GET_TABLE_DETAIL = BASE + "/projects/{projectId}/documents/{documentId}/table_documents"; String EXPORT = BASE + "/projects/{projectId}/document_files"; } diff --git a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java index ee0de32..058ea39 100644 --- a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java +++ b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java @@ -21,6 +21,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.sql.Connection; import java.util.*; @@ -180,30 +181,36 @@ public class DocumentService { .orElseGet(Page::empty); } - public Optional getTableDetails(Integer projectId, - Integer tableId) { + public List getTableDetails(Integer projectId, + Integer databaseDocumentId, + List tableIds) { // maybe deleted - if (!projectDao.existsById(projectId)) { - return Optional.empty(); + if (CollectionUtils.isEmpty(tableIds) || !projectDao.existsById(projectId)) { + return Collections.emptyList(); } - - return tableDocumentDao.selectOptionalById(tableId) + var tables = + tableDocumentDao.selectByDatabaseDocumentIdAndIdIn(databaseDocumentId, tableIds); + var columns = + tableColumnDocumentDao.selectByDatabaseDocumentIdAndTableIdIn(databaseDocumentId, tableIds); + var indexes = + tableIndexDocumentDao.selectByDatabaseDocumentIdAndIdIn(databaseDocumentId, tableIds); + var triggers = + tableTriggerDocumentDao.selectByDatabaseDocumentIdAndIdIn(databaseDocumentId, tableIds); + Map> columnsGroupByTableMetaId = columns.stream() + .collect(Collectors.groupingBy(TableColumnDocumentPojo::getTableDocumentId)); + Map> indexesGroupByTableMetaId = indexes.stream() + .collect(Collectors.groupingBy(TableIndexDocumentPojo::getTableDocumentId)); + Map> triggersGroupByTableMetaId = triggers.stream() + .collect(Collectors.groupingBy(TableTriggerDocumentPojo::getTableDocumentId)); + return tables.stream() .map(table -> { - Integer documentId = table.getDatabaseDocumentId(); - var columns = tableColumnDocumentDao.selectByDatabaseDocumentId(documentId); - var indexes = tableIndexDocumentDao.selectByDatabaseMetaId(documentId); - var triggers = tableTriggerDocumentDao.selectByDatabaseDocumentId(documentId); - Map> columnsGroupByTableMetaId = columns.stream() - .collect(Collectors.groupingBy(TableColumnDocumentPojo::getTableDocumentId)); - Map> indexesGroupByTableMetaId = indexes.stream() - .collect(Collectors.groupingBy(TableIndexDocumentPojo::getTableDocumentId)); - Map> triggersGroupByTableMetaId = triggers.stream() - .collect(Collectors.groupingBy(TableTriggerDocumentPojo::getTableDocumentId)); + Integer tableId = table.getId(); var subColumns = columnsGroupByTableMetaId.getOrDefault(tableId, Collections.emptyList()); var subIndexes = indexesGroupByTableMetaId.getOrDefault(tableId, Collections.emptyList()); var subTriggers = triggersGroupByTableMetaId.getOrDefault(tableId, Collections.emptyList()); return documentResponseConverter.of(table, subColumns, subIndexes, subTriggers); - }); + }) + .collect(Collectors.toList()); } public Optional toMarkdown(Integer projectId, Long version) { diff --git a/dao/src/main/java/com/databasir/dao/impl/TableColumnDocumentDao.java b/dao/src/main/java/com/databasir/dao/impl/TableColumnDocumentDao.java index f313358..b1a2c53 100644 --- a/dao/src/main/java/com/databasir/dao/impl/TableColumnDocumentDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/TableColumnDocumentDao.java @@ -6,6 +6,7 @@ import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; import static com.databasir.dao.Tables.TABLE_COLUMN_DOCUMENT; @@ -28,10 +29,15 @@ public class TableColumnDocumentDao extends BaseDao { .fetchInto(TableColumnDocumentPojo.class); } - public void deleteByDatabaseDocumentId(Integer schemaDocumentId) { - getDslContext() - .deleteFrom(TABLE_COLUMN_DOCUMENT) - .where(TABLE_COLUMN_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaDocumentId)) - .execute(); + public List selectByDatabaseDocumentIdAndTableIdIn(Integer schemaDocumentId, + List tableIdIn) { + if (tableIdIn == null || tableIdIn.isEmpty()) { + return Collections.emptyList(); + } + return getDslContext() + .select(TABLE_COLUMN_DOCUMENT.fields()).from(TABLE_COLUMN_DOCUMENT) + .where(TABLE_COLUMN_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaDocumentId) + .and(TABLE_COLUMN_DOCUMENT.TABLE_DOCUMENT_ID.in(tableIdIn))) + .fetchInto(TableColumnDocumentPojo.class); } } diff --git a/dao/src/main/java/com/databasir/dao/impl/TableDocumentDao.java b/dao/src/main/java/com/databasir/dao/impl/TableDocumentDao.java index 38fd3c8..d14fd84 100644 --- a/dao/src/main/java/com/databasir/dao/impl/TableDocumentDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/TableDocumentDao.java @@ -6,6 +6,7 @@ import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; import static com.databasir.dao.Tables.TABLE_DOCUMENT; @@ -33,4 +34,16 @@ public class TableDocumentDao extends BaseDao { .deleteFrom(TABLE_DOCUMENT).where(TABLE_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaDocumentId)) .execute(); } + + public List selectByDatabaseDocumentIdAndIdIn(Integer databaseDocumentId, + List idList) { + if (idList == null || idList.isEmpty()) { + return Collections.emptyList(); + } + return getDslContext() + .selectFrom(TABLE_DOCUMENT) + .where(TABLE_DOCUMENT.DATABASE_DOCUMENT_ID.eq(databaseDocumentId) + .and(TABLE_DOCUMENT.ID.in(idList))) + .fetchInto(TableDocumentPojo.class); + } } diff --git a/dao/src/main/java/com/databasir/dao/impl/TableIndexDocumentDao.java b/dao/src/main/java/com/databasir/dao/impl/TableIndexDocumentDao.java index d5f8fdf..5d905dc 100644 --- a/dao/src/main/java/com/databasir/dao/impl/TableIndexDocumentDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/TableIndexDocumentDao.java @@ -6,6 +6,7 @@ import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; import static com.databasir.dao.Tables.TABLE_INDEX_DOCUMENT; @@ -21,16 +22,22 @@ public class TableIndexDocumentDao extends BaseDao { super(TABLE_INDEX_DOCUMENT, TableIndexDocumentPojo.class); } - public List selectByDatabaseMetaId(Integer schemaMetaId) { + public List selectByDatabaseMetaId(Integer documentId) { return getDslContext() .select(TABLE_INDEX_DOCUMENT.fields()).from(TABLE_INDEX_DOCUMENT) - .where(TABLE_INDEX_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaMetaId)) + .where(TABLE_INDEX_DOCUMENT.DATABASE_DOCUMENT_ID.eq(documentId)) .fetchInto(TableIndexDocumentPojo.class); } - public void deleteByDatabaseMetaId(Integer schemaMetaId) { - getDslContext() - .deleteFrom(TABLE_INDEX_DOCUMENT).where(TABLE_INDEX_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaMetaId)) - .execute(); + public List selectByDatabaseDocumentIdAndIdIn(Integer documentId, + List tableIdIn) { + if (tableIdIn == null || tableIdIn.isEmpty()) { + return Collections.emptyList(); + } + return getDslContext() + .select(TABLE_INDEX_DOCUMENT.fields()).from(TABLE_INDEX_DOCUMENT) + .where(TABLE_INDEX_DOCUMENT.DATABASE_DOCUMENT_ID.eq(documentId) + .and(TABLE_INDEX_DOCUMENT.TABLE_DOCUMENT_ID.in(tableIdIn))) + .fetchInto(TableIndexDocumentPojo.class); } } diff --git a/dao/src/main/java/com/databasir/dao/impl/TableTriggerDocumentDao.java b/dao/src/main/java/com/databasir/dao/impl/TableTriggerDocumentDao.java index dd264c0..bd7b03e 100644 --- a/dao/src/main/java/com/databasir/dao/impl/TableTriggerDocumentDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/TableTriggerDocumentDao.java @@ -6,6 +6,7 @@ import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; import static com.databasir.dao.Tables.TABLE_TRIGGER_DOCUMENT; @@ -28,10 +29,15 @@ public class TableTriggerDocumentDao extends BaseDao { .fetchInto(TableTriggerDocumentPojo.class); } - public void deleteByDatabaseDocumentId(Integer schemaDocumentId) { - getDslContext() - .deleteFrom(TABLE_TRIGGER_DOCUMENT) - .where(TABLE_TRIGGER_DOCUMENT.DATABASE_DOCUMENT_ID.eq(schemaDocumentId)) - .execute(); + public List selectByDatabaseDocumentIdAndIdIn(Integer documentId, + List tableIdIn) { + if (tableIdIn == null || tableIdIn.isEmpty()) { + return Collections.emptyList(); + } + return getDslContext() + .select(TABLE_TRIGGER_DOCUMENT.fields()).from(TABLE_TRIGGER_DOCUMENT) + .where(TABLE_TRIGGER_DOCUMENT.DATABASE_DOCUMENT_ID.eq(documentId) + .and(TABLE_TRIGGER_DOCUMENT.TABLE_DOCUMENT_ID.in(tableIdIn))) + .fetchInto(TableTriggerDocumentPojo.class); } }