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()));