diff --git a/config/log4j2.xml b/config/log4j2.xml index e22d91228eec78ec756ea8f05191de699330d67b..f8cd66388ef617794a2a4af181f5aaa3dad08009 100644 --- a/config/log4j2.xml +++ b/config/log4j2.xml @@ -30,19 +30,13 @@ - + - - - - - - + diff --git a/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/PrimaryColumnBean.java b/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/PrimaryColumnBean.java index 651e26e27bfb2e4a8acdd6299951b18fb4caba05..5f85c51609f5d9fbe231a06536e874629c601be2 100644 --- a/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/PrimaryColumnBean.java +++ b/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/PrimaryColumnBean.java @@ -15,7 +15,9 @@ package org.opengauss.datachecker.common.entry.extract; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; /** * PrimaryColumnBean @@ -25,6 +27,8 @@ import lombok.Data; * @since :11 */ @Data +@NoArgsConstructor +@AllArgsConstructor public class PrimaryColumnBean { /** * Table diff --git a/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/UniqueColumnBean.java b/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/UniqueColumnBean.java new file mode 100644 index 0000000000000000000000000000000000000000..158f14723fd3246532768c66c9ed295c7e3f7ee8 --- /dev/null +++ b/datachecker-common/src/main/java/org/opengauss/datachecker/common/entry/extract/UniqueColumnBean.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.opengauss.datachecker.common.entry.extract; + +import lombok.Data; + +/** + * UniqueColumnBean + * + * @author :wangchao + * @date :Created in 2023/12/23 + * @since :11 + */ +@Data +public class UniqueColumnBean { + /** + * Table + */ + private String tableName; + + /** + * Primary key column name + */ + private String columnName; + + /** + * Index identifier + */ + private String indexIdentifier; + + /** + * Column index + */ + private Integer colIdx; +} \ No newline at end of file diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/BaseDataService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/BaseDataService.java index 45d3c7ceb391166618bc96037975e5446eaed18e..54e94514887f51aa8dd5b9189cbf0303b5d50f74 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/BaseDataService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/BaseDataService.java @@ -16,6 +16,7 @@ package org.opengauss.datachecker.extract.data; import com.alibaba.druid.pool.DruidDataSource; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.logging.log4j.Logger; @@ -33,6 +34,7 @@ import org.opengauss.datachecker.extract.service.RuleAdapterService; import org.springframework.stereotype.Service; import javax.annotation.Resource; + import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; @@ -103,15 +105,13 @@ public class BaseDataService { */ public List bdsQueryTableMetadataList() { List metadataList = dataAccessService.dasQueryTableMetadataList(); - return metadataList.stream() - .filter(meta -> { - boolean isChecking = ruleAdapterService.filterTableByRule(meta.getTableName()); - if (isChecking) { - tableNameList.add(meta.getTableName()); - } - return isChecking; - }) - .collect(Collectors.toList()); + return metadataList.stream().filter(meta -> { + boolean isChecking = ruleAdapterService.filterTableByRule(meta.getTableName()); + if (isChecking) { + tableNameList.add(meta.getTableName()); + } + return isChecking; + }).collect(Collectors.toList()); } /** @@ -124,8 +124,7 @@ public class BaseDataService { if (CollectionUtils.isEmpty(columnBeanList)) { return new HashMap<>(); } - return columnBeanList.stream() - .collect(Collectors.groupingBy(PrimaryColumnBean::getTableName)); + return columnBeanList.stream().collect(Collectors.groupingBy(PrimaryColumnBean::getTableName)); } private List filterByTableRules(List tableNameList) { @@ -189,28 +188,31 @@ public class BaseDataService { /** * update table metadata, and filter column rules * - * @param tableMetadata table metadata + * @param tableMetadata table metadata * @param primaryColumnBeans primary column */ public void updateTableColumnMetaData(TableMetadata tableMetadata, List primaryColumnBeans) { String tableName = tableMetadata.getTableName(); final List columns = dataAccessService.queryTableColumnsMetaData(tableName); - if (Objects.isNull(columns)) { + if (CollectionUtils.isEmpty(columns)) { LogUtils.error(log, "table columns metadata is null ,{}", tableName); return; } - if (Objects.isNull(primaryColumnBeans)) { - primaryColumnBeans = dataAccessService.queryTablePrimaryColumns(tableName); + List tempPrimaryColumnBeans = primaryColumnBeans; + if (CollectionUtils.isEmpty(primaryColumnBeans)) { + tempPrimaryColumnBeans = dataAccessService.queryTablePrimaryColumns(tableName); } - if (Objects.nonNull(primaryColumnBeans)) { - List primaryColumnNameList = getPrimaryColumnNames(primaryColumnBeans); + if (CollectionUtils.isEmpty(tempPrimaryColumnBeans)) { + tempPrimaryColumnBeans = dataAccessService.queryTableUniqueColumns(tableName); + } + if (CollectionUtils.isNotEmpty(tempPrimaryColumnBeans)) { + List primaryColumnNameList = getPrimaryColumnNames(tempPrimaryColumnBeans); for (ColumnsMetaData column : columns) { if (primaryColumnNameList.contains(column.getLowerCaseColumnName())) { column.setColumnKey(ColumnKey.PRI); } } } - tableMetadata.setColumnsMetas(ruleAdapterService.executeColumnRule(columns)); tableMetadata.setPrimaryMetas(getTablePrimaryColumn(columns)); tableMetadata.setTableHash(calcTableHash(columns)); @@ -218,16 +220,17 @@ public class BaseDataService { private List getPrimaryColumnNames(List primaryColumnBeans) { return primaryColumnBeans.stream() - .map(PrimaryColumnBean::getColumnName) - .map(String::toLowerCase) - .collect(Collectors.toList()); + .map(PrimaryColumnBean::getColumnName) + .map(String::toLowerCase) + .distinct() + .collect(Collectors.toList()); } private List getTablePrimaryColumn(List columnsMetaData) { return columnsMetaData.stream() - .filter(meta -> ColumnKey.PRI.equals(meta.getColumnKey())) - .sorted(Comparator.comparing(ColumnsMetaData::getOrdinalPosition)) - .collect(Collectors.toList()); + .filter(meta -> ColumnKey.PRI.equals(meta.getColumnKey())) + .sorted(Comparator.comparing(ColumnsMetaData::getOrdinalPosition)) + .collect(Collectors.toList()); } /** @@ -255,9 +258,8 @@ public class BaseDataService { private long calcTableHash(List columnsMetas) { StringBuilder buffer = new StringBuilder(); columnsMetas.sort(Comparator.comparing(ColumnsMetaData::getOrdinalPosition)); - columnsMetas.forEach(column -> buffer.append(column.getColumnName() - .toLowerCase(Locale.ENGLISH)) - .append(column.getOrdinalPosition())); + columnsMetas.forEach(column -> buffer.append(column.getColumnName().toLowerCase(Locale.ENGLISH)) + .append(column.getOrdinalPosition())); return HASH_UTIL.hashBytes(buffer.toString()); } @@ -289,9 +291,8 @@ public class BaseDataService { } else { String[] sqlModeArray = sqlMode.split(","); String newSqlMode = Arrays.stream(sqlModeArray) - .filter(mode -> !mode.equalsIgnoreCase( - ConfigConstants.SQL_MODE_NAME_PAD_CHAR_TO_FULL_LENGTH)) - .collect(Collectors.joining(",")); + .filter(mode -> !mode.equalsIgnoreCase(ConfigConstants.SQL_MODE_NAME_PAD_CHAR_TO_FULL_LENGTH)) + .collect(Collectors.joining(",")); boolean isPadCharFull = ConfigCache.getBooleanValue(ConfigConstants.SQL_MODE_PAD_CHAR_TO_FULL_LENGTH); if (isPadCharFull) { newSqlMode += ConfigConstants.SQL_MODE_NAME_PAD_CHAR_TO_FULL_LENGTH; diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/AbstractDataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/AbstractDataAccessService.java index a83d49811f0befc52ae145cf1aef556d7b4c4c9f..93b19b87bd7e11fc9da9aab42a3a3be1e4a55f37 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/AbstractDataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/AbstractDataAccessService.java @@ -16,6 +16,9 @@ package org.opengauss.datachecker.extract.data.access; import com.alibaba.druid.pool.DruidDataSource; + +import cn.hutool.core.collection.CollUtil; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; import org.opengauss.datachecker.common.config.ConfigCache; @@ -25,6 +28,7 @@ import org.opengauss.datachecker.common.entry.common.Health; import org.opengauss.datachecker.common.entry.enums.LowerCaseTableNames; import org.opengauss.datachecker.common.entry.extract.PrimaryColumnBean; import org.opengauss.datachecker.common.entry.extract.TableMetadata; +import org.opengauss.datachecker.common.entry.extract.UniqueColumnBean; import org.opengauss.datachecker.common.exception.ExtractDataAccessException; import org.opengauss.datachecker.common.util.DurationUtils; import org.opengauss.datachecker.common.util.LogUtils; @@ -36,16 +40,19 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import javax.annotation.Resource; import javax.sql.DataSource; + import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Duration; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * AbstractDataAccessService @@ -113,7 +120,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { public String adasQuerySchema(Connection connection, String executeQueryStatement) { String schema = ""; try (PreparedStatement ps = connection.prepareStatement(executeQueryStatement); - ResultSet resultSet = ps.executeQuery()) { + ResultSet resultSet = ps.executeQuery()) { if (resultSet.next()) { schema = resultSet.getString(RS_COL_SCHEMA); } @@ -129,7 +136,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { * 数据库schema是否合法 * * @param schema schema - * @param sql sql + * @param sql sql * @return result */ public Health health(String schema, String sql) { @@ -160,7 +167,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { Connection connection = getConnection(); List list = new LinkedList<>(); try (PreparedStatement ps = connection.prepareStatement(executeQueryStatement); - ResultSet resultSet = ps.executeQuery()) { + ResultSet resultSet = ps.executeQuery()) { while (resultSet.next()) { list.add(resultSet.getString(RS_COL_TABLE_NAME)); } @@ -185,7 +192,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { Connection connection = getConnection(); List list = new LinkedList<>(); try (PreparedStatement ps = connection.prepareStatement(executeQueryStatement); - ResultSet resultSet = ps.executeQuery()) { + ResultSet resultSet = ps.executeQuery()) { PrimaryColumnBean metadata; while (resultSet.next()) { metadata = new PrimaryColumnBean(); @@ -203,6 +210,50 @@ public abstract class AbstractDataAccessService implements DataAccessService { return list; } + /** + * adas查询表的唯一性约束列信息 + * + * @param executeQueryStatement executeQueryStatement + * @return List + */ + public List adasQueryTableUniqueColumns(String executeQueryStatement) { + Connection connection = getConnection(); + List list = new LinkedList<>(); + try (PreparedStatement ps = connection.prepareStatement(executeQueryStatement); + ResultSet resultSet = ps.executeQuery()) { + UniqueColumnBean metadata; + while (resultSet.next()) { + metadata = new UniqueColumnBean(); + metadata.setTableName(resultSet.getString("tableName")); + metadata.setColumnName(resultSet.getString("columnName")); + metadata.setIndexIdentifier(resultSet.getString("indexIdentifier")); + metadata.setColIdx(resultSet.getInt("colIdx")); + list.add(metadata); + } + } catch (SQLException esql) { + LogUtils.error(log, "adasQueryTablePrimaryColumns error:", esql); + } finally { + closeConnection(connection); + } + return list; + } + + /** + * 将UniqueColumnBean列表转换为PrimaryColumnBean列表 + * + * @param uniqueColumns 输入的UniqueColumnBean列表,可能为空 + * @return PrimaryColumnBean列表,永远不会为null,其中的元素是唯一的 + */ + public List translateUniqueToPrimaryColumns(List uniqueColumns) { + if (CollUtil.isEmpty(uniqueColumns)) { + return new ArrayList<>(); + } + return uniqueColumns.stream() + .map(u -> new PrimaryColumnBean(u.getTableName(), u.getColumnName())) + .distinct() + .collect(Collectors.toList()); + } + /** * adasQueryTableMetadataList * @@ -214,7 +265,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { Connection connection = getConnection(); List list = new LinkedList<>(); try (PreparedStatement ps = connection.prepareStatement(executeQueryStatement); - ResultSet resultSet = ps.executeQuery()) { + ResultSet resultSet = ps.executeQuery()) { TableMetadata metadata; while (resultSet.next()) { metadata = new TableMetadata(); @@ -238,7 +289,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { * 查询表数据抽样检查点清单 * * @param connection connection - * @param sql 检查点查询SQL + * @param sql 检查点查询SQL * @return 检查点列表 */ protected List adasQueryPointList(Connection connection, String sql) { @@ -259,7 +310,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { * 查询表数据抽样检查点清单 * * @param connection connection - * @param sql 检查点查询SQL + * @param sql 检查点查询SQL * @return 检查点列表 */ protected String adasQueryOnePoint(Connection connection, String sql) { @@ -277,8 +328,7 @@ public abstract class AbstractDataAccessService implements DataAccessService { } private long durationBetweenToMillis(LocalDateTime start, LocalDateTime end) { - return Duration.between(start, end) - .toMillis(); + return Duration.between(start, end).toMillis(); } /** @@ -292,15 +342,15 @@ public abstract class AbstractDataAccessService implements DataAccessService { return null; } return tableMetadata.setDataBaseType(properties.getDatabaseType()) - .setEndpoint(properties.getEndpoint()) - .setOgCompatibilityB(isOgCompatibilityB); + .setEndpoint(properties.getEndpoint()) + .setOgCompatibilityB(isOgCompatibilityB); } /** * jdbc mode does not use it * - * @param table table - * @param fileName fileName + * @param table table + * @param fileName fileName * @param differenceList differenceList * @return result */ @@ -317,8 +367,8 @@ public abstract class AbstractDataAccessService implements DataAccessService { */ protected List wrapperTableMetadata(List list) { list.forEach(meta -> meta.setDataBaseType(properties.getDatabaseType()) - .setEndpoint(properties.getEndpoint()) - .setOgCompatibilityB(isOgCompatibilityB)); + .setEndpoint(properties.getEndpoint()) + .setOgCompatibilityB(isOgCompatibilityB)); return list; } diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/CsvDataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/CsvDataAccessService.java index f8eb60ac7fa7822cf283ffabf10482cf56c8c484..322796bbd00a0004d5ebed5cdd7651482e37eb05 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/CsvDataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/CsvDataAccessService.java @@ -269,4 +269,9 @@ public class CsvDataAccessService implements DataAccessService { public LowerCaseTableNames queryLowerCaseTableNames() { return LowerCaseTableNames.INSENSITIVE; } + + @Override + public List queryTableUniqueColumns(String tableName) { + return null; + } } diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/DataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/DataAccessService.java index 5d2e84d1847b8fcb59b91fa845dda9a0f7058fc7..6eaef3875e047addeba0a532d739732a8783d80e 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/DataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/DataAccessService.java @@ -25,6 +25,7 @@ import org.opengauss.datachecker.common.entry.extract.TableMetadata; import org.springframework.jdbc.core.RowMapper; import javax.sql.DataSource; + import java.sql.Connection; import java.util.List; import java.util.Map; @@ -111,7 +112,7 @@ public interface DataAccessService { * query table column min value * * @param connection connection - * @param param param + * @param param param * @return min value of string */ String min(Connection connection, DataAccessParam param); @@ -120,7 +121,7 @@ public interface DataAccessService { * query table column max value * * @param connection connection - * @param param param + * @param param param * @return max value of string */ String max(Connection connection, DataAccessParam param); @@ -136,10 +137,10 @@ public interface DataAccessService { /** * query row data by sql * - * @param sql sql - * @param param sql param + * @param sql sql + * @param param sql param * @param rowMapper row mapper - * @param data type + * @param data type * @return data */ List query(String sql, Map param, RowMapper rowMapper); @@ -147,10 +148,10 @@ public interface DataAccessService { /** * query data from csv file * - * @param table table - * @param fileName fileName + * @param table table + * @param fileName fileName * @param differenceList differenceList - * @return + * @return data */ List> query(String table, String fileName, List differenceList); @@ -165,7 +166,7 @@ public interface DataAccessService { * query table check point list * * @param connection connection - * @param param param + * @param param param * @return point list */ List queryPointList(Connection connection, DataAccessParam param); @@ -187,4 +188,15 @@ public interface DataAccessService { * @return value */ LowerCaseTableNames queryLowerCaseTableNames(); + + /** + * query table unique columns + *
+     *     唯一性约束与唯一性索引
+     * 
+ * + * @param tableName table + * @return unique columns + */ + List queryTableUniqueColumns(String tableName); } diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/MysqlDataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/MysqlDataAccessService.java index 8383c694dfca380874aa78623e07baeabbe40ca8..d3884613c9d8465de335c47483508cf19e8c3608 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/MysqlDataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/MysqlDataAccessService.java @@ -21,6 +21,7 @@ import org.opengauss.datachecker.common.entry.enums.LowerCaseTableNames; import org.opengauss.datachecker.common.entry.extract.ColumnsMetaData; import org.opengauss.datachecker.common.entry.extract.PrimaryColumnBean; import org.opengauss.datachecker.common.entry.extract.TableMetadata; +import org.opengauss.datachecker.common.entry.extract.UniqueColumnBean; import org.opengauss.datachecker.extract.data.mapper.MysqlMetaDataMapper; import java.sql.Connection; @@ -52,8 +53,8 @@ public class MysqlDataAccessService extends AbstractDataAccessService { @Override public Health health() { String schema = properties.getSchema(); - String sql = "SELECT SCHEMA_NAME tableSchema FROM information_schema.SCHEMATA info WHERE SCHEMA_NAME='" - + schema + "' limit 1"; + String sql = "SELECT SCHEMA_NAME tableSchema FROM information_schema.SCHEMATA info WHERE SCHEMA_NAME='" + schema + + "' limit 1"; return health(schema, sql); } @@ -66,7 +67,7 @@ public class MysqlDataAccessService extends AbstractDataAccessService { public List dasQueryTableNameList() { String schema = properties.getSchema(); String sql = "select info.table_name tableName from information_schema.tables info where table_schema='" - + schema + "' and table_type='BASE TABLE'"; + + schema + "' and table_type='BASE TABLE'"; return adasQueryTableNameList(sql); } @@ -83,11 +84,23 @@ public class MysqlDataAccessService extends AbstractDataAccessService { @Override public List queryTablePrimaryColumns() { String sql = "select table_name tableName ,lower(column_name) columnName from information_schema.columns " - + "where table_schema='" + properties.getSchema() - + "' and column_key='PRI' order by ordinal_position asc "; + + "where table_schema='" + properties.getSchema() + "' and column_key='PRI' order by ordinal_position asc "; return adasQueryTablePrimaryColumns(sql); } + @Override + public List queryTableUniqueColumns(String tableName) { + String schema = properties.getSchema(); + String sql = "select kcu.table_name tableName, kcu.column_name columnName,kcu.ordinal_position colIdx," + + " kcu.constraint_name indexIdentifier from information_schema.table_constraints tc " + + " left join information_schema.KEY_COLUMN_USAGE kcu on tc.table_schema =kcu.table_schema" + + " and tc.constraint_name=kcu.constraint_name and tc.table_name = kcu.table_name" + + " where tc.table_schema='" + schema + "' and tc.table_name='" + tableName + "'" + + " and tc.constraint_type='UNIQUE' ;"; + List uniqueColumns = adasQueryTableUniqueColumns(sql); + return translateUniqueToPrimaryColumns(uniqueColumns); + } + @Override public List queryTablePrimaryColumns(String tableName) { return mysqlMetaDataMapper.queryTablePrimaryColumnsByTableName(properties.getSchema(), tableName); @@ -97,11 +110,11 @@ public class MysqlDataAccessService extends AbstractDataAccessService { public List dasQueryTableMetadataList() { LowerCaseTableNames lowerCaseTableNames = getLowerCaseTableNames(); String colTableName = Objects.equals(LowerCaseTableNames.SENSITIVE, lowerCaseTableNames) - ? "info.table_name tableName" - : "lower(info.table_name) tableName"; + ? "info.table_name tableName" + : "lower(info.table_name) tableName"; String sql = " SELECT info.TABLE_SCHEMA tableSchema," + colTableName + ",info.table_rows tableRows , " - + "info.avg_row_length avgRowLength FROM information_schema.tables info WHERE TABLE_SCHEMA='" - + properties.getSchema() + "'"; + + "info.avg_row_length avgRowLength FROM information_schema.tables info WHERE TABLE_SCHEMA='" + + properties.getSchema() + "'"; return wrapperTableMetadata(adasQueryTableMetadataList(sql)); } @@ -130,9 +143,9 @@ public class MysqlDataAccessService extends AbstractDataAccessService { @Override public List queryPointList(Connection connection, DataAccessParam param) { String sql = "select s.%s from (SELECT @rowno:=@rowno+1 as rn,r.%s from %s.%s r," - + " (select @rowno := 0) t ORDER BY r.%s asc) s where mod(s.rn, %s) = 1"; + + " (select @rowno := 0) t ORDER BY r.%s asc) s where mod(s.rn, %s) = 1"; sql = String.format(sql, param.getColName(), param.getColName(), param.getSchema(), param.getName(), - param.getColName(), param.getOffset()); + param.getColName(), param.getOffset()); return adasQueryPointList(connection, sql); } diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OpgsDataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OpgsDataAccessService.java index d910ef588925970a78950d567a406df248176541..86a0843112937fe99c9c0fa7f7a4283a0c057d40 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OpgsDataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OpgsDataAccessService.java @@ -24,6 +24,7 @@ import org.opengauss.datachecker.common.entry.enums.OgCompatibility; import org.opengauss.datachecker.common.entry.extract.ColumnsMetaData; import org.opengauss.datachecker.common.entry.extract.PrimaryColumnBean; import org.opengauss.datachecker.common.entry.extract.TableMetadata; +import org.opengauss.datachecker.common.entry.extract.UniqueColumnBean; import org.opengauss.datachecker.extract.data.mapper.OpgsMetaDataMapper; import javax.annotation.PostConstruct; @@ -127,6 +128,18 @@ public class OpgsDataAccessService extends AbstractDataAccessService { return adasQueryTablePrimaryColumns(sql); } + @Override + public List queryTableUniqueColumns(String tableName) { + String schema = properties.getSchema(); + String sql = "SELECT c.relname AS tableName, ns.nspname, i.indexrelid indexIdentifier, " + + " a.attname AS columnName, a.attnum colIdx FROM pg_index i" + + " JOIN pg_class c ON i.indrelid = c.oid join pg_namespace ns on c.relnamespace=ns.oid" + + " JOIN pg_attribute a ON i.indrelid = a.attrelid AND a.attnum = ANY(i.indkey) " + + " where ns.nspname='" + schema + "' and c.relname='" + tableName + "' and i.indisunique = true;"; + List uniqueColumns = adasQueryTableUniqueColumns(sql); + return translateUniqueToPrimaryColumns(uniqueColumns); + } + @Override public List queryTableColumnsMetaData(String tableName) { return opgsMetaDataMapper.queryTableColumnsMetaData(properties.getSchema(), tableName); diff --git a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OracleDataAccessService.java b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OracleDataAccessService.java index b2426c17f563ee28d57f59e9e4be03489a14da63..e29bafb2631437e3a7cafcfde30d066fb7844bab 100644 --- a/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OracleDataAccessService.java +++ b/datachecker-extract/src/main/java/org/opengauss/datachecker/extract/data/access/OracleDataAccessService.java @@ -21,6 +21,7 @@ import org.opengauss.datachecker.common.entry.enums.LowerCaseTableNames; import org.opengauss.datachecker.common.entry.extract.ColumnsMetaData; import org.opengauss.datachecker.common.entry.extract.PrimaryColumnBean; import org.opengauss.datachecker.common.entry.extract.TableMetadata; +import org.opengauss.datachecker.common.entry.extract.UniqueColumnBean; import org.opengauss.datachecker.extract.data.mapper.OracleMetaDataMapper; import java.sql.Connection; @@ -76,11 +77,22 @@ public class OracleDataAccessService extends AbstractDataAccessService { @Override public List queryTablePrimaryColumns() { String sql = "SELECT A.TABLE_NAME tableName, A.COLUMN_NAME columnName FROM ALL_CONS_COLUMNS A,ALL_CONSTRAINTS B" - + " WHERE A.constraint_name = B.constraint_name AND B.constraint_type = 'P' AND A.OWNER = '" - + properties.getSchema() + "'"; + + " WHERE A.constraint_name = B.constraint_name AND B.constraint_type = 'P' AND A.OWNER = '" + + properties.getSchema() + "'"; return adasQueryTablePrimaryColumns(sql); } + @Override + public List queryTableUniqueColumns(String tableName) { + String schema = properties.getSchema(); + String sql = "SELECT uc.table_name tableName,uc.constraint_name indexIdentifier,ucc.column_name columnName," + + " uc.constraint_type,ucc.position colIdx FROM USER_CONSTRAINTS uc " + + " JOIN USER_CONS_COLUMNS ucc ON uc.constraint_name=ucc.constraint_name " + + " WHERE uc.constraint_type='U' and uc.owner='" + schema + "'and uc.table_name='" + tableName + "'"; + List uniqueColumns = adasQueryTableUniqueColumns(sql); + return translateUniqueToPrimaryColumns(uniqueColumns); + } + @Override public List queryTablePrimaryColumns(String tableName) { return oracleMetaDataMapper.queryTablePrimaryColumnsByTableName(properties.getSchema(), tableName); @@ -91,12 +103,11 @@ public class OracleDataAccessService extends AbstractDataAccessService { String schema = properties.getSchema(); LowerCaseTableNames lowerCaseTableNames = getLowerCaseTableNames(); String colTableName = Objects.equals(LowerCaseTableNames.SENSITIVE, lowerCaseTableNames) - ? "t.table_name tableName" - : "lower(t.table_name) tableName"; + ? "t.table_name tableName" + : "lower(t.table_name) tableName"; String sql = "SELECT t.owner tableSchema," + colTableName + ",t.num_rows tableRows,avg_row_len avgRowLength" - + " FROM ALL_TABLES t LEFT JOIN (SELECT DISTINCT table_name from ALL_CONSTRAINTS where OWNER = '" - + schema + "' AND constraint_type='P') pc on t.table_name=pc.table_name WHERE t.OWNER = '" - + schema + "'"; + + " FROM ALL_TABLES t LEFT JOIN (SELECT DISTINCT table_name from ALL_CONSTRAINTS where OWNER = '" + schema + + "' AND constraint_type='P') pc on t.table_name=pc.table_name WHERE t.OWNER = '" + schema + "'"; return wrapperTableMetadata(adasQueryTableMetadataList(sql)); }