Skip to content

Commit 0d80a36

Browse files
committed
optimize MysqlValueProcessor & OracleValueProcessor
1 parent 57f0cfa commit 0d80a36

29 files changed

+390
-322
lines changed

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/factory/MysqlValueProcessorFactory.java

-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public class MysqlValueProcessorFactory {
4545
Map.entry(MysqlColumnTypeEnum.DATETIME.name(), mysqlTimestampProcessor),
4646
//others
4747
Map.entry(MysqlColumnTypeEnum.BIT.name(), new MysqlBitProcessor()),
48-
Map.entry(MysqlColumnTypeEnum.YEAR.name(), new MysqlYearProcessor()),
4948
Map.entry(MysqlColumnTypeEnum.DECIMAL.name(), new MysqlDecimalProcessor()),
5049
Map.entry(MysqlColumnTypeEnum.BINARY.name(), new MysqlBinaryProcessor())
5150
);

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlBinaryProcessor.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ai.chat2db.plugin.mysql.value.sub;
22

3+
import ai.chat2db.plugin.mysql.value.template.MysqlDmlValueTemplate;
34
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
45
import ai.chat2db.spi.model.JDBCDataValue;
56
import ai.chat2db.spi.model.SQLDataValue;
@@ -12,18 +13,28 @@ public class MysqlBinaryProcessor extends DefaultValueProcessor {
1213

1314
@Override
1415
public String convertSQLValueByType(SQLDataValue dataValue) {
15-
return dataValue.getBlobHexString();
16+
String value = dataValue.getValue();
17+
if (value.startsWith("0x")) {
18+
return value;
19+
}
20+
return MysqlDmlValueTemplate.wrapHex(dataValue.getBlobHexString());
1621
}
1722

1823

1924
@Override
2025
public String convertJDBCValueByType(JDBCDataValue dataValue) {
21-
return dataValue.getBlobHexString();
26+
byte[] bytes = dataValue.getBytes();
27+
if (bytes.length == 1) {
28+
if (bytes[0] >= 32 && bytes[0] <= 126) {
29+
return new String(bytes);
30+
}
31+
}
32+
return MysqlDmlValueTemplate.wrapHex(dataValue.getBlobHexString());
2233
}
2334

2435

2536
@Override
2637
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
27-
return dataValue.getBlobHexString();
38+
return MysqlDmlValueTemplate.wrapHex(dataValue.getBlobHexString());
2839
}
2940
}

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlBitProcessor.java

+9-15
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.apache.commons.lang3.StringUtils;
99

1010
import java.util.Objects;
11+
import java.util.function.Function;
1112

1213
/**
1314
* @author: zgq
@@ -23,23 +24,16 @@ public String convertSQLValueByType(SQLDataValue dataValue) {
2324

2425
@Override
2526
public String convertJDBCValueByType(JDBCDataValue dataValue) {
26-
int precision = dataValue.getPrecision();
27-
byte[] bytes = dataValue.getBytes();
28-
if (precision == 1) {
29-
//bit(1) [1 -> true] [0 -> false]
30-
if (bytes.length == 1 && (bytes[0] == 0 || bytes[0] == 1)) {
31-
return String.valueOf(dataValue.getBoolean());
32-
}
33-
// tinyint(1)
34-
return String.valueOf(dataValue.getInt());
35-
}
36-
//bit(m) m: 1~64
37-
return EasyStringUtils.getBitString(bytes, precision);
27+
return getValue(dataValue, s -> s);
3828
}
3929

4030

4131
@Override
4232
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
33+
return getValue(dataValue, this::wrap);
34+
}
35+
36+
private String getValue(JDBCDataValue dataValue, Function<String, String> function) {
4337
int precision = dataValue.getPrecision();
4438
byte[] bytes = dataValue.getBytes();
4539
if (precision == 1) {
@@ -51,7 +45,7 @@ public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
5145
return String.valueOf(dataValue.getInt());
5246
}
5347
//bit(m) m: 2~64
54-
return wrap(EasyStringUtils.getBitString(bytes, precision));
48+
return function.apply(EasyStringUtils.getBitString(bytes, precision));
5549
}
5650

5751
public String getString(String value) {
@@ -65,10 +59,10 @@ public String getString(String value) {
6559
if (StringUtils.isBlank(value)) {
6660
return "NULL";
6761
}
68-
return wrap(value);
62+
return MysqlDmlValueTemplate.wrapBit(value);
6963
}
7064

7165
private String wrap(String value) {
72-
return String.format(MysqlDmlValueTemplate.BIT_TEMPLATE, value);
66+
return MysqlDmlValueTemplate.wrapBit(value);
7367
}
7468
}

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlDecimalProcessor.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class MysqlDecimalProcessor extends DefaultValueProcessor {
1212

1313
@Override
1414
public String convertSQLValueByType(SQLDataValue dataValue) {
15-
return super.convertSQLValueByType(dataValue);
15+
return dataValue.getValue();
1616
}
1717

1818

@@ -24,6 +24,6 @@ public String convertJDBCValueByType(JDBCDataValue dataValue) {
2424

2525
@Override
2626
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
27-
return convertJDBCValueByType(dataValue);
27+
return dataValue.getBigDecimalString();
2828
}
2929
}

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlGeometryProcessor.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import ai.chat2db.spi.model.SQLDataValue;
77
import org.locationtech.jts.geom.Geometry;
88
import org.locationtech.jts.io.WKBReader;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
911

1012
import java.io.ByteArrayOutputStream;
1113
import java.io.InputStream;
@@ -17,9 +19,11 @@
1719
public class MysqlGeometryProcessor extends DefaultValueProcessor {
1820

1921

22+
private static final Logger log = LoggerFactory.getLogger(MysqlGeometryProcessor.class);
23+
2024
@Override
2125
public String convertSQLValueByType(SQLDataValue dataValue) {
22-
return wrap(dataValue.getValue());
26+
return MysqlDmlValueTemplate.wrapGeometry(dataValue.getValue());
2327
}
2428

2529
@Override
@@ -75,18 +79,15 @@ public String convertJDBCValueByType(JDBCDataValue dataValue) {
7579
}
7680
return dbGeometry != null ? dbGeometry.toString() : null;
7781
} catch (Exception e) {
78-
return super.getJdbcValue(dataValue);
82+
log.warn("Error converting database geometry", e);
83+
return dataValue.getStringValue();
7984
}
8085
}
8186

8287

8388
@Override
8489
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
85-
return wrap(convertJDBCValueByType(dataValue));
86-
}
87-
88-
private String wrap(String value) {
89-
return String.format(MysqlDmlValueTemplate.GEOMETRY_TEMPLATE, value);
90+
return MysqlDmlValueTemplate.wrapGeometry(convertJDBCValueByType(dataValue));
9091
}
9192

9293
}

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlTextProcessor.java

+3-18
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
55
import ai.chat2db.spi.model.JDBCDataValue;
66
import ai.chat2db.spi.model.SQLDataValue;
7-
import ai.chat2db.spi.sql.Chat2DBContext;
87
import lombok.extern.slf4j.Slf4j;
98

10-
import java.util.function.Function;
11-
129
/**
1310
* @author: zgq
1411
* @date: 2024年06月05日 0:11
@@ -19,31 +16,19 @@ public class MysqlTextProcessor extends DefaultValueProcessor {
1916

2017
@Override
2118
public String convertSQLValueByType(SQLDataValue dataValue) {
22-
return wrap(dataValue.getValue());
19+
return EasyStringUtils.escapeAndQuoteString(dataValue.getValue());
2320
}
2421

2522

2623
@Override
2724
public String convertJDBCValueByType(JDBCDataValue dataValue) {
28-
return getClobString(dataValue, super::convertJDBCValueByType);
25+
return dataValue.getClobString();
2926
}
3027

3128
@Override
3229
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
33-
return wrap(getClobString(dataValue, super::convertJDBCValueStrByType));
30+
return EasyStringUtils.escapeAndQuoteString(dataValue.getClobString());
3431
}
3532

36-
private String getClobString(JDBCDataValue dataValue, Function<JDBCDataValue, String> function) {
37-
try {
38-
return dataValue.getClobString();
39-
} catch (Exception e) {
40-
log.warn("convertJDBCValue error database: {} , error dataType: {} ",
41-
Chat2DBContext.getDBConfig().getDbType(), dataValue.getType(), e);
42-
return function.apply(dataValue);
43-
}
44-
}
4533

46-
private String wrap(String value) {
47-
return EasyStringUtils.escapeAndQuoteString(value);
48-
}
4934
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ai.chat2db.plugin.mysql.value.sub;
22

3-
import ai.chat2db.plugin.mysql.value.template.MysqlDmlValueTemplate;
3+
import ai.chat2db.server.tools.common.util.EasyStringUtils;
44
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
55
import ai.chat2db.spi.model.JDBCDataValue;
66
import ai.chat2db.spi.model.SQLDataValue;
@@ -13,28 +13,18 @@ public class MysqlTimestampProcessor extends DefaultValueProcessor {
1313

1414
@Override
1515
public String convertSQLValueByType(SQLDataValue dataValue) {
16-
return super.convertSQLValueByType(dataValue);
16+
return dataValue.getValue();
1717
}
1818

1919

2020
@Override
2121
public String convertJDBCValueByType(JDBCDataValue dataValue) {
22-
return isValidTimestamp(dataValue) ? new String(dataValue.getBytes()) : "0000-00-00 00:00:00";
22+
return new String(dataValue.getBytes());
2323
}
2424

25-
protected boolean isValidTimestamp(JDBCDataValue data) {
26-
byte[] buffer = data.getBytes();
27-
String stringValue = new String(buffer);
28-
return stringValue.length() <= 0
29-
|| stringValue.charAt(0) != '0'
30-
|| !"0000-00-00".equals(stringValue)
31-
&& !"0000-00-00 00:00:00".equals(stringValue)
32-
&& !"00000000000000".equals(stringValue)
33-
&& !"0".equals(stringValue);
34-
}
3525

3626
@Override
3727
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
38-
return String.format(MysqlDmlValueTemplate.COMMON_TEMPLATE, convertJDBCValueByType(dataValue));
28+
return EasyStringUtils.quoteString(new String(dataValue.getBytes()));
3929
}
4030
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package ai.chat2db.plugin.mysql.value.sub;
22

3+
import ai.chat2db.plugin.mysql.value.template.MysqlDmlValueTemplate;
34
import ai.chat2db.spi.jdbc.DefaultValueProcessor;
45
import ai.chat2db.spi.model.JDBCDataValue;
56
import ai.chat2db.spi.model.SQLDataValue;
6-
import ai.chat2db.spi.sql.Chat2DBContext;
7-
import ch.qos.logback.core.model.processor.DefaultProcessor;
87
import lombok.extern.slf4j.Slf4j;
98

109
/**
@@ -16,26 +15,24 @@ public class MysqlVarBinaryProcessor extends DefaultValueProcessor {
1615

1716
@Override
1817
public String convertSQLValueByType(SQLDataValue dataValue) {
19-
// TODO: insert file
20-
return super.convertSQLValueByType(dataValue);
18+
String value = dataValue.getValue();
19+
if (value.startsWith("0x")) {
20+
return value;
21+
}
22+
return MysqlDmlValueTemplate.wrapHex(dataValue.getBlobHexString());
2123
}
2224

2325

2426
@Override
2527
public String convertJDBCValueByType(JDBCDataValue dataValue) {
26-
try {
27-
return dataValue.getBlobString();
28-
} catch (Exception e) {
29-
log.warn("convertJDBCValue error database: {} , error dataType: {} ",
30-
Chat2DBContext.getDBConfig().getDbType(), dataValue.getType(), e);
31-
return super.convertJDBCValueByType(dataValue);
32-
}
28+
return dataValue.getBlobString();
3329
}
3430

3531

3632
@Override
3733
public String convertJDBCValueStrByType(JDBCDataValue dataValue) {
38-
return dataValue.getBlobHexString();
34+
return MysqlDmlValueTemplate.wrapHex(dataValue.getBlobHexString());
3935
}
36+
4037
}
4138

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/sub/MysqlYearProcessor.java

-62
This file was deleted.

chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/value/template/MysqlDmlValueTemplate.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,20 @@
66
*/
77
public class MysqlDmlValueTemplate {
88

9-
public static final String COMMON_TEMPLATE = "'%s'";
109
public static final String GEOMETRY_TEMPLATE = "ST_GeomFromText('%s')";
1110
public static final String BIT_TEMPLATE = "b'%s'";
11+
public static final String HEX_TEMPLATE = "0x%s";
12+
13+
14+
public static String wrapGeometry(String value) {
15+
return String.format(GEOMETRY_TEMPLATE, value);
16+
}
17+
18+
public static String wrapBit(String value) {
19+
return String.format(BIT_TEMPLATE, value);
20+
}
21+
22+
public static String wrapHex(String value) {
23+
return String.format(HEX_TEMPLATE, value);
24+
}
1225
}

0 commit comments

Comments
 (0)