You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/11/08 08:05:00 UTC
[shardingsphere] branch master updated: Refactor ColumnValueReader impl (#22009)
This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new b2748aa0368 Refactor ColumnValueReader impl (#22009)
b2748aa0368 is described below
commit b2748aa0368b3a80f9522c809217aa3b752a5087
Author: Hongsheng Zhong <zh...@apache.org>
AuthorDate: Tue Nov 8 16:04:49 2022 +0800
Refactor ColumnValueReader impl (#22009)
---
.../spi/ingest/dumper/ColumnValueReader.java | 3 ++-
...eReader.java => AbstractColumnValueReader.java} | 12 +++++----
.../ingest/dumper/ColumnValueReaderFactory.java | 6 ++---
.../ingest/dumper/DefaultColumnValueReader.java} | 29 +++++++++-------------
...ta.pipeline.spi.ingest.dumper.ColumnValueReader | 18 ++++++++++++++
.../mysql/ingest/MySQLColumnValueReader.java | 13 +++++-----
.../ingest/PostgreSQLColumnValueReader.java | 18 ++++++--------
.../dumper/ColumnValueReaderFactoryTest.java | 4 +--
8 files changed, 57 insertions(+), 46 deletions(-)
diff --git a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java b/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java
index 1c5861cbfad..f7e3d6aa7b3 100644
--- a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java
+++ b/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.data.pipeline.spi.ingest.dumper;
import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.infra.util.spi.type.required.RequiredSPI;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.sql.ResultSet;
@@ -28,7 +29,7 @@ import java.sql.SQLException;
* Column value reader.
*/
@SingletonSPI
-public interface ColumnValueReader extends TypedSPI {
+public interface ColumnValueReader extends TypedSPI, RequiredSPI {
/**
* Read column value.
diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/BasicColumnValueReader.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/AbstractColumnValueReader.java
similarity index 84%
rename from kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/BasicColumnValueReader.java
rename to kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/AbstractColumnValueReader.java
index 90af92d8b51..6342b8c6e34 100644
--- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/BasicColumnValueReader.java
+++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/AbstractColumnValueReader.java
@@ -25,17 +25,19 @@ import java.sql.SQLException;
import java.sql.Types;
/**
- * Basic column value reader.
+ * Abstract column value reader.
*/
-public class BasicColumnValueReader implements ColumnValueReader {
+public abstract class AbstractColumnValueReader implements ColumnValueReader {
@Override
- public Object readValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
- Object result = readValue0(resultSet, metaData, columnIndex);
+ public final Object readValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ Object result = doReadValue(resultSet, metaData, columnIndex);
return resultSet.wasNull() ? null : result;
}
- private Object readValue0(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ protected abstract Object doReadValue(ResultSet resultSet, ResultSetMetaData metaData, int columnIndex) throws SQLException;
+
+ protected final Object defaultDoReadValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
int columnType = metaData.getColumnType(columnIndex);
switch (columnType) {
case Types.BOOLEAN:
diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactory.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactory.java
index 9e8969165fe..f9a5b713009 100644
--- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactory.java
+++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactory.java
@@ -21,10 +21,9 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.data.pipeline.spi.ingest.dumper.ColumnValueReader;
import org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.util.spi.type.required.RequiredSPIRegistry;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPIRegistry;
-import java.util.Optional;
-
/**
* Column value reader factory.
*/
@@ -42,7 +41,6 @@ public final class ColumnValueReaderFactory {
* @return column value reader
*/
public static ColumnValueReader getInstance(final String databaseType) {
- Optional<ColumnValueReader> result = TypedSPIRegistry.findRegisteredService(ColumnValueReader.class, databaseType);
- return result.orElseGet(BasicColumnValueReader::new);
+ return TypedSPIRegistry.findRegisteredService(ColumnValueReader.class, databaseType).orElseGet(() -> RequiredSPIRegistry.getRegisteredService(ColumnValueReader.class));
}
}
diff --git a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/DefaultColumnValueReader.java
similarity index 57%
copy from kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java
copy to kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/DefaultColumnValueReader.java
index 1c5861cbfad..37c03115492 100644
--- a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/ingest/dumper/ColumnValueReader.java
+++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/DefaultColumnValueReader.java
@@ -15,29 +15,24 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.data.pipeline.spi.ingest.dumper;
-
-import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
+package org.apache.shardingsphere.data.pipeline.core.ingest.dumper;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
- * Column value reader.
+ * Default column value reader.
*/
-@SingletonSPI
-public interface ColumnValueReader extends TypedSPI {
+public final class DefaultColumnValueReader extends AbstractColumnValueReader {
+
+ @Override
+ protected Object doReadValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ return super.defaultDoReadValue(resultSet, metaData, columnIndex);
+ }
- /**
- * Read column value.
- *
- * @param resultSet result set
- * @param resultSetMetaData result set meta data
- * @param columnIndex column index
- * @return column value
- * @throws SQLException from database
- */
- Object readValue(ResultSet resultSet, ResultSetMetaData resultSetMetaData, int columnIndex) throws SQLException;
+ @Override
+ public boolean isDefault() {
+ return true;
+ }
}
diff --git a/kernel/data-pipeline/core/src/main/resources/META-INF/services/org.apache.shardingsphere.data.pipeline.spi.ingest.dumper.ColumnValueReader b/kernel/data-pipeline/core/src/main/resources/META-INF/services/org.apache.shardingsphere.data.pipeline.spi.ingest.dumper.ColumnValueReader
new file mode 100644
index 00000000000..3ec8c078164
--- /dev/null
+++ b/kernel/data-pipeline/core/src/main/resources/META-INF/services/org.apache.shardingsphere.data.pipeline.spi.ingest.dumper.ColumnValueReader
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.data.pipeline.core.ingest.dumper.DefaultColumnValueReader
diff --git a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/MySQLColumnValueReader.java b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/MySQLColumnValueReader.java
index 61269a69e97..2c929859ab0 100644
--- a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/MySQLColumnValueReader.java
+++ b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/MySQLColumnValueReader.java
@@ -17,7 +17,7 @@
package org.apache.shardingsphere.data.pipeline.mysql.ingest;
-import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.BasicColumnValueReader;
+import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.AbstractColumnValueReader;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
@@ -26,17 +26,16 @@ import java.sql.SQLException;
/**
* Column value reader for MySQL.
*/
-public final class MySQLColumnValueReader extends BasicColumnValueReader {
+public final class MySQLColumnValueReader extends AbstractColumnValueReader {
private static final String YEAR_DATA_TYPE = "YEAR";
@Override
- public Object readValue(final ResultSet resultSet, final ResultSetMetaData resultSetMetaData, final int columnIndex) throws SQLException {
- if (isYearDataType(resultSetMetaData.getColumnTypeName(columnIndex))) {
- Object result = resultSet.getObject(columnIndex);
- return resultSet.wasNull() ? null : result;
+ protected Object doReadValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ if (isYearDataType(metaData.getColumnTypeName(columnIndex))) {
+ return resultSet.getObject(columnIndex);
}
- return super.readValue(resultSet, resultSetMetaData, columnIndex);
+ return super.defaultDoReadValue(resultSet, metaData, columnIndex);
}
private boolean isYearDataType(final String columnDataTypeName) {
diff --git a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/PostgreSQLColumnValueReader.java b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/PostgreSQLColumnValueReader.java
index 4cded45e0a6..a84844018bb 100644
--- a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/PostgreSQLColumnValueReader.java
+++ b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/PostgreSQLColumnValueReader.java
@@ -17,10 +17,9 @@
package org.apache.shardingsphere.data.pipeline.postgresql.ingest;
-import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.BasicColumnValueReader;
+import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.AbstractColumnValueReader;
import org.postgresql.util.PGobject;
-import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
@@ -31,7 +30,7 @@ import java.util.Collections;
/**
* Column value reader for PostgreSQL.
*/
-public final class PostgreSQLColumnValueReader extends BasicColumnValueReader {
+public final class PostgreSQLColumnValueReader extends AbstractColumnValueReader {
private static final Collection<String> TYPE_ALIASES = Collections.singletonList("openGauss");
@@ -40,19 +39,18 @@ public final class PostgreSQLColumnValueReader extends BasicColumnValueReader {
private static final String PG_BIT_TYPE = "bit";
@Override
- public Object readValue(final ResultSet resultSet, final ResultSetMetaData resultSetMetaData, final int columnIndex) throws SQLException {
- if (isPgMoneyType(resultSetMetaData, columnIndex)) {
- BigDecimal result = resultSet.getBigDecimal(columnIndex);
- return resultSet.wasNull() ? null : result;
+ protected Object doReadValue(final ResultSet resultSet, final ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ if (isPgMoneyType(metaData, columnIndex)) {
+ return resultSet.getBigDecimal(columnIndex);
}
- if (isPgBitType(resultSetMetaData, columnIndex)) {
+ if (isPgBitType(metaData, columnIndex)) {
PGobject result = new PGobject();
result.setType("bit");
Object bitValue = resultSet.getObject(columnIndex);
result.setValue(null == bitValue ? null : (Boolean) bitValue ? "1" : "0");
- return resultSet.wasNull() ? null : result;
+ return result;
}
- return super.readValue(resultSet, resultSetMetaData, columnIndex);
+ return super.defaultDoReadValue(resultSet, metaData, columnIndex);
}
private boolean isPgMoneyType(final ResultSetMetaData resultSetMetaData, final int index) throws SQLException {
diff --git a/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactoryTest.java b/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactoryTest.java
index d7a3e0a5113..f7158ce08e5 100644
--- a/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactoryTest.java
+++ b/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/ColumnValueReaderFactoryTest.java
@@ -34,8 +34,8 @@ public final class ColumnValueReaderFactoryTest {
@Test
public void assertGetInstance() {
Collection<Pair<String, Class<? extends ColumnValueReader>>> paramResult = Arrays.asList(
- Pair.of("MySQL", MySQLColumnValueReader.class),
- Pair.of("PostgreSQL", PostgreSQLColumnValueReader.class), Pair.of("openGauss", PostgreSQLColumnValueReader.class));
+ Pair.of("PostgreSQL", PostgreSQLColumnValueReader.class), Pair.of("openGauss", PostgreSQLColumnValueReader.class),
+ Pair.of("MySQL", MySQLColumnValueReader.class), Pair.of("Oracle", DefaultColumnValueReader.class));
for (Pair<String, Class<? extends ColumnValueReader>> each : paramResult) {
ColumnValueReader actual = ColumnValueReaderFactory.getInstance(each.getKey());
assertThat(actual, instanceOf(each.getValue()));