Skip to content

Commit c627571

Browse files
committed
feat: vector index parameters on Info tab
1 parent acbff26 commit c627571

File tree

6 files changed

+156
-19
lines changed

6 files changed

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

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)