diff --git a/src/containers/Tenant/Schema/SchemaViewer/columns.tsx b/src/containers/Tenant/Schema/SchemaViewer/columns.tsx index 45b0114008..d699d6b0a6 100644 --- a/src/containers/Tenant/Schema/SchemaViewer/columns.tsx +++ b/src/containers/Tenant/Schema/SchemaViewer/columns.tsx @@ -8,7 +8,7 @@ export const SCHEMA_COLUMNS_WIDTH_LS_KEY = 'schemaTableColumnsWidth'; export const SCHEMA_TABLE_COLUMS_IDS = { id: 'id', name: 'name', - isKeyColumn: 'isKeyColumn', + keyColumnIndex: 'keyColumnIndex', type: 'type', notNull: 'notNull', autoIncrement: 'autoIncrement', diff --git a/src/containers/Tenant/Schema/SchemaViewer/prepareData.ts b/src/containers/Tenant/Schema/SchemaViewer/prepareData.ts index 97a43dacee..a349a3d753 100644 --- a/src/containers/Tenant/Schema/SchemaViewer/prepareData.ts +++ b/src/containers/Tenant/Schema/SchemaViewer/prepareData.ts @@ -48,7 +48,7 @@ function prepareRowTableSchema(data: TTableDescription = {}): SchemaData[] { const preparedColumns = Columns?.map((column) => { const {Id, Name, NotNull, Type, Family, DefaultFromSequence, DefaultFromLiteral} = column; - const isKeyColumn = Boolean(KeyColumnIds?.find((keyColumnId) => keyColumnId === Id)); + const keyColumnIndex = KeyColumnIds?.findIndex((keyColumnId) => keyColumnId === Id) ?? -1; const familyName = Family ? families[Family].Name : undefined; const prefferedPoolKind = Family @@ -59,7 +59,7 @@ function prepareRowTableSchema(data: TTableDescription = {}): SchemaData[] { return { id: Id, name: Name, - isKeyColumn, + keyColumnIndex, type: Type, notNull: NotNull, autoIncrement: Boolean(DefaultFromSequence), @@ -69,8 +69,8 @@ function prepareRowTableSchema(data: TTableDescription = {}): SchemaData[] { columnCodec, }; }); - const keyColumns = preparedColumns?.filter((column) => column.isKeyColumn) || []; - const otherColumns = preparedColumns?.filter((column) => !column.isKeyColumn) || []; + const keyColumns = preparedColumns?.filter((column) => column.keyColumnIndex !== -1) || []; + const otherColumns = preparedColumns?.filter((column) => column.keyColumnIndex === -1) || []; return [...keyColumns, ...otherColumns]; } @@ -92,16 +92,15 @@ function prepareExternalTableSchema(data: TExternalTableDescription = {}): Schem function prepareColumnTableSchema(data: TColumnTableDescription = {}): SchemaData[] { const {Schema = {}, Sharding = {}} = data; - const {Columns, KeyColumnNames} = Schema; + const {Columns, KeyColumnIds} = Schema; const {HashSharding = {}} = Sharding; const {Columns: HashColumns = []} = HashSharding; const preparedColumns = Columns?.map((column) => { const {Id, Name, Type, NotNull} = column; - const isKeyColumn = Boolean( - KeyColumnNames?.find((keyColumnName) => keyColumnName === Name), - ); + const keyColumnIndex = KeyColumnIds?.findIndex((keyColumnId) => keyColumnId === Id) ?? -1; + const isPartitioningKeyColumn = Boolean( HashColumns?.find((hashColumnName) => hashColumnName === Name), ); @@ -109,15 +108,15 @@ function prepareColumnTableSchema(data: TColumnTableDescription = {}): SchemaDat return { id: Id, name: Name, - isKeyColumn, + keyColumnIndex, isPartitioningKeyColumn, type: Type, notNull: NotNull, }; }); - const keyColumns = preparedColumns?.filter((column) => column.isKeyColumn) || []; - const otherColumns = preparedColumns?.filter((column) => !column.isKeyColumn) || []; + const keyColumns = preparedColumns?.filter((column) => column.keyColumnIndex !== -1) || []; + const otherColumns = preparedColumns?.filter((column) => column.keyColumnIndex === -1) || []; return [...keyColumns, ...otherColumns]; } diff --git a/src/containers/Tenant/Schema/SchemaViewer/types.ts b/src/containers/Tenant/Schema/SchemaViewer/types.ts index a4ddb4e552..3ed84ffff9 100644 --- a/src/containers/Tenant/Schema/SchemaViewer/types.ts +++ b/src/containers/Tenant/Schema/SchemaViewer/types.ts @@ -3,7 +3,7 @@ import type {Column} from '@gravity-ui/react-data-table'; export interface SchemaData { id?: number; name?: string; - isKeyColumn?: boolean; + keyColumnIndex?: number; isPartitioningKeyColumn?: boolean; type?: string; notNull?: boolean; diff --git a/src/containers/Tenant/Schema/SchemaViewer/utils.ts b/src/containers/Tenant/Schema/SchemaViewer/utils.ts index 01ad028b9d..87ad817d89 100644 --- a/src/containers/Tenant/Schema/SchemaViewer/utils.ts +++ b/src/containers/Tenant/Schema/SchemaViewer/utils.ts @@ -7,5 +7,8 @@ export function getPartitioningKeys(tableData: SchemaData[]): string[] { } export function getPrimaryKeys(tableData: SchemaData[]): string[] { - return tableData.filter((row) => row.isKeyColumn && row.name).map((row) => row.name!); + return tableData + .filter((row) => row.keyColumnIndex !== undefined && row.keyColumnIndex !== -1 && row.name) + .sort((column1, column2) => column1.keyColumnIndex! - column2.keyColumnIndex!) + .map((row) => row.name!); } diff --git a/src/types/api/schema/columnEntity.ts b/src/types/api/schema/columnEntity.ts index 2842ae2d8e..4657aca29f 100644 --- a/src/types/api/schema/columnEntity.ts +++ b/src/types/api/schema/columnEntity.ts @@ -75,6 +75,7 @@ interface TTtl { interface TColumnTableSchema { Columns?: TOlapColumnDescription[]; KeyColumnNames?: string[]; + KeyColumnIds?: number[]; Engine?: EColumnTableEngine; NextColumnId?: number; diff --git a/src/types/api/schema/tableIndex.ts b/src/types/api/schema/tableIndex.ts index c54276a5aa..655c8292bc 100644 --- a/src/types/api/schema/tableIndex.ts +++ b/src/types/api/schema/tableIndex.ts @@ -8,6 +8,8 @@ export interface TIndexDescription { KeyColumnNames?: string[]; + KeyColumnIds?: number[]; + /** uint64 */ SchemaVersion?: string;