This is an automated email from the ASF dual-hosted git repository.
mchades pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 51e42ea79 [#5181] feat(oceanbase-catalog): Add implementation for
converter package (#5182)
51e42ea79 is described below
commit 51e42ea79871be9d03497a9797d649fa415d92ac
Author: yuanoOo <[email protected]>
AuthorDate: Tue Oct 22 17:47:47 2024 +0800
[#5181] feat(oceanbase-catalog): Add implementation for converter package
(#5182)
### What changes were proposed in this pull request?
- Add implementation for converter package:
- `OceanBaseColumnDefaultValueConverter`
- `OceanBaseExceptionConverter`
- `OceanBaseTypeConverter`
### Why are the changes needed?
Fix: #5181
### Does this PR introduce _any_ user-facing change?
no
### How was this patch tested?
Add unit test: `TestOceanBaseTypeConverter`
---
.../jdbc/converter/JdbcExceptionConverter.java | 27 ++++-
.../gravitino/catalog/mysql/MysqlCatalog.java | 7 --
.../mysql/converter/MysqlExceptionConverter.java | 50 ---------
.../catalog/mysql/operation/TestMysql.java | 4 +-
.../catalog/oceanbase/OceanBaseCatalog.java | 7 --
.../OceanBaseColumnDefaultValueConverter.java | 80 +++++++++++++-
.../converter/OceanBaseExceptionConverter.java | 33 ------
.../converter/OceanBaseTypeConverter.java | 116 ++++++++++++++++++++-
.../converter/TestOceanBaseTypeConverter.java | 112 ++++++++++++++++++++
.../catalog/oceanbase/operation/TestOceanBase.java | 4 +-
10 files changed, 328 insertions(+), 112 deletions(-)
diff --git
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
index 7d8e5cc92..716cfc28d 100644
---
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
+++
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
@@ -20,12 +20,18 @@ package org.apache.gravitino.catalog.jdbc.converter;
import java.sql.SQLException;
import org.apache.gravitino.exceptions.GravitinoRuntimeException;
+import org.apache.gravitino.exceptions.NoSuchSchemaException;
+import org.apache.gravitino.exceptions.NoSuchTableException;
+import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
+import org.apache.gravitino.exceptions.TableAlreadyExistsException;
/** Interface for converter JDBC exceptions to Gravitino exceptions. */
-public abstract class JdbcExceptionConverter {
+public class JdbcExceptionConverter {
/**
- * Convert JDBC exception to GravitinoException.
+ * Convert JDBC exception to GravitinoException. The default implementation
of this method is
+ * based on MySQL exception code, and if the catalog does not compatible
with MySQL exception
+ * code, this method needs to be rewritten.
*
* @param sqlException The sql exception to map
* @return The best attempt at a corresponding connector exception or
generic with the
@@ -33,8 +39,19 @@ public abstract class JdbcExceptionConverter {
*/
@SuppressWarnings("FormatStringAnnotation")
public GravitinoRuntimeException toGravitinoException(final SQLException
sqlException) {
- // TODO we need to transform specific SQL exceptions into our own
exceptions, such as
- // SchemaAlreadyExistsException
- return new GravitinoRuntimeException(sqlException,
sqlException.getMessage());
+ switch (sqlException.getErrorCode()) {
+ case 1007:
+ return new SchemaAlreadyExistsException(sqlException,
sqlException.getMessage());
+ case 1050:
+ return new TableAlreadyExistsException(sqlException,
sqlException.getMessage());
+ case 1008:
+ case 1049:
+ return new NoSuchSchemaException(sqlException,
sqlException.getMessage());
+ case 1146:
+ case 1051:
+ return new NoSuchTableException(sqlException,
sqlException.getMessage());
+ default:
+ return new GravitinoRuntimeException(sqlException,
sqlException.getMessage());
+ }
}
}
diff --git
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
index e79a06c15..1cd0667ad 100644
---
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
+++
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
@@ -22,12 +22,10 @@ import java.util.Map;
import org.apache.gravitino.catalog.jdbc.JdbcCatalog;
import
org.apache.gravitino.catalog.jdbc.MySQLProtocolCompatibleCatalogOperations;
import
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations;
import org.apache.gravitino.catalog.jdbc.operation.JdbcTableOperations;
import
org.apache.gravitino.catalog.mysql.converter.MysqlColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.mysql.converter.MysqlExceptionConverter;
import org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter;
import org.apache.gravitino.catalog.mysql.operation.MysqlDatabaseOperations;
import org.apache.gravitino.catalog.mysql.operation.MysqlTableOperations;
@@ -62,11 +60,6 @@ public class MysqlCatalog extends JdbcCatalog {
return new MysqlCatalogCapability();
}
- @Override
- protected JdbcExceptionConverter createExceptionConverter() {
- return new MysqlExceptionConverter();
- }
-
@Override
protected JdbcTypeConverter createJdbcTypeConverter() {
return new MysqlTypeConverter();
diff --git
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
deleted file mode 100644
index 058d5234e..000000000
---
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.gravitino.catalog.mysql.converter;
-
-import java.sql.SQLException;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
-import org.apache.gravitino.exceptions.NoSuchSchemaException;
-import org.apache.gravitino.exceptions.NoSuchTableException;
-import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
-import org.apache.gravitino.exceptions.TableAlreadyExistsException;
-
-/** Exception converter to Apache Gravitino exception for MySQL. */
-public class MysqlExceptionConverter extends JdbcExceptionConverter {
-
- @SuppressWarnings("FormatStringAnnotation")
- @Override
- public GravitinoRuntimeException toGravitinoException(SQLException se) {
- switch (se.getErrorCode()) {
- case 1007:
- return new SchemaAlreadyExistsException(se, se.getMessage());
- case 1050:
- return new TableAlreadyExistsException(se, se.getMessage());
- case 1008:
- case 1049:
- return new NoSuchSchemaException(se, se.getMessage());
- case 1146:
- case 1051:
- return new NoSuchTableException(se, se.getMessage());
- default:
- return new GravitinoRuntimeException(se, se.getMessage());
- }
- }
-}
diff --git
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
index 417678e79..50c3c3602 100644
---
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
+++
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
@@ -25,9 +25,9 @@ import java.util.Map;
import javax.sql.DataSource;
import org.apache.gravitino.catalog.jdbc.TestJdbc;
import org.apache.gravitino.catalog.jdbc.config.JdbcConfig;
+import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
import org.apache.gravitino.catalog.jdbc.utils.DataSourceUtils;
import
org.apache.gravitino.catalog.mysql.converter.MysqlColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.mysql.converter.MysqlExceptionConverter;
import org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter;
import org.apache.gravitino.integration.test.container.ContainerSuite;
import org.apache.gravitino.integration.test.container.MySQLContainer;
@@ -48,7 +48,7 @@ public class TestMysql extends TestJdbc {
DATABASE_OPERATIONS = new MysqlDatabaseOperations();
TABLE_OPERATIONS = new MysqlTableOperations();
- JDBC_EXCEPTION_CONVERTER = new MysqlExceptionConverter();
+ JDBC_EXCEPTION_CONVERTER = new JdbcExceptionConverter();
DATABASE_OPERATIONS.initialize(dataSource, JDBC_EXCEPTION_CONVERTER,
Collections.emptyMap());
TABLE_OPERATIONS.initialize(
dataSource,
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
index 6dbfeccc3..123192644 100644
---
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
+++
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
@@ -22,12 +22,10 @@ import java.util.Map;
import org.apache.gravitino.catalog.jdbc.JdbcCatalog;
import org.apache.gravitino.catalog.jdbc.JdbcCatalogOperations;
import
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations;
import org.apache.gravitino.catalog.jdbc.operation.JdbcTableOperations;
import
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseColumnDefaultValueConverter;
-import
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseExceptionConverter;
import org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter;
import
org.apache.gravitino.catalog.oceanbase.operation.OceanBaseDatabaseOperations;
import
org.apache.gravitino.catalog.oceanbase.operation.OceanBaseTableOperations;
@@ -57,11 +55,6 @@ public class OceanBaseCatalog extends JdbcCatalog {
return new OceanBaseCatalogCapability();
}
- @Override
- protected JdbcExceptionConverter createExceptionConverter() {
- return new OceanBaseExceptionConverter();
- }
-
@Override
protected JdbcTypeConverter createJdbcTypeConverter() {
return new OceanBaseTypeConverter();
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
index 0f6fae44f..4f151290b 100644
---
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
+++
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
@@ -18,10 +18,20 @@
*/
package org.apache.gravitino.catalog.oceanbase.converter;
+import static org.apache.gravitino.rel.Column.DEFAULT_VALUE_NOT_SET;
+import static
org.apache.gravitino.rel.Column.DEFAULT_VALUE_OF_CURRENT_TIMESTAMP;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Objects;
import
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
import org.apache.gravitino.rel.expressions.Expression;
+import org.apache.gravitino.rel.expressions.UnparsedExpression;
+import org.apache.gravitino.rel.expressions.literals.Literals;
+import org.apache.gravitino.rel.types.Decimal;
+import org.apache.gravitino.rel.types.Types;
public class OceanBaseColumnDefaultValueConverter extends
JdbcColumnDefaultValueConverter {
@@ -31,6 +41,72 @@ public class OceanBaseColumnDefaultValueConverter extends
JdbcColumnDefaultValue
String columnDefaultValue,
boolean isExpression,
boolean nullable) {
- throw new GravitinoRuntimeException("Not implemented yet.");
+ if (Objects.isNull(columnDefaultValue)) {
+ return nullable ? Literals.NULL : DEFAULT_VALUE_NOT_SET;
+ }
+
+ if (columnDefaultValue.equalsIgnoreCase(NULL)) {
+ return Literals.NULL;
+ }
+
+ if (isExpression) {
+ if (columnDefaultValue.equals(CURRENT_TIMESTAMP)) {
+ return DEFAULT_VALUE_OF_CURRENT_TIMESTAMP;
+ }
+ // The parsing of OceanBase expressions is complex, so we are not
currently undertaking the
+ // parsing.
+ return UnparsedExpression.of(columnDefaultValue);
+ }
+
+ switch (type.getTypeName().toLowerCase()) {
+ case OceanBaseTypeConverter.TINYINT:
+ return Literals.byteLiteral(Byte.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.TINYINT_UNSIGNED:
+ return Literals.unsignedByteLiteral(Short.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.SMALLINT:
+ return Literals.shortLiteral(Short.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.SMALLINT_UNSIGNED:
+ return
Literals.unsignedShortLiteral(Integer.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.INT:
+ return Literals.integerLiteral(Integer.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.INT_UNSIGNED:
+ return
Literals.unsignedIntegerLiteral(Long.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.BIGINT:
+ return Literals.longLiteral(Long.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.BIGINT_UNSIGNED:
+ return Literals.unsignedLongLiteral(Decimal.of(columnDefaultValue));
+ case OceanBaseTypeConverter.FLOAT:
+ return Literals.floatLiteral(Float.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.DOUBLE:
+ return Literals.doubleLiteral(Double.valueOf(columnDefaultValue));
+ case OceanBaseTypeConverter.NUMBER:
+ case OceanBaseTypeConverter.NUMERIC:
+ case OceanBaseTypeConverter.DECIMAL:
+ return Literals.decimalLiteral(
+ Decimal.of(
+ columnDefaultValue,
+ Integer.parseInt(type.getColumnSize()),
+ Integer.parseInt(type.getScale())));
+ case JdbcTypeConverter.DATE:
+ return Literals.dateLiteral(LocalDate.parse(columnDefaultValue,
DATE_FORMATTER));
+ case JdbcTypeConverter.TIME:
+ return Literals.timeLiteral(LocalTime.parse(columnDefaultValue,
DATE_TIME_FORMATTER));
+ case JdbcTypeConverter.TIMESTAMP:
+ case OceanBaseTypeConverter.DATETIME:
+ return CURRENT_TIMESTAMP.equals(columnDefaultValue)
+ ? DEFAULT_VALUE_OF_CURRENT_TIMESTAMP
+ : Literals.timestampLiteral(
+ LocalDateTime.parse(columnDefaultValue, DATE_TIME_FORMATTER));
+ case JdbcTypeConverter.VARCHAR:
+ return Literals.of(
+ columnDefaultValue,
Types.VarCharType.of(Integer.parseInt(type.getColumnSize())));
+ case OceanBaseTypeConverter.CHAR:
+ return Literals.of(
+ columnDefaultValue,
Types.FixedCharType.of(Integer.parseInt(type.getColumnSize())));
+ case JdbcTypeConverter.TEXT:
+ return Literals.stringLiteral(columnDefaultValue);
+ default:
+ return UnparsedExpression.of(columnDefaultValue);
+ }
}
}
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
deleted file mode 100644
index 102e7abca..000000000
---
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.gravitino.catalog.oceanbase.converter;
-
-import java.sql.SQLException;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
-
-/** Exception converter to Apache Gravitino exception for OceanBase. */
-public class OceanBaseExceptionConverter extends JdbcExceptionConverter {
-
- @SuppressWarnings("FormatStringAnnotation")
- @Override
- public GravitinoRuntimeException toGravitinoException(SQLException se) {
- return new GravitinoRuntimeException("Not implemented yet.");
- }
-}
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
index a13d1fe8f..19a432dfd 100644
---
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
+++
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
@@ -19,22 +19,130 @@
package org.apache.gravitino.catalog.oceanbase.converter;
import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
import org.apache.gravitino.rel.types.Type;
+import org.apache.gravitino.rel.types.Types;
/** Type converter for OceanBase. */
public class OceanBaseTypeConverter extends JdbcTypeConverter {
- // More data types will be added.
static final String TINYINT = "tinyint";
+ static final String TINYINT_UNSIGNED = "tinyint unsigned";
+ static final String SMALLINT = "smallint";
+ static final String SMALLINT_UNSIGNED = "smallint unsigned";
+ static final String INT = "int";
+ static final String INT_UNSIGNED = "int unsigned";
+ static final String BIGINT = "bigint";
+ static final String BIGINT_UNSIGNED = "bigint unsigned";
+ static final String FLOAT = "float";
+ static final String DOUBLE = "double";
+ static final String DECIMAL = "decimal";
+ static final String NUMBER = "number";
+ static final String NUMERIC = "numeric";
+ static final String CHAR = "char";
+ static final String BINARY = "binary";
+ static final String DATETIME = "datetime";
@Override
public Type toGravitino(JdbcTypeBean typeBean) {
- throw new GravitinoRuntimeException("Not implemented yet.");
+ switch (typeBean.getTypeName().toLowerCase()) {
+ case TINYINT:
+ return Types.ByteType.get();
+ case TINYINT_UNSIGNED:
+ return Types.ByteType.unsigned();
+ case SMALLINT:
+ return Types.ShortType.get();
+ case SMALLINT_UNSIGNED:
+ return Types.ShortType.unsigned();
+ case INT:
+ return Types.IntegerType.get();
+ case INT_UNSIGNED:
+ return Types.IntegerType.unsigned();
+ case BIGINT:
+ return Types.LongType.get();
+ case BIGINT_UNSIGNED:
+ return Types.LongType.unsigned();
+ case FLOAT:
+ return Types.FloatType.get();
+ case DOUBLE:
+ return Types.DoubleType.get();
+ case DATE:
+ return Types.DateType.get();
+ case TIME:
+ return Types.TimeType.get();
+ case TIMESTAMP:
+ return Types.TimestampType.withTimeZone();
+ case DATETIME:
+ return Types.TimestampType.withoutTimeZone();
+ case NUMBER:
+ case NUMERIC:
+ case DECIMAL:
+ return Types.DecimalType.of(
+ Integer.parseInt(typeBean.getColumnSize()),
Integer.parseInt(typeBean.getScale()));
+ case VARCHAR:
+ return
Types.VarCharType.of(Integer.parseInt(typeBean.getColumnSize()));
+ case CHAR:
+ return
Types.FixedCharType.of(Integer.parseInt(typeBean.getColumnSize()));
+ case TEXT:
+ return Types.StringType.get();
+ case BINARY:
+ return Types.BinaryType.get();
+ default:
+ return Types.ExternalType.of(typeBean.getTypeName());
+ }
}
@Override
public String fromGravitino(Type type) {
- throw new GravitinoRuntimeException("Not implemented yet.");
+ if (type instanceof Types.ByteType) {
+ if (((Types.ByteType) type).signed()) {
+ return TINYINT;
+ } else {
+ return TINYINT_UNSIGNED;
+ }
+ } else if (type instanceof Types.ShortType) {
+ if (((Types.ShortType) type).signed()) {
+ return SMALLINT;
+ } else {
+ return SMALLINT_UNSIGNED;
+ }
+ } else if (type instanceof Types.IntegerType) {
+ if (((Types.IntegerType) type).signed()) {
+ return INT;
+ } else {
+ return INT_UNSIGNED;
+ }
+ } else if (type instanceof Types.LongType) {
+ if (((Types.LongType) type).signed()) {
+ return BIGINT;
+ } else {
+ return BIGINT_UNSIGNED;
+ }
+ } else if (type instanceof Types.FloatType) {
+ return type.simpleString();
+ } else if (type instanceof Types.DoubleType) {
+ return type.simpleString();
+ } else if (type instanceof Types.BooleanType) {
+ return type.simpleString();
+ } else if (type instanceof Types.StringType) {
+ return TEXT;
+ } else if (type instanceof Types.DateType) {
+ return type.simpleString();
+ } else if (type instanceof Types.TimeType) {
+ return type.simpleString();
+ } else if (type instanceof Types.TimestampType) {
+ return ((Types.TimestampType) type).hasTimeZone() ? TIMESTAMP : DATETIME;
+ } else if (type instanceof Types.DecimalType) {
+ return type.simpleString();
+ } else if (type instanceof Types.VarCharType) {
+ return type.simpleString();
+ } else if (type instanceof Types.FixedCharType) {
+ return type.simpleString();
+ } else if (type instanceof Types.BinaryType) {
+ return type.simpleString();
+ } else if (type instanceof Types.ExternalType) {
+ return ((Types.ExternalType) type).catalogString();
+ }
+ throw new IllegalArgumentException(
+ String.format("Couldn't convert Gravitino type %s to OceanBase type",
type.simpleString()));
}
}
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
new file mode 100644
index 000000000..8b044fea9
--- /dev/null
+++
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
@@ -0,0 +1,112 @@
+/*
+ * 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.gravitino.catalog.oceanbase.converter;
+
+import static
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.DATE;
+import static
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TEXT;
+import static
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TIME;
+import static
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TIMESTAMP;
+import static
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.VARCHAR;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.BIGINT;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.BINARY;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.CHAR;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DATETIME;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DECIMAL;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DOUBLE;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.FLOAT;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.INT;
+import static
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.TINYINT;
+
+import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
+import org.apache.gravitino.rel.types.Type;
+import org.apache.gravitino.rel.types.Types;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test class for {@link
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter}
+ */
+public class TestOceanBaseTypeConverter {
+
+ private static final OceanBaseTypeConverter OCEANBASE_TYPE_CONVERTER =
+ new OceanBaseTypeConverter();
+ private static final String USER_DEFINED_TYPE = "user-defined";
+
+ @Test
+ public void testToGravitinoType() {
+ checkJdbcTypeToGravitinoType(Types.ByteType.get(), TINYINT, null, null);
+ checkJdbcTypeToGravitinoType(Types.IntegerType.get(), INT, null, null);
+ checkJdbcTypeToGravitinoType(Types.LongType.get(), BIGINT, null, null);
+ checkJdbcTypeToGravitinoType(Types.FloatType.get(), FLOAT, null, null);
+ checkJdbcTypeToGravitinoType(Types.DoubleType.get(), DOUBLE, null, null);
+ checkJdbcTypeToGravitinoType(Types.DateType.get(), DATE, null, null);
+ checkJdbcTypeToGravitinoType(Types.TimeType.get(), TIME, null, null);
+ checkJdbcTypeToGravitinoType(Types.TimestampType.withoutTimeZone(),
DATETIME, null, null);
+ checkJdbcTypeToGravitinoType(Types.TimestampType.withTimeZone(),
TIMESTAMP, null, null);
+ checkJdbcTypeToGravitinoType(Types.DecimalType.of(10, 2), DECIMAL, "10",
"2");
+ checkJdbcTypeToGravitinoType(Types.VarCharType.of(20), VARCHAR, "20",
null);
+ checkJdbcTypeToGravitinoType(Types.FixedCharType.of(20), CHAR, "20", null);
+ checkJdbcTypeToGravitinoType(Types.StringType.get(), TEXT, null, null);
+ checkJdbcTypeToGravitinoType(Types.BinaryType.get(), BINARY, null, null);
+ checkJdbcTypeToGravitinoType(
+ Types.ExternalType.of(USER_DEFINED_TYPE), USER_DEFINED_TYPE, null,
null);
+ }
+
+ @Test
+ public void testFromGravitinoType() {
+ checkGravitinoTypeToJdbcType(TINYINT, Types.ByteType.get());
+ checkGravitinoTypeToJdbcType(INT, Types.IntegerType.get());
+ checkGravitinoTypeToJdbcType(BIGINT, Types.LongType.get());
+ checkGravitinoTypeToJdbcType(FLOAT, Types.FloatType.get());
+ checkGravitinoTypeToJdbcType(DOUBLE, Types.DoubleType.get());
+ checkGravitinoTypeToJdbcType(DATE, Types.DateType.get());
+ checkGravitinoTypeToJdbcType(TIME, Types.TimeType.get());
+ checkGravitinoTypeToJdbcType(TIMESTAMP,
Types.TimestampType.withTimeZone());
+ checkGravitinoTypeToJdbcType(DATETIME,
Types.TimestampType.withoutTimeZone());
+ checkGravitinoTypeToJdbcType(DECIMAL + "(10,2)", Types.DecimalType.of(10,
2));
+ checkGravitinoTypeToJdbcType(VARCHAR + "(20)", Types.VarCharType.of(20));
+ checkGravitinoTypeToJdbcType(CHAR + "(20)", Types.FixedCharType.of(20));
+ checkGravitinoTypeToJdbcType(TEXT, Types.StringType.get());
+ checkGravitinoTypeToJdbcType(BINARY, Types.BinaryType.get());
+ checkGravitinoTypeToJdbcType(USER_DEFINED_TYPE,
Types.ExternalType.of(USER_DEFINED_TYPE));
+ Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () ->
OCEANBASE_TYPE_CONVERTER.fromGravitino(Types.UnparsedType.of(USER_DEFINED_TYPE)));
+ }
+
+ protected void checkGravitinoTypeToJdbcType(String jdbcTypeName, Type
gravitinoType) {
+ Assertions.assertEquals(jdbcTypeName,
OCEANBASE_TYPE_CONVERTER.fromGravitino(gravitinoType));
+ }
+
+ protected void checkJdbcTypeToGravitinoType(
+ Type gravitinoType, String jdbcTypeName, String columnSize, String
scale) {
+ JdbcTypeConverter.JdbcTypeBean typeBean = createTypeBean(jdbcTypeName,
columnSize, scale);
+ Assertions.assertEquals(gravitinoType,
OCEANBASE_TYPE_CONVERTER.toGravitino(typeBean));
+ }
+
+ protected static JdbcTypeConverter.JdbcTypeBean createTypeBean(
+ String typeName, String columnSize, String scale) {
+ return new JdbcTypeConverter.JdbcTypeBean(typeName) {
+ {
+ setColumnSize(columnSize);
+ setScale(scale);
+ }
+ };
+ }
+}
diff --git
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
index f904a068b..4cb41d9a8 100644
---
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
+++
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
@@ -23,9 +23,9 @@ import java.util.Collections;
import java.util.Map;
import org.apache.gravitino.catalog.jdbc.TestJdbc;
import org.apache.gravitino.catalog.jdbc.config.JdbcConfig;
+import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
import org.apache.gravitino.catalog.jdbc.utils.DataSourceUtils;
import
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseColumnDefaultValueConverter;
-import
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseExceptionConverter;
import org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter;
import org.apache.gravitino.integration.test.container.ContainerSuite;
import org.apache.gravitino.integration.test.container.OceanBaseContainer;
@@ -44,7 +44,7 @@ public class TestOceanBase extends TestJdbc {
DATABASE_OPERATIONS = new OceanBaseDatabaseOperations();
TABLE_OPERATIONS = new OceanBaseTableOperations();
- JDBC_EXCEPTION_CONVERTER = new OceanBaseExceptionConverter();
+ JDBC_EXCEPTION_CONVERTER = new JdbcExceptionConverter();
DATABASE_OPERATIONS.initialize(DATA_SOURCE, JDBC_EXCEPTION_CONVERTER,
Collections.emptyMap());
TABLE_OPERATIONS.initialize(
DATA_SOURCE,