You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by le...@apache.org on 2022/10/12 07:54:17 UTC
[inlong] branch master updated: [INLONG-5814][Dashboard] Supports setting the precision of a field when adding a table field (#6135)
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 <88...@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'),