optimize MysqlValueProcessor & OracleValueProcessor

This commit is contained in:
zgq
2024-06-28 22:23:48 +08:00
parent 57f0cfa2db
commit 0d80a36a6f
29 changed files with 416 additions and 348 deletions

View File

@ -8,10 +8,12 @@
"custom": false,
"defaultDriver": true,
"downloadJdbcDriverUrls": [
"https://cdn.chat2db-ai.com/lib/ojdbc8-19.3.0.0.jar",
"https://cdn.chat2db-ai.com/lib/orai18n-19.3.0.0.jar"
"https://cdn.chat2db-ai.com/lib/ojdbc11-21.5.0.0.jar",
"https://cdn.chat2db-ai.com/lib/orai18n-21.5.0.0.jar",
"https://cdn.chat2db-ai.com/lib/xmlparserv2-21.5.0.0.jar",
"https://cdn.chat2db-ai.com/lib/xdb-21.5.0.0.jar"
],
"jdbcDriver": "ojdbc8-19.3.0.0.jar,orai18n-19.3.0.0.jar",
"jdbcDriver": "ojdbc11-21.5.0.0.jar,orai18n-21.5.0.0.jar,xmlparserv2-21.5.0.0.jar,xdb-21.5.0.0.jar",
"jdbcDriverClass": "oracle.jdbc.driver.OracleDriver"
}
],

View File

@ -21,7 +21,7 @@ public class OracleValueProcessor extends DefaultValueProcessor {
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
String type = dataValue.getType();
return OracleValueProcessorFactory.getValueProcessor(dataValue.getType()).convertJDBCValueByType(dataValue);
return OracleValueProcessorFactory.getValueProcessor(type).convertJDBCValueByType(dataValue);
}

View File

@ -9,7 +9,7 @@ import java.util.Map;
/**
* @author: zgq
* @date: 2024年06月03日 23:21
*/ // TODO: 1.空间数据类型 2.XML数据类型 3.动态类型数据 4.ANSI、DB2 和 SQL/DS 数据
*/ // TODO: 1.空间数据类型 2.动态类型数据
public class OracleValueProcessorFactory {
private static final Map<String, DefaultValueProcessor> PROCESSOR_MAP;
@ -17,6 +17,8 @@ public class OracleValueProcessorFactory {
static {
OracleClobProcessor oracleClobProcessor = new OracleClobProcessor();
OracleTimeStampProcessor oracleTimeStampProcessor = new OracleTimeStampProcessor();
OracleBlobProcessor oracleBlobProcessor = new OracleBlobProcessor();
OracleRawValueProcessor oracleRawValueProcessor = new OracleRawValueProcessor();
PROCESSOR_MAP = Map.ofEntries(
//clob
Map.entry(OracleColumnTypeEnum.CLOB.name(), oracleClobProcessor),
@ -34,14 +36,18 @@ public class OracleValueProcessorFactory {
//number
Map.entry(OracleColumnTypeEnum.NUMBER.name(), new OracleNumberProcessor()),
//blob
Map.entry(OracleColumnTypeEnum.BLOB.name(), new OracleBlobProcessor())
Map.entry(OracleColumnTypeEnum.BLOB.name(), oracleBlobProcessor),
//raw
Map.entry(OracleColumnTypeEnum.RAW.name(), oracleRawValueProcessor),
Map.entry(OracleColumnTypeEnum.LONG_RAW.getColumnType().getTypeName(), oracleRawValueProcessor),
//xml
Map.entry("SYS.XMLTYPE", new OracleXmlValueProcessor())
);
}
public static DefaultValueProcessor getValueProcessor(String type) {
DefaultValueProcessor processor = PROCESSOR_MAP.get(type);
return processor == null ? new DefaultValueProcessor() : processor;
return PROCESSOR_MAP.getOrDefault(type, new DefaultValueProcessor());
}
}

View File

@ -1,9 +1,9 @@
package ai.chat2db.plugin.oracle.value.sub;
import ai.chat2db.server.tools.common.util.EasyStringUtils;
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
import ai.chat2db.spi.model.JDBCDataValue;
import ai.chat2db.spi.model.SQLDataValue;
import ai.chat2db.spi.sql.Chat2DBContext;
import lombok.extern.slf4j.Slf4j;
/**
@ -15,24 +15,17 @@ public class OracleBlobProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return dataValue.getBlobHexString();
return EasyStringUtils.quoteString(dataValue.getBlobHexString());
}
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
try {
return dataValue.getBlobString();
} catch (Exception e) {
log.warn("convertJDBCValueByType error database: {} , error dataType: {} ",
Chat2DBContext.getDBConfig().getDbType(), dataValue.getType(), e);
return super.convertJDBCValueByType(dataValue);
}
return dataValue.getBlobString();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return dataValue.getBlobHexString();
return EasyStringUtils.quoteString(dataValue.getBlobHexString());
}
}

View File

@ -13,7 +13,7 @@ public class OracleClobProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return wrap(dataValue.getValue());
return EasyStringUtils.escapeAndQuoteString(dataValue.getValue());
}
@ -25,10 +25,6 @@ public class OracleClobProcessor extends DefaultValueProcessor {
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return wrap(dataValue.getClobString());
}
private String wrap(String value) {
return EasyStringUtils.escapeAndQuoteString(value);
return EasyStringUtils.escapeAndQuoteString(dataValue.getClobString());
}
}

View File

@ -21,7 +21,7 @@ public class OracleDateProcessor extends DefaultValueProcessor {
*/
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return wrap(dataValue.getValue());
return OracleDmlValueTemplate.wrapDate(dataValue.getValue());
}
/**
@ -41,16 +41,9 @@ public class OracleDateProcessor extends DefaultValueProcessor {
}
/**
* @param dataValue
* @return
*/
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return wrap(convertJDBCValueByType(dataValue));
}
private String wrap(String value) {
return String.format(OracleDmlValueTemplate.DATE_TEMPLATE, value);
return OracleDmlValueTemplate.wrapDate(convertJDBCValueByType(dataValue));
}
}

View File

@ -14,22 +14,19 @@ public class OracleIntervalDSProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return wrap(dataValue.getValue(), dataValue.getPrecision(), dataValue.getScale());
return OracleDmlValueTemplate.wrapIntervalDayToSecond(dataValue.getValue(), dataValue.getPrecision(), dataValue.getScale());
}
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
return super.convertJDBCValueByType(dataValue);
return dataValue.getStringValue();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return wrap(convertJDBCValueByType(dataValue), dataValue.getPrecision(), dataValue.getScale());
return OracleDmlValueTemplate.wrapIntervalDayToSecond(convertJDBCValueByType(dataValue), dataValue.getPrecision(), dataValue.getScale());
}
private String wrap(String value, int precision, int scale) {
return String.format(OracleDmlValueTemplate.INTEGER_DAY_TO_SECOND_TEMPLATE, value, precision, scale);
}
}

View File

@ -15,22 +15,18 @@ public class OracleIntervalYMProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return wrap(dataValue.getValue(), dataValue.getPrecision());
return OracleDmlValueTemplate.wrapIntervalYearToMonth(dataValue.getValue(), dataValue.getPrecision());
}
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
return super.convertJDBCValueByType(dataValue);
return dataValue.getStringValue();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return wrap(convertJDBCValueByType(dataValue), dataValue.getPrecision());
}
public String wrap(String value, int precision) {
return String.format(OracleDmlValueTemplate.INTEGER_YEAR_TO_MONTH_TEMPLATE, value, precision);
return OracleDmlValueTemplate.wrapIntervalYearToMonth(dataValue.getStringValue(), dataValue.getPrecision());
}
}

View File

@ -14,7 +14,7 @@ public class OracleNumberProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return super.convertSQLValueByType(dataValue);
return dataValue.getValue();
}
@ -26,6 +26,6 @@ public class OracleNumberProcessor extends DefaultValueProcessor {
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return convertJDBCValueByType(dataValue);
return dataValue.getBigDecimalString();
}
}

View File

@ -0,0 +1,31 @@
package ai.chat2db.plugin.oracle.value.sub;
import ai.chat2db.server.tools.common.util.EasyStringUtils;
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
import ai.chat2db.spi.model.JDBCDataValue;
import ai.chat2db.spi.model.SQLDataValue;
/**
* @author: zgq
* @date: 2024年06月28日 下午1:59
*/
public class OracleRawValueProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return EasyStringUtils.quoteString(dataValue.getValue());
}
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
return dataValue.getBinaryDataString();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return EasyStringUtils.quoteString(dataValue.getBlobHexString());
}
}

View File

@ -24,7 +24,6 @@ public class OracleTimeStampProcessor extends DefaultValueProcessor {
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
// TODO: datagrip对timestampLTZ的处理是不受时区影响的但其实这个字段就是为了可以协同时区问题的有待商讨
Timestamp timestamp = dataValue.getTimestamp();
int scale = dataValue.getScale();
LocalDateTime localDateTime = timestamp.toLocalDateTime();
@ -45,8 +44,8 @@ public class OracleTimeStampProcessor extends DefaultValueProcessor {
private String wrap(String value, int scale) {
if (scale == 0) {
return String.format(OracleDmlValueTemplate.DATE_TEMPLATE, value);
return OracleDmlValueTemplate.wrapDate(value);
}
return String.format(OracleDmlValueTemplate.TIMESTAMP_TEMPLATE, value, scale);
return OracleDmlValueTemplate.wrapTimestamp(value, scale);
}
}

View File

@ -21,21 +21,19 @@ public class OracleTimeStampTZProcessor extends DefaultValueProcessor {
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
// TODO: return:2024-06-05 17:32:52.849 +8:00 but it actually is 2024-06-05 17:32:52.849000 +8:00
return super.convertJDBCValueByType(dataValue);
return dataValue.getStringValue();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return wrap(convertJDBCValueByType(dataValue), dataValue.getScale());
return wrap(dataValue.getStringValue(), dataValue.getScale());
}
private String wrap(String value, int scale) {
if (scale == 0) {
return String.format(OracleDmlValueTemplate.TIMESTAMP_TZ_WITHOUT_NANOS_TEMPLATE, value);
return OracleDmlValueTemplate.wrapTimestampTzWithOutNanos(value);
}
return String.format(OracleDmlValueTemplate.TIMESTAMP_TZ_TEMPLATE, value, scale);
return OracleDmlValueTemplate.wrapTimestampTz(value, scale);
}
}

View File

@ -0,0 +1,30 @@
package ai.chat2db.plugin.oracle.value.sub;
import ai.chat2db.plugin.oracle.value.template.OracleDmlValueTemplate;
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
import ai.chat2db.spi.model.JDBCDataValue;
import ai.chat2db.spi.model.SQLDataValue;
/**
* @author: zgq
* @date: 2024年06月21日 12:55
*/
public class OracleXmlValueProcessor extends DefaultValueProcessor {
@Override
public String convertSQLValueByType(SQLDataValue dataValue) {
return OracleDmlValueTemplate.wrapXml(dataValue.getValue());
}
@Override
public String convertJDBCValueByType(JDBCDataValue dataValue) {
return dataValue.getStringValue();
}
@Override
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
return OracleDmlValueTemplate.wrapXml(dataValue.getString());
}
}

View File

@ -13,6 +13,38 @@ public class OracleDmlValueTemplate {
public static final String TIMESTAMP_TZ_TEMPLATE = "TO_TIMESTAMP_TZ('%s', 'YYYY-MM-DD HH24:MI:SS.FF%d TZH:TZM')";
public static final String TIMESTAMP_TZ_WITHOUT_NANOS_TEMPLATE = "TO_TIMESTAMP_TZ('%s', 'YYYY-MM-DD HH24:MI:SS TZH:TZM')";
public static final String INTEGER_YEAR_TO_MONTH_TEMPLATE = "INTERVAL '%s' YEAR(%d) TO MONTH";
public static final String INTEGER_DAY_TO_SECOND_TEMPLATE = "INTERVAL '%s' DAY(%d) TO SECOND(%d)";
public static final String INTERVAL_YEAR_TO_MONTH_TEMPLATE = "INTERVAL '%s' YEAR(%d) TO MONTH";
public static final String INTERVAL_DAY_TO_SECOND_TEMPLATE = "INTERVAL '%s' DAY(%d) TO SECOND(%d)";
public static final String XML_TEMPLATE = "XMLType('%s')";
public static String wrapDate(String date) {
return String.format(DATE_TEMPLATE, date);
}
public static String wrapTimestamp(String timestamp, int scale) {
return String.format(TIMESTAMP_TEMPLATE, timestamp, scale);
}
public static String wrapTimestampTz(String timestamp, int scale) {
return String.format(TIMESTAMP_TZ_TEMPLATE, timestamp, scale);
}
public static String wrapTimestampTzWithOutNanos(String timestamp) {
return String.format(TIMESTAMP_TZ_WITHOUT_NANOS_TEMPLATE, timestamp);
}
public static String wrapIntervalYearToMonth(String year, int precision) {
return String.format(INTERVAL_YEAR_TO_MONTH_TEMPLATE, year, precision);
}
public static String wrapIntervalDayToSecond(String day, int precision, int scale) {
return String.format(INTERVAL_DAY_TO_SECOND_TEMPLATE, day, precision, scale);
}
public static String wrapXml(String xml) {
return String.format(XML_TEMPLATE, xml);
}
}