parent
82a652ca6f
commit
c803f5dad6
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
/**
|
||||
* Class {@code ChangeEvent} represents the change events of external systems, including {@link
|
||||
* DataChangeEvent} and {@link SchemaChangeEvent}.
|
||||
*/
|
||||
@PublicEvolving
|
||||
public interface ChangeEvent extends Event {
|
||||
|
||||
/** Describes the database table corresponding to the occurrence of a change event. */
|
||||
TableId tableId();
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Class {@code DataChangeEvent} represents the data change events of external systems, such as
|
||||
* INSERT, UPDATE, DELETE and so on.
|
||||
*/
|
||||
@PublicEvolving
|
||||
public interface DataChangeEvent extends ChangeEvent {
|
||||
|
||||
/** Describes the record of data before change. */
|
||||
DataRecord before();
|
||||
|
||||
/** Describes the record of data after change. */
|
||||
DataRecord after();
|
||||
|
||||
/** Describes the operation type of the change event. e.g. INSERT, UPDATE, REPLACE, DELETE. */
|
||||
OperationType op();
|
||||
|
||||
/** Optional, describes the metadata of the change event. e.g. MySQL binlog file name, pos. */
|
||||
Map<String, String> meta();
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
/** Class {@code DataRecord} describes the data of changed record in the external system. */
|
||||
@PublicEvolving
|
||||
public interface DataRecord {
|
||||
|
||||
/** Returns the number of fields in this row. */
|
||||
int getArity();
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// Read-only accessor methods
|
||||
// ------------------------------------------------------------------------------------------
|
||||
|
||||
/** Returns true if the field is null at the given position. */
|
||||
boolean isNullAt(int pos);
|
||||
|
||||
/** Returns the boolean value at the given position. */
|
||||
boolean getBoolean(int pos);
|
||||
|
||||
/** Returns the byte value at the given position. */
|
||||
byte getByte(int pos);
|
||||
|
||||
/** Returns the short value at the given position. */
|
||||
short getShort(int pos);
|
||||
|
||||
/** Returns the integer value at the given position. */
|
||||
int getInt(int pos);
|
||||
|
||||
/** Returns the long value at the given position. */
|
||||
long getLong(int pos);
|
||||
|
||||
/** Returns the float value at the given position. */
|
||||
float getFloat(int pos);
|
||||
|
||||
/** Returns the double value at the given position. */
|
||||
double getDouble(int pos);
|
||||
|
||||
/** Returns the string value at the given position. */
|
||||
String getString(int pos);
|
||||
|
||||
/** Returns the binary value at the given position. */
|
||||
byte[] getBinary(int pos);
|
||||
|
||||
// TODO: add more methods for other types
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
/**
|
||||
* Class {@code Event} is the super interface defines the events of external systems flowing into
|
||||
* Flink CDC.
|
||||
*/
|
||||
@PublicEvolving
|
||||
public interface Event {}
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
/**
|
||||
* Enum {@code OperationType} describes the type of operation that the data change event reports.
|
||||
*/
|
||||
@PublicEvolving
|
||||
public enum OperationType {
|
||||
INSERT,
|
||||
UPDATE,
|
||||
REPLACE,
|
||||
DELETE
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
/**
|
||||
* Class {@code SchemaChangeEvent} represents the changes in the table structure of the external
|
||||
* system, such as CREATE, DROP, RENAME and so on.
|
||||
*/
|
||||
@PublicEvolving
|
||||
public interface SchemaChangeEvent extends ChangeEvent {}
|
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* Copyright 2023 Ververica Inc.
|
||||
*
|
||||
* Licensed 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 com.ververica.cdc.common.event;
|
||||
|
||||
import org.apache.flink.annotation.PublicEvolving;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* The unique identifier used to represent the path of external table or external data collection,
|
||||
* all external system data collection could map to a dedicated {@code TableId}.
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@code TableId} contains at most three parts, it will be treated as namespace, schema name
|
||||
* and table name.
|
||||
* <li>{@code TableId} could contain two parts, it will be treated as schema name and table name.
|
||||
* <li>{@code TableId} could contain only one part, it will be treated as table name.
|
||||
* </ul>
|
||||
*
|
||||
* <p>Connectors need to establish the mapping between {@code TableId} and external data collection
|
||||
* object path. For example,
|
||||
*
|
||||
* <ul>
|
||||
* <li>The mapping relationship for Oracle is: (database, schema, table).
|
||||
* <li>The mapping relationship for MySQL or Doris is: (database, table).
|
||||
* <li>The mapping relationship for Kafka is: (topic).
|
||||
* </ul>
|
||||
*/
|
||||
@PublicEvolving
|
||||
public class TableId {
|
||||
|
||||
@Nullable private final String namespace;
|
||||
@Nullable private final String schemaName;
|
||||
private final String tableName;
|
||||
|
||||
private TableId(@Nullable String namespace, @Nullable String schemaName, String tableName) {
|
||||
this.namespace = namespace;
|
||||
this.schemaName = schemaName;
|
||||
this.tableName = Objects.requireNonNull(tableName);
|
||||
}
|
||||
|
||||
/** The mapping relationship for external systems. e.g. Oracle (database, schema, table). */
|
||||
public static TableId tableId(String namespace, String schemaName, String tableName) {
|
||||
return new TableId(
|
||||
Objects.requireNonNull(namespace), Objects.requireNonNull(schemaName), tableName);
|
||||
}
|
||||
|
||||
/** The mapping relationship for external systems. e.g. MySQL (database, table). */
|
||||
public static TableId tableId(String schemaName, String tableName) {
|
||||
return new TableId(null, Objects.requireNonNull(schemaName), tableName);
|
||||
}
|
||||
|
||||
/** The mapping relationship for external systems. e.g. Kafka (topic). */
|
||||
public static TableId tableId(String tableName) {
|
||||
return new TableId(null, null, tableName);
|
||||
}
|
||||
|
||||
public static TableId parse(String tableId) {
|
||||
String[] parts = Objects.requireNonNull(tableId).split("\\.");
|
||||
if (parts.length == 3) {
|
||||
return tableId(parts[0], parts[1], parts[2]);
|
||||
} else if (parts.length == 2) {
|
||||
return tableId(parts[0], parts[1]);
|
||||
} else if (parts.length == 1) {
|
||||
return tableId(parts[0]);
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid tableId: " + tableId);
|
||||
}
|
||||
|
||||
public String identifier() {
|
||||
if (namespace == null || namespace.isEmpty()) {
|
||||
if (schemaName == null || schemaName.isEmpty()) {
|
||||
return tableName;
|
||||
}
|
||||
return schemaName + "." + tableName;
|
||||
}
|
||||
return namespace + "." + schemaName + "." + tableName;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getNamespace() {
|
||||
return namespace;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getSchemaName() {
|
||||
return schemaName;
|
||||
}
|
||||
|
||||
public String getTableName() {
|
||||
return tableName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
TableId that = (TableId) o;
|
||||
return Objects.equals(namespace, that.namespace)
|
||||
&& Objects.equals(schemaName, that.schemaName)
|
||||
&& Objects.equals(tableName, that.tableName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(namespace, schemaName, tableName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return identifier();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue