This is an automated email from the ASF dual-hosted git repository. leezng pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new 435eb7147 [INLONG-5814][Dashboard] Supports setting the precision of a field when adding a table field (#6135) 435eb7147 is described below commit 435eb71475662823b9f7b6e5ca500bbc13c97923 Author: Lizhen <88174078+bluew...@users.noreply.github.com> AuthorDate: Wed Oct 12 15:54:11 2022 +0800 [INLONG-5814][Dashboard] Supports setting the precision of a field when adding a table field (#6135) --- inlong-dashboard/src/metas/sinks/greenplum.tsx | 84 +++++++++++++++--------- inlong-dashboard/src/metas/sinks/oracle.tsx | 75 +++++++++++++-------- inlong-dashboard/src/metas/sinks/postgreSql.tsx | 83 +++++++++++++++--------- inlong-dashboard/src/metas/sinks/sqlServer.tsx | 86 ++++++++++++++++--------- 4 files changed, 209 insertions(+), 119 deletions(-) diff --git a/inlong-dashboard/src/metas/sinks/greenplum.tsx b/inlong-dashboard/src/metas/sinks/greenplum.tsx index aff09821c..8af638901 100644 --- a/inlong-dashboard/src/metas/sinks/greenplum.tsx +++ b/inlong-dashboard/src/metas/sinks/greenplum.tsx @@ -20,35 +20,40 @@ import type { FieldItemType } from '@/metas/common'; import EditableTable from '@/components/EditableTable'; import { sourceFields } from './common/sourceFields'; -const greenplumFieldTypes = [ - 'SMALLINT', - 'INT2', - 'SMALLSERIAL', - 'SERIAL', - 'SERIAL2', - 'INTEGER', - 'BIGINT', - 'BIGSERIAL', - 'REAL', - 'FLOAT4', - 'FLOAT8', - 'DOUBLE', - 'NUMERIC', - 'DECIMAL', - 'BOOLEAN', - 'DATE', - 'TIME', - 'TIMESTAMP', - 'CHAR', - 'CHARACTER', - 'VARCHAR', - 'TEXT', - 'BYTEA', - // 'interval', -].map(item => ({ - label: item, - value: item, -})); +const fieldTypesConf = { + SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + INT2: () => '', + SMALLSERIAL: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + SERIAL: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + SERIAL2: () => '', + INTEGER: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + BIGINT: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + BIGSERIAL: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + REAL: () => '', + FLOAT4: () => '', + FLOAT8: () => '', + DOUBLE: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + NUMERIC: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + DECIMAL: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + BOOLEAN: () => '', + DATE: () => '', + TIME: () => '', + TIMESTAMP: () => '', + CHAR: (m, d) => (1 <= m && m <= 255 ? '' : '1 <= M <= 255'), + CHARACTER: (m, d) => (1 <= m && m <= 255 ? '' : '1 <= M <= 255'), + VARCHAR: (m, d) => (1 <= m && m <= 255 ? '' : '1 <= M <= 255'), + TEXT: () => '', + BYTEA: () => '', +}; + +const greenplumFieldTypes = Object.keys(fieldTypesConf).reduce( + (acc, key) => + acc.concat({ + label: key, + value: key, + }), + [], +); export const greenplum: FieldItemType[] = [ { @@ -154,12 +159,29 @@ const getFieldListColumns = sinkValues => { title: `GREENPLUM${i18n.t('meta.Sinks.Greenplum.FieldType')}`, dataIndex: 'fieldType', initialValue: greenplumFieldTypes[0].value, - type: 'select', + type: 'autocomplete', props: (text, record, idx, isNew) => ({ options: greenplumFieldTypes, disabled: [110, 130].includes(sinkValues?.status as number) && !isNew, }), - rules: [{ required: true }], + rules: [ + { required: true }, + () => ({ + validator(_, val) { + if (val) { + const [, type = val, typeLength = ''] = val.match(/^(.+)\((.+)\)$/) || []; + if (fieldTypesConf.hasOwnProperty(type)) { + const [m = -1, d = -1] = typeLength.split(','); + const errMsg = fieldTypesConf[type]?.(m, d); + if (typeLength && errMsg) return Promise.reject(new Error(errMsg)); + } else { + return Promise.reject(new Error('FieldType error')); + } + } + return Promise.resolve(); + }, + }), + ], }, { title: i18n.t('meta.Sinks.Greenplum.IsMetaField'), diff --git a/inlong-dashboard/src/metas/sinks/oracle.tsx b/inlong-dashboard/src/metas/sinks/oracle.tsx index 05e9ec4ce..495ac91c8 100644 --- a/inlong-dashboard/src/metas/sinks/oracle.tsx +++ b/inlong-dashboard/src/metas/sinks/oracle.tsx @@ -20,30 +20,36 @@ import type { FieldItemType } from '@/metas/common'; import EditableTable from '@/components/EditableTable'; import { sourceFields } from './common/sourceFields'; -const oracleFieldTypes = [ - 'BINARY_FLOAT', - 'BINARY_DOUBLE', - 'SMALLINT', - 'FLOAT', - 'FLOAT4', - 'FLOAT8', - 'DOUBLE', - 'REAL', - 'NUMBER', - 'NUMERIC', - 'DATE', - 'DECIMAL', - 'BOOLEAN', - 'TIMESTAMP', - 'CHAR', - 'VARCHAR', - 'CLOB', - 'RAW', - 'BLOB', -].map(item => ({ - label: item, - value: item, -})); +const fieldTypesConf = { + BINARY_FLOAT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + BINARY_DOUBLE: (m, d) => (1 <= m && m <= 10 ? '' : '1 <= M <= 10'), + SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + FLOAT: (m, d) => (1 <= m && m <= 126 ? '' : '1 <= M <= 126'), + FLOAT4: () => '', + FLOAT8: () => '', + DOUBLE: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + REAL: () => '', + NUMBER: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + NUMERIC: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + DATE: () => '', + DECIMAL: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + BOOLEAN: () => '', + TIMESTAMP: () => '', + CHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + VARCHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + CLOB: () => '', + RAW: (m, d) => (1 <= m && m <= 2000 ? '' : ' 1 <= M <= 2000'), + BLOB: () => '', +}; + +const oracleFieldTypes = Object.keys(fieldTypesConf).reduce( + (acc, key) => + acc.concat({ + label: key, + value: key, + }), + [], +); export const oracle: FieldItemType[] = [ { @@ -149,12 +155,29 @@ const getFieldListColumns = sinkValues => { title: `ORACLE${i18n.t('meta.Sinks.Oracle.FieldType')}`, dataIndex: 'fieldType', initialValue: oracleFieldTypes[0].value, - type: 'select', + type: 'autocomplete', props: (text, record, idx, isNew) => ({ options: oracleFieldTypes, disabled: [110, 130].includes(sinkValues?.status as number) && !isNew, }), - rules: [{ required: true }], + rules: [ + { required: true }, + () => ({ + validator(_, val) { + if (val) { + const [, type = val, typeLength = ''] = val.match(/^(.+)\((.+)\)$/) || []; + if (fieldTypesConf.hasOwnProperty(type)) { + const [m = -1, d = -1] = typeLength.split(','); + const errMsg = fieldTypesConf[type]?.(m, d); + if (typeLength && errMsg) return Promise.reject(new Error(errMsg)); + } else { + return Promise.reject(new Error('FieldType error')); + } + } + return Promise.resolve(); + }, + }), + ], }, { title: i18n.t('meta.Sinks.Oracle.IsMetaField'), diff --git a/inlong-dashboard/src/metas/sinks/postgreSql.tsx b/inlong-dashboard/src/metas/sinks/postgreSql.tsx index ca27d07a0..dcac339c3 100644 --- a/inlong-dashboard/src/metas/sinks/postgreSql.tsx +++ b/inlong-dashboard/src/metas/sinks/postgreSql.tsx @@ -20,34 +20,40 @@ import type { FieldItemType } from '@/metas/common'; import EditableTable from '@/components/EditableTable'; import { sourceFields } from './common/sourceFields'; -const postgreSqlFieldTypes = [ - 'SMALLINT', - 'INT2', - 'SMALLSERIAL', - 'SERIAL2', - 'INTEGER', - 'SERIAL', - 'BIGINT', - 'BIGSERIAL', - 'REAL', - 'FLOAT4', - 'FLOAT8', - 'DOUBLE', - 'NUMERIC', - 'DECIMAL', - 'BOOLEAN', - 'DATE', - 'TIME', - 'TIMESTAMP', - 'CHAR', - 'CHARACTER', - 'VARCHAR', - 'TEXT', - 'BYTEA', -].map(item => ({ - label: item, - value: item, -})); +const fieldTypesConf = { + SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + INT2: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + SMALLSERIAL: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + SERIAL2: () => '', + INTEGER: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + SERIAL: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + BIGINT: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + BIGSERIAL: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + REAL: (m, d) => (1 <= m && m <= 24 ? '' : '1 <= M <= 24'), + FLOAT4: (m, d) => (1 <= m && m <= 24 ? '' : '1 <= M <= 24'), + FLOAT8: (m, d) => (24 < m && m <= 53 ? '' : '24 < M <= 53'), + DOUBLE: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + NUMERIC: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + DECIMAL: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + BOOLEAN: () => '', + DATE: () => '', + TIME: () => '', + TIMESTAMP: () => '', + CHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + CHARACTER: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + VARCHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + TEXT: () => '', + BYTEA: () => '', +}; + +const postgreSqlFieldTypes = Object.keys(fieldTypesConf).reduce( + (acc, key) => + acc.concat({ + label: key, + value: key, + }), + [], +); export const postgreSql: FieldItemType[] = [ { @@ -162,12 +168,29 @@ const getFieldListColumns = sinkValues => { title: `POSTGRESQL${i18n.t('meta.Sinks.PostgreSQL.FieldType')}`, dataIndex: 'fieldType', initialValue: postgreSqlFieldTypes[0].value, - type: 'select', + type: 'autocomplete', props: (text, record, idx, isNew) => ({ options: postgreSqlFieldTypes, disabled: [110, 130].includes(sinkValues?.status as number) && !isNew, }), - rules: [{ required: true }], + rules: [ + { required: true }, + () => ({ + validator(_, val) { + if (val) { + const [, type = val, typeLength = ''] = val.match(/^(.+)\((.+)\)$/) || []; + if (fieldTypesConf.hasOwnProperty(type)) { + const [m = -1, d = -1] = typeLength.split(','); + const errMsg = fieldTypesConf[type]?.(m, d); + if (typeLength && errMsg) return Promise.reject(new Error(errMsg)); + } else { + return Promise.reject(new Error('FieldType error')); + } + } + return Promise.resolve(); + }, + }), + ], }, { title: i18n.t('meta.Sinks.PostgreSQL.IsMetaField'), diff --git a/inlong-dashboard/src/metas/sinks/sqlServer.tsx b/inlong-dashboard/src/metas/sinks/sqlServer.tsx index 3a7c1fe18..108f20ac6 100644 --- a/inlong-dashboard/src/metas/sinks/sqlServer.tsx +++ b/inlong-dashboard/src/metas/sinks/sqlServer.tsx @@ -20,36 +20,41 @@ import type { FieldItemType } from '@/metas/common'; import EditableTable from '@/components/EditableTable'; import { sourceFields } from './common/sourceFields'; -const sqlserverFieldTypes = [ - 'char', - 'varchar', - 'nchar', - 'nvarchar', - 'text', - 'ntext', - 'xml', - 'BIGINT', - 'BIGSERIAL', - 'decimal', - 'money', - 'smallmoney', - 'numeric', - 'float', - 'real', - 'bit', - 'int', - 'tinyint', - 'smallint', - 'bigint', - 'time', - 'datetime', - 'datetime2', - 'smalldatetime', - 'datetimeoffset', -].map(item => ({ - label: item, - value: item, -})); +const fieldTypesConf = { + CHAR: (m, d) => (1 <= m && m <= 8000 ? '' : '1 <= M <= 8000'), + VARCHAR: (m, d) => (1 <= m && m <= 8000 ? '' : '1 <= M<= 8000'), + NCHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + NVARCHAR: (m, d) => (1 <= m && m <= 4000 ? '' : '1 <= M <= 4000'), + TEXT: () => '', + NTEXT: () => '', + XML: () => '', + BIGINT: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + BIGSERIAL: (m, d) => (1 <= m && m <= 20 ? '' : '1 <= M <= 20'), + DECIMAL: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D < M'), + MONEY: (m, d) => (1 <= m && m <= 15 && 1 <= d && d <= 4 ? '' : '1 <= M <= 15, 1 <= D <= 4'), + SMALLMONEY: (m, d) => (1 <= m && m <= 7 && 1 <= d && d <= 4 ? '' : '1 <= M <= 7, 1 <= D <= 4'), + NUMERIC: (m, d) => (1 <= m && m <= 38 && 0 <= d && d < m ? '' : '1 <= M <= 38, 0 <= D <= M'), + FLOAT: (m, d) => (1 <= m && m <= 24 ? '' : '1 <= M <= 24'), + REAL: (m, d) => (1 <= m && m <= 24 ? '' : '1 <= M <= 24'), + BIT: (m, d) => (1 <= m && m <= 64 ? '' : '1 <= M <= 64'), + INT: (m, d) => (1 <= m && m <= 11 ? '' : '1 <= M <= 11'), + TINYINT: (m, d) => (1 <= m && m <= 4 ? '' : '1 <= M <= 4'), + SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'), + TIME: () => '', + DATETIME: () => '', + DATETIME2: () => '', + SMALLDATETIME: () => '', + DATETIMEOFFSET: () => '', +}; + +const sqlserverFieldTypes = Object.keys(fieldTypesConf).reduce( + (acc, key) => + acc.concat({ + label: key, + value: key, + }), + [], +); export const sqlServer: FieldItemType[] = [ { @@ -195,12 +200,29 @@ const getFieldListColumns = sinkValues => { title: `SQLSERVER${i18n.t('meta.Sinks.SQLServer.FieldType')}`, dataIndex: 'fieldType', initialValue: sqlserverFieldTypes[0].value, - type: 'select', + type: 'autocomplete', props: (text, record, idx, isNew) => ({ options: sqlserverFieldTypes, disabled: [110, 130].includes(sinkValues?.status as number) && !isNew, }), - rules: [{ required: true }], + rules: [ + { required: true }, + () => ({ + validator(_, val) { + if (val) { + const [, type = val, typeLength = ''] = val.match(/^(.+)\((.+)\)$/) || []; + if (fieldTypesConf.hasOwnProperty(type)) { + const [m = -1, d = -1] = typeLength.split(','); + const errMsg = fieldTypesConf[type]?.(m, d); + if (typeLength && errMsg) return Promise.reject(new Error(errMsg)); + } else { + return Promise.reject(new Error('FieldType error')); + } + } + return Promise.resolve(); + }, + }), + ], }, { title: i18n.t('meta.Sinks.SQLServer.IsMetaField'),