All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.flink.cdc.common.event.AddColumnEvent Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.flink.cdc.common.event;

import org.apache.flink.cdc.common.annotation.PublicEvolving;
import org.apache.flink.cdc.common.schema.Column;

import javax.annotation.Nullable;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

/**
 * A {@link SchemaChangeEvent} that represents an {@code ADD COLUMN} DDL, which may contain the
 * lenient column type changes.
 */
@PublicEvolving
public final class AddColumnEvent implements SchemaChangeEvent {

    private static final long serialVersionUID = 1L;

    private final TableId tableId;

    private final List addedColumns;

    public AddColumnEvent(TableId tableId, List addedColumns) {
        this.tableId = tableId;
        this.addedColumns = addedColumns;
    }

    public static AddColumnEvent.ColumnWithPosition first(Column addColumn) {
        return new ColumnWithPosition(addColumn, ColumnPosition.FIRST, null);
    }

    public static AddColumnEvent.ColumnWithPosition last(Column addColumn) {
        return new ColumnWithPosition(addColumn, ColumnPosition.LAST, null);
    }

    public static AddColumnEvent.ColumnWithPosition before(
            Column addColumn, String existedColumnName) {
        return new ColumnWithPosition(addColumn, ColumnPosition.BEFORE, existedColumnName);
    }

    public static AddColumnEvent.ColumnWithPosition after(
            Column addColumn, String existedColumnName) {
        return new ColumnWithPosition(addColumn, ColumnPosition.AFTER, existedColumnName);
    }

    /** Returns the added columns. */
    public List getAddedColumns() {
        return addedColumns;
    }

    /** relative Position of column. */
    public enum ColumnPosition implements Serializable {
        BEFORE,
        AFTER,
        FIRST,
        LAST
    }

    /** represents result of an ADD COLUMN DDL that may change column sequence. */
    public static class ColumnWithPosition implements Serializable {

        /** The added column. */
        private final Column addColumn;

        /** The position of the added column. */
        private final ColumnPosition position;

        /** The added column lies in the position relative to this column. */
        private final @Nullable String existedColumnName;

        /** In the default scenario, we add fields at the end of the column. */
        public ColumnWithPosition(Column addColumn) {
            this.addColumn = addColumn;
            position = ColumnPosition.LAST;
            existedColumnName = null;
        }

        public ColumnWithPosition(
                Column addColumn, ColumnPosition position, @Nullable String existedColumnName) {
            this.addColumn = addColumn;
            this.position = position;
            this.existedColumnName = existedColumnName;
        }

        public Column getAddColumn() {
            return addColumn;
        }

        public ColumnPosition getPosition() {
            return position;
        }

        @Nullable
        public String getExistedColumnName() {
            return existedColumnName;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (!(o instanceof ColumnWithPosition)) {
                return false;
            }
            ColumnWithPosition position1 = (ColumnWithPosition) o;
            return Objects.equals(addColumn, position1.addColumn)
                    && position == position1.position
                    && Objects.equals(existedColumnName, position1.existedColumnName);
        }

        @Override
        public int hashCode() {
            return Objects.hash(addColumn, position, existedColumnName);
        }

        @Override
        public String toString() {
            return "ColumnWithPosition{"
                    + "column="
                    + addColumn
                    + ", position="
                    + position
                    + ", existedColumnName="
                    + existedColumnName
                    + '}';
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof AddColumnEvent)) {
            return false;
        }
        AddColumnEvent that = (AddColumnEvent) o;
        return Objects.equals(tableId, that.tableId)
                && Objects.equals(addedColumns, that.addedColumns);
    }

    @Override
    public int hashCode() {
        return Objects.hash(tableId, addedColumns);
    }

    @Override
    public String toString() {
        return "AddColumnEvent{" + "tableId=" + tableId + ", addedColumns=" + addedColumns + '}';
    }

    @Override
    public TableId tableId() {
        return tableId;
    }

    @Override
    public SchemaChangeEventType getType() {
        return SchemaChangeEventType.ADD_COLUMN;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy