public void enterColumnDefinition()

in eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/dialect/antlr4/mysql/listener/ColumnDefinitionParserListener.java [89:203]


    public void enterColumnDefinition(ColumnDefinitionContext ctx) {
        // parse Column data type
        this.parser.runIfAllNotNull(() -> {
            DataTypeContext dataTypeContext = ctx.dataType();
            String dataTypeString = null;
            if (dataTypeContext instanceof StringDataTypeContext) {
                StringDataTypeContext stringDataTypeCtx = (StringDataTypeContext) dataTypeContext;
                dataTypeString = stringDataTypeCtx.typeName.getText();
                // parse data type length
                if (stringDataTypeCtx.lengthOneDimension() != null) {
                    this.columnEditor.length(Integer.parseInt(stringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
                }
                // parse data type charset and collation
                String charsetName = parser.parseCharset(stringDataTypeCtx.charsetName());
                String collationName = parser.parseCollation(stringDataTypeCtx.collationName());
                columnEditor.charsetName(charsetName);
                columnEditor.collation(collationName);
            } else if (dataTypeContext instanceof NationalStringDataTypeContext) {
                NationalStringDataTypeContext nationalStringDataTypeCtx = (NationalStringDataTypeContext) dataTypeContext;
                dataTypeString = nationalStringDataTypeCtx.typeName.getText();
                if (nationalStringDataTypeCtx.lengthOneDimension() != null) {
                    this.columnEditor.length(Integer.parseInt(nationalStringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
                }
            } else if (dataTypeContext instanceof NationalVaryingStringDataTypeContext) {
                NationalVaryingStringDataTypeContext nationalVaryingStringDataTypeCtx = (NationalVaryingStringDataTypeContext) dataTypeContext;
                dataTypeString = nationalVaryingStringDataTypeCtx.typeName.getText();
                if (nationalVaryingStringDataTypeCtx.lengthOneDimension() != null) {
                    this.columnEditor.length(Integer.parseInt(nationalVaryingStringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
                }
            } else if (dataTypeContext instanceof DimensionDataTypeContext) {
                DimensionDataTypeContext dimensionDataTypeCtx = (DimensionDataTypeContext) dataTypeContext;
                dataTypeString = dimensionDataTypeCtx.typeName.getText();
                // parse column length
                if (dimensionDataTypeCtx.lengthOneDimension() != null) {
                    this.columnEditor.length(Integer.parseInt(dimensionDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
                }
                // parse column scale if has scale
                if (dimensionDataTypeCtx.lengthTwoDimension() != null) {
                    List<DecimalLiteralContext> decimalLiteralContexts = dimensionDataTypeCtx.lengthTwoDimension().decimalLiteral();
                    this.columnEditor.length(Integer.parseInt(decimalLiteralContexts.get(0).getText()));
                    this.columnEditor.scale(Integer.parseInt(decimalLiteralContexts.get(1).getText()));
                }

                if (dimensionDataTypeCtx.lengthTwoOptionalDimension() != null) {
                    List<DecimalLiteralContext> decimalLiteralContexts = dimensionDataTypeCtx.lengthTwoOptionalDimension().decimalLiteral();
                    if (decimalLiteralContexts.get(0).REAL_LITERAL() != null) {
                        String[] digits = decimalLiteralContexts.get(0).getText().split(".");
                        if (StringUtils.isBlank(digits[0]) || Integer.valueOf(digits[0]) == 0) {
                            this.columnEditor.length(10);
                        } else {
                            this.columnEditor.length(Integer.valueOf(digits[0]));
                        }
                    } else {
                        this.columnEditor.length(Integer.parseInt(decimalLiteralContexts.get(0).getText()));
                    }
                    if (decimalLiteralContexts.size() > 1) {
                        this.columnEditor.scale(Integer.parseInt(decimalLiteralContexts.get(1).getText()));
                    }
                }
                if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.SIGNED())) {
                    this.columnEditor.withOption(MysqlColumnOptions.SIGNED, dimensionDataTypeCtx.SIGNED().get(0).getText());
                }
                if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.UNSIGNED())) {
                    this.columnEditor.withOption(MysqlColumnOptions.UNSIGNED, dimensionDataTypeCtx.UNSIGNED().get(0).getText());
                }
                if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.ZEROFILL())) {
                    this.columnEditor.withOption(MysqlColumnOptions.ZEROFILL, dimensionDataTypeCtx.ZEROFILL().get(0).getText());
                }
            } else if (dataTypeContext instanceof SimpleDataTypeContext) {
                // Do nothing for example: DATE, TINYBLOB, etc.
                SimpleDataTypeContext simpleDataTypeCtx = (SimpleDataTypeContext) dataTypeContext;
                dataTypeString = simpleDataTypeCtx.typeName.getText();
            } else if (dataTypeContext instanceof CollectionDataTypeContext) {
                CollectionDataTypeContext collectionDataTypeContext = (CollectionDataTypeContext) dataTypeContext;
                dataTypeString = collectionDataTypeContext.typeName.getText();
                if (collectionDataTypeContext.charsetName() != null) {
                    String charsetName = collectionDataTypeContext.charsetName().getText();
                    columnEditor.charsetName(charsetName);
                }
            } else if (dataTypeContext instanceof SpatialDataTypeContext) {
                // do nothing
                SpatialDataTypeContext spatialDataTypeCtx = (SpatialDataTypeContext) dataTypeContext;
                dataTypeString = spatialDataTypeCtx.typeName.getText();
            } else if (dataTypeContext instanceof LongVarcharDataTypeContext) {
                LongVarcharDataTypeContext longVarcharDataTypeCtx = (LongVarcharDataTypeContext) dataTypeContext;
                dataTypeString = longVarcharDataTypeCtx.typeName.getText();
                String charsetName = parser.parseCharset(longVarcharDataTypeCtx.charsetName());
                String collationName = parser.parseCollation(longVarcharDataTypeCtx.collationName());
                columnEditor.charsetName(charsetName);
                columnEditor.collation(collationName);
            }
            // handle enum and set type values
            if (StringUtils.equalsAnyIgnoreCase(dataTypeString, "ENUM", "SET")) {
                CollectionDataTypeContext collectionDataTypeContext = (CollectionDataTypeContext) dataTypeContext;
                List<String> values = collectionDataTypeContext.collectionOptions().STRING_LITERAL().stream()
                    .map(node -> JdbcStringUtils.withoutWrapper(node.getText())).collect(Collectors.toList());
                columnEditor.enumValues(values);
            }

            if (StringUtils.isNotBlank(dataTypeString)) {
                EventMeshDataType eventMeshType = this.dataTypeConvertor.toEventMeshType(dataTypeString);
                this.columnEditor.withEventMeshType(eventMeshType);
                this.columnEditor.withJdbcType(this.dataTypeConvertor.toJDBCType(dataTypeString));
                this.columnEditor.withType(dataTypeString);
            }
        }, columnEditor);

        this.parser.runIfAllNotNull(() -> {
            // parse column default value
            ColumnDefinitionParserListener.this.defaultValueParserListener = new DefaultValueParserListener(columnEditor);
            ColumnDefinitionParserListener.this.listeners.add(defaultValueParserListener);
        }, tableEditor, columnEditor);

        super.enterColumnDefinition(ctx);
    }