Skip to content

Commit f1266f7

Browse files
authored
feat: vector index parameters on Info tab (#2862)
1 parent acbff26 commit f1266f7

File tree

6 files changed

+155
-19
lines changed

6 files changed

+155
-19
lines changed

src/components/InfoViewer/formatters/schema.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {TIndexDescription} from '../../../types/api/schema';
22
import {toFormattedSize} from '../../FormattedBytes/utils';
3+
import i18n from '../schemaInfo/i18n';
34
import {createInfoFormatter} from '../utils';
45

56
export const formatTableIndexItem = createInfoFormatter<TIndexDescription>({
@@ -11,7 +12,8 @@ export const formatTableIndexItem = createInfoFormatter<TIndexDescription>({
1112
DataSize: toFormattedSize,
1213
},
1314
labels: {
14-
KeyColumnNames: 'Columns',
15-
DataColumnNames: 'Includes',
15+
KeyColumnNames: i18n('field_columns'),
16+
DataColumnNames: i18n('field_includes'),
17+
DataSize: i18n('field_data-size'),
1618
},
1719
});
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
import type {InfoViewerItem} from '..';
22
import {InfoViewer} from '..';
33
import {getEntityName} from '../../../containers/Tenant/utils';
4-
import type {TEvDescribeSchemeResult, TIndexDescription} from '../../../types/api/schema';
5-
import {formatTableIndexItem} from '../formatters';
4+
import type {TEvDescribeSchemeResult} from '../../../types/api/schema';
65

7-
const DISPLAYED_FIELDS: Set<keyof TIndexDescription> = new Set([
8-
'Type',
9-
'State',
10-
'DataSize',
11-
'KeyColumnNames',
12-
'DataColumnNames',
13-
]);
6+
import i18n from './i18n';
7+
import {buildIndexInfo, buildVectorIndexInfo} from './utils';
148

159
interface TableIndexInfoProps {
1610
data?: TEvDescribeSchemeResult;
@@ -20,18 +14,24 @@ export const TableIndexInfo = ({data}: TableIndexInfoProps) => {
2014
const entityName = getEntityName(data?.PathDescription);
2115

2216
if (!data) {
23-
return <div className="error">No {entityName} data</div>;
17+
return <div className="error">{i18n('alert_no-entity-data', {entity: entityName})}</div>;
2418
}
2519

2620
const TableIndex = data.PathDescription?.TableIndex;
27-
const info: Array<InfoViewerItem> = [];
21+
const info: Array<InfoViewerItem> = buildIndexInfo(TableIndex);
2822

29-
let key: keyof TIndexDescription;
30-
for (key in TableIndex) {
31-
if (DISPLAYED_FIELDS.has(key)) {
32-
info.push(formatTableIndexItem(key, TableIndex?.[key]));
33-
}
23+
const vectorSettings = TableIndex?.VectorIndexKmeansTreeDescription?.Settings;
24+
25+
if (!vectorSettings) {
26+
return <InfoViewer title={entityName} info={info} />;
3427
}
3528

36-
return <InfoViewer title={entityName} info={info} />;
29+
const vectorInfo: Array<InfoViewerItem> = buildVectorIndexInfo(vectorSettings);
30+
31+
return (
32+
<>
33+
<InfoViewer title={entityName} info={info} />
34+
<InfoViewer title={i18n('title_vector-index')} info={vectorInfo} />
35+
</>
36+
);
3737
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"title_vector-index": "Vector Index",
3+
"field_clusters": "Clusters",
4+
"field_levels": "Levels",
5+
"field_vector-dimension": "Vector Dimension",
6+
"field_vector-type": "Vector Type",
7+
"field_metric": "Metric",
8+
"field_columns": "Columns",
9+
"field_includes": "Includes",
10+
"field_data-size": "Data Size",
11+
"alert_no-entity-data": "No {{entity}} data"
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {registerKeysets} from '../../../../utils/i18n';
2+
3+
import en from './en.json';
4+
5+
const COMPONENT = 'info-viewer-schema-index-info';
6+
7+
export default registerKeysets(COMPONENT, {en});
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import type {TIndexDescription} from '../../../types/api/schema';
2+
import type {
3+
TVectorIndexKmeansTreeDescriptionSettings,
4+
TVectorIndexKmeansTreeDescriptionSettingsInner,
5+
} from '../../../types/api/schema/tableIndex';
6+
import {formatNumber} from '../../../utils/dataFormatters/dataFormatters';
7+
import type {InfoViewerItem} from '../InfoViewer';
8+
import {formatTableIndexItem} from '../formatters';
9+
import {createInfoFormatter} from '../utils';
10+
11+
import i18n from './i18n';
12+
13+
const DISPLAYED_FIELDS_KEYS = [
14+
'Type',
15+
'State',
16+
'DataSize',
17+
'KeyColumnNames',
18+
'DataColumnNames',
19+
] as const;
20+
type DisplayedIndexField = (typeof DISPLAYED_FIELDS_KEYS)[number];
21+
22+
export function getDisplayedIndexFields(): ReadonlySet<DisplayedIndexField> {
23+
return new Set<DisplayedIndexField>(DISPLAYED_FIELDS_KEYS);
24+
}
25+
26+
export function buildIndexInfo(tableIndex?: TIndexDescription): InfoViewerItem[] {
27+
const info: InfoViewerItem[] = [];
28+
if (!tableIndex) {
29+
return info;
30+
}
31+
32+
getDisplayedIndexFields().forEach((key) => {
33+
const value = tableIndex[key];
34+
if (value !== undefined) {
35+
info.push(formatTableIndexItem(key, value));
36+
}
37+
});
38+
39+
return info;
40+
}
41+
42+
type VectorSettings = TVectorIndexKmeansTreeDescriptionSettings;
43+
44+
export function buildVectorIndexInfo(vectorSettings?: VectorSettings): InfoViewerItem[] {
45+
const info: InfoViewerItem[] = [];
46+
if (!vectorSettings) {
47+
return info;
48+
}
49+
50+
const vectorFormatter = createInfoFormatter<Pick<VectorSettings, 'clusters' | 'levels'>>({
51+
values: {
52+
clusters: (v) => (typeof v === 'number' ? formatNumber(v) : v),
53+
levels: (v) => (typeof v === 'number' ? formatNumber(v) : v),
54+
},
55+
labels: {
56+
clusters: i18n('field_clusters'),
57+
levels: i18n('field_levels'),
58+
},
59+
});
60+
61+
const settingsFormatter = createInfoFormatter<TVectorIndexKmeansTreeDescriptionSettingsInner>({
62+
values: {
63+
vector_dimension: (v) => (typeof v === 'number' ? formatNumber(v) : v),
64+
},
65+
labels: {
66+
vector_dimension: i18n('field_vector-dimension'),
67+
vector_type: i18n('field_vector-type'),
68+
metric: i18n('field_metric'),
69+
},
70+
});
71+
72+
const {clusters, levels, settings} = vectorSettings ?? {};
73+
if (clusters !== undefined) {
74+
info.push(vectorFormatter('clusters', clusters));
75+
}
76+
if (levels !== undefined) {
77+
info.push(vectorFormatter('levels', levels));
78+
}
79+
80+
const {vector_dimension: vectorDimension, vector_type: vectorType, metric} = settings ?? {};
81+
82+
if (vectorDimension !== undefined) {
83+
info.push(settingsFormatter('vector_dimension', vectorDimension));
84+
}
85+
if (vectorType !== undefined) {
86+
info.push(settingsFormatter('vector_type', vectorType));
87+
}
88+
if (metric !== undefined) {
89+
info.push(settingsFormatter('metric', metric));
90+
}
91+
92+
return info;
93+
}

src/types/api/schema/tableIndex.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,18 @@ export interface TIndexDescription {
1919
DataColumnNames?: string[];
2020
/** uint64 */
2121
DataSize?: string;
22+
23+
/**
24+
* Present for vector indexes of type EIndexTypeGlobalVectorKmeansTree
25+
*/
26+
VectorIndexKmeansTreeDescription?: TVectorIndexKmeansTreeDescription;
2227
}
2328

2429
enum EIndexType {
2530
EIndexTypeInvalid = 'EIndexTypeInvalid',
2631
EIndexTypeGlobal = 'EIndexTypeGlobal',
2732
EIndexTypeGlobalAsync = 'EIndexTypeGlobalAsync',
33+
EIndexTypeGlobalVectorKmeansTree = 'EIndexTypeGlobalVectorKmeansTree',
2834
}
2935

3036
enum EIndexState {
@@ -33,3 +39,19 @@ enum EIndexState {
3339
EIndexStateNotReady = 'EIndexStateNotReady',
3440
EIndexStateWriteOnly = 'EIndexStateWriteOnly',
3541
}
42+
43+
export interface TVectorIndexKmeansTreeDescriptionSettingsInner {
44+
vector_dimension?: number;
45+
vector_type?: string;
46+
metric?: string;
47+
}
48+
49+
export interface TVectorIndexKmeansTreeDescriptionSettings {
50+
clusters?: number;
51+
levels?: number;
52+
settings?: TVectorIndexKmeansTreeDescriptionSettingsInner;
53+
}
54+
55+
export interface TVectorIndexKmeansTreeDescription {
56+
Settings?: TVectorIndexKmeansTreeDescriptionSettings;
57+
}

0 commit comments

Comments
 (0)