feat(PostgreSQL): Get the PostgreSQL sequences

This commit is contained in:
Sylphy
2025-04-11 10:47:04 +08:00
parent d9779a4b2e
commit 557c43fede
12 changed files with 229 additions and 19 deletions

View File

@ -345,7 +345,7 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData {
stringBuilder.append("CREATE SEQUENCE ").append(nspname).append(".").append(relname).append("\n ");
if (databaseProductVersion >= 10.0){
if (databaseProductVersion >= 10.0) {
stringBuilder.append(" AS ").append(typname).append("\n ");
}
@ -379,4 +379,21 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData {
},
sequenceName, schemaName);
}
@Override
public List<SimpleSequence> sequences(Connection connection, String databaseName, String schemaName) {
List<SimpleSequence> simpleSequences = new ArrayList<>();
return SQLExecutor.getInstance().preExecute(connection, EXPORT_SEQUENCES_SQL, resultSet -> {
while (resultSet.next()) {
String relname = resultSet.getString("relname");
String comment = resultSet.getString("comment");
simpleSequences.add(SimpleSequence.builder()
.name(relname)
.comment(comment)
.build());
}
return simpleSequences;
},
schemaName);
}
}

View File

@ -665,4 +665,14 @@ public class SQLConst {
WHERE c.relname = ?
and n.nspname = ?;
""";
public static final String EXPORT_SEQUENCES_SQL = """
SELECT c.relname, obj_description(c.oid, 'pg_class') AS comment
FROM pg_sequence s
JOIN
pg_class c ON c.oid = s.seqrelid
JOIN
pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = ?;
""";
}

View File

@ -0,0 +1,50 @@
package ai.chat2db.server.domain.api.param;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* Pagination query sequence information
*
* @author Sylphy
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SequencePageQueryParam extends PageQueryParam {
private static final long serialVersionUID = 1364512325486354343L;
/**
* Corresponding source id stored in the database
*/
@NotNull
private Long dataSourceId;
/**
* Corresponding connection database name
*/
@NotNull
private String databaseName;
/**
* Sequence Name
*/
private String sequenceName;
/**
* schema
*/
private String schemaName;
/**
* if true, refresh the cache
*/
private boolean refresh;
}

View File

@ -1,7 +1,10 @@
package ai.chat2db.server.domain.api.service;
import ai.chat2db.server.domain.api.param.SequencePageQueryParam;
import ai.chat2db.server.domain.api.param.ShowCreateSequenceParam;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.spi.model.SimpleSequence;
/**
* Sequence source management services
@ -10,4 +13,6 @@ import ai.chat2db.server.tools.base.wrapper.result.DataResult;
*/
public interface SequenceService {
DataResult<String> showCreateSequence(ShowCreateSequenceParam request);
ListResult<SimpleSequence> pageQuery(SequencePageQueryParam request);
}

View File

@ -1,18 +1,23 @@
package ai.chat2db.server.domain.core.impl;
import ai.chat2db.server.domain.api.param.SequencePageQueryParam;
import ai.chat2db.server.domain.api.param.ShowCreateSequenceParam;
import ai.chat2db.server.domain.api.service.SequenceService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.model.SimpleSequence;
import ai.chat2db.spi.sql.Chat2DBContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Sequence source management serviceImpl
*
* @author: Sylphy
* @author Sylphy
*/
@Slf4j
@Service
@ -23,4 +28,10 @@ public class SequenceServiceImpl implements SequenceService {
String ddl = metaSchema.sequenceDDL(Chat2DBContext.getConnection(), param.getDatabaseName(), param.getSchemaName(), param.getSequenceName());
return DataResult.of(ddl);
}
public ListResult<SimpleSequence> pageQuery(SequencePageQueryParam request) {
MetaData metaSchema = Chat2DBContext.getMetaData();
List<SimpleSequence> sequences = metaSchema.sequences(Chat2DBContext.getConnection(), request.getDatabaseName(), request.getSchemaName());
return ListResult.of(sequences);
}
}

View File

@ -1,13 +1,17 @@
package ai.chat2db.server.web.api.controller.rdb;
import ai.chat2db.server.domain.api.param.SequencePageQueryParam;
import ai.chat2db.server.domain.api.param.ShowCreateSequenceParam;
import ai.chat2db.server.domain.api.service.DatabaseService;
import ai.chat2db.server.domain.api.service.SequenceService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
import ai.chat2db.server.web.api.controller.rdb.request.DdlExportRequest;
import ai.chat2db.server.web.api.controller.rdb.request.SequenceBriefQueryRequest;
import ai.chat2db.spi.model.SimpleSequence;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -28,6 +32,18 @@ public class SequenceController {
private final DatabaseService databaseService;
private final SequenceService sequenceService;
/**
* Query the sequence list under the current DB
*
* @param request
* @return
*/
@GetMapping("/list")
public ListResult<SimpleSequence> list(@Valid SequenceBriefQueryRequest request) {
SequencePageQueryParam queryParam = rdbWebConverter.sequencePageRequest2param(request);
return sequenceService.pageQuery(queryParam);
}
/**
* Export sequence creation statement
*

View File

@ -5,22 +5,9 @@ import java.util.List;
import ai.chat2db.server.domain.api.param.*;
import ai.chat2db.server.web.api.controller.data.source.vo.DatabaseVO;
import ai.chat2db.server.web.api.controller.rdb.request.*;
import ai.chat2db.server.web.api.controller.rdb.vo.ColumnVO;
import ai.chat2db.server.web.api.controller.rdb.vo.ExecuteResultVO;
import ai.chat2db.server.web.api.controller.rdb.vo.IndexVO;
import ai.chat2db.server.web.api.controller.rdb.vo.MetaSchemaVO;
import ai.chat2db.server.web.api.controller.rdb.vo.SchemaVO;
import ai.chat2db.server.web.api.controller.rdb.vo.SqlVO;
import ai.chat2db.server.web.api.controller.rdb.vo.TableVO;
import ai.chat2db.server.web.api.controller.rdb.vo.*;
import ai.chat2db.server.web.api.http.request.EsTableSchemaRequest;
import ai.chat2db.spi.model.Database;
import ai.chat2db.spi.model.ExecuteResult;
import ai.chat2db.spi.model.MetaSchema;
import ai.chat2db.spi.model.Schema;
import ai.chat2db.spi.model.Sql;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.model.TableIndex;
import ai.chat2db.spi.model.*;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@ -115,6 +102,13 @@ public abstract class RdbWebConverter {
* @return
*/
public abstract TablePageQueryParam tablePageRequest2param(DataExportRequest request);
/**
* Parameter conversion
*
* @param request
* @return
*/
public abstract SequencePageQueryParam sequencePageRequest2param(SequenceBriefQueryRequest request);
/**
* Parameter conversion
*
@ -220,7 +214,20 @@ public abstract class RdbWebConverter {
* @return
*/
public abstract List<TableVO> tableDto2vo(List<Table> dtos);
/**
* Model conversion
*
* @param dtos
* @return
*/
public abstract SimpleSequence SequenceDto2vo(Sequence dtos);
/**
* Model conversion
*
* @param dtos
* @return
*/
public abstract List<SimpleSequence> SequenceDto2vo(List<Sequence> dtos);
/**
* Model conversion
* @param tableColumns

View File

@ -0,0 +1,47 @@
package ai.chat2db.server.web.api.controller.rdb.request;
import ai.chat2db.server.tools.base.wrapper.request.PageQueryRequest;
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequestInfo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
/**
* Query sequence brief request
*
* @author Sylphy
*/
@Data
public class SequenceBriefQueryRequest extends PageQueryRequest implements DataSourceBaseRequestInfo {
@Serial
private static final long serialVersionUID = -1324577112324436332L;
/**
* Data source id
*/
@NotNull
private Long dataSourceId;
/**
* DB name
*/
private String databaseName;
/**
* The space where the sequence is located is required by pg and oracle, but not by mysql.
*/
private String schemaName;
/**
* Fuzzy search terms
*/
private String searchKey;
/**
* if true, refresh the cache
*/
private boolean refresh;
}

View File

@ -271,4 +271,13 @@ public interface MetaData {
*/
String sequenceDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
@NotEmpty String tableName);
/**
* Querying sequences simple information
*
* @param connection
* @param databaseName
* @return
*/
List<SimpleSequence> sequences(Connection connection, String databaseName, String schemaName);
}

View File

@ -193,4 +193,9 @@ public class DefaultMetaService implements MetaData {
@NotEmpty String tableName){
return null;
}
@Override
public List<SimpleSequence> sequences(Connection connection, String databaseName, String schemaName){
return null;
}
}

View File

@ -5,6 +5,8 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
/**
* Sequence information
*
@ -14,7 +16,8 @@ import lombok.experimental.SuperBuilder;
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class Sequence {
public class Sequence implements Serializable {
private static final long serialVersionUID = 1L;
private String nspname;
private String relname;
private String typname;

View File

@ -0,0 +1,30 @@
package ai.chat2db.spi.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
/**
* Simple sequence information
*
* @author Sylphy
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SimpleSequence implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Sequence Name
*/
private String name;
/**
* description
*/
private String comment;
}