Skip to content

Commit

Permalink
更新
Browse files Browse the repository at this point in the history
  • Loading branch information
chenrenfei committed May 13, 2024
1 parent b7635b2 commit 06b1cba
Show file tree
Hide file tree
Showing 19 changed files with 112 additions and 51 deletions.
4 changes: 2 additions & 2 deletions trunk/sqltoy-orm-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
<ehcache.version>3.10.8</ehcache.version>
<httpclient.version>4.5.14</httpclient.version>
<httpclient-core.version>4.4.16</httpclient-core.version>
<elastic-rest-client.version>8.13.3</elastic-rest-client.version>
<fastjson.version>2.0.49</fastjson.version>
<elastic-rest-client.version>8.13.4</elastic-rest-client.version>
<fastjson.version>2.0.50</fastjson.version>
<mongo.version>3.12.14</mongo.version>
<junit-jupiter.version>5.10.2</junit-jupiter.version>
<junit-platform.version>1.10.2</junit-platform.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,7 @@ private static String processLoop(String queryStr, String[] paramsNamed, Object[
keyValues.put(paramsNamed[i], paramsValue[i]);
}
// 这里是借用业务主键生成里面的宏处理模式来解决
return MacroUtils.replaceMacros(queryStr, keyValues, null, false, macros);
return MacroUtils.replaceMacros(queryStr, keyValues, null, false, macros, null);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
* @modify Date:2020-04-22 增加System.out
* 对sql文件加载的打印输出,避免有些开发在开发阶段不知道设置日志级别为debug从而看不到输出
* @modify Date:2023-8-19 增加了@include(:scriptName) 模式
* @modify Date:2024-5-13 @include(id="sqlId")
* 增强兼容sqlId根据dialect方言找sqlId_dialect模式
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class SqlScriptLoader {
Expand Down Expand Up @@ -103,9 +105,10 @@ public class SqlScriptLoader {

/**
* 增加路径验证提示,最易配错导致无法加载sql文件
*
* @param sqlResourcesDir
*/
public static void checkSqlResourcesDir(String sqlResourcesDir){
public static void checkSqlResourcesDir(String sqlResourcesDir) {
if (StringUtil.isNotBlank(sqlResourcesDir)
&& (sqlResourcesDir.toLowerCase().contains(".sql.xml") || sqlResourcesDir.contains("*"))) {
throw new IllegalArgumentException("\n您的配置:spring.sqltoy.sqlResourcesDir=" + sqlResourcesDir + " 不正确!\n"
Expand Down Expand Up @@ -279,7 +282,8 @@ public SqlToyConfig getSqlConfig(String sqlKey, SqlType sqlType, String dialect,
result.clearDialectSql();
}
// 替换include的实际sql
String sql = MacroUtils.replaceMacros(result.getSql(), (Map) sqlCache, paramValues, false, macros);
String sql = MacroUtils.replaceMacros(result.getSql(), (Map) sqlCache, paramValues, false, macros,
dialect);
// 重新解析sql内容
SqlToyConfig tmpConfig = SqlConfigParseUtils.parseSqlToyConfig(sql, realDialect, sqlType);
result.setHasUnion(tmpConfig.isHasUnion());
Expand All @@ -294,7 +298,7 @@ public SqlToyConfig getSqlConfig(String sqlKey, SqlType sqlType, String dialect,

String countSql = result.getCountSql(null);
if (countSql != null && StringUtil.matches(countSql, SqlToyConstants.INCLUDE_PATTERN)) {
countSql = MacroUtils.replaceMacros(countSql, (Map) sqlCache, paramValues, false, macros);
countSql = MacroUtils.replaceMacros(countSql, (Map) sqlCache, paramValues, false, macros, dialect);
countSql = FunctionUtils.getDialectSql(countSql, realDialect);
countSql = ReservedWordsUtil.convertSql(countSql, DataSourceUtils.getDBType(realDialect));
result.setCountSql(countSql);
Expand All @@ -313,7 +317,7 @@ public SqlToyConfig getSqlConfig(String sqlKey, SqlType sqlType, String dialect,
// 替换include的实际sql
if (hasInclude) {
isParamInclude = StringUtil.matches(sqlKey, SqlToyConstants.INCLUDE_PARAM_PATTERN);
String sql = MacroUtils.replaceMacros(sqlKey, (Map) sqlCache, paramValues, false, macros);
String sql = MacroUtils.replaceMacros(sqlKey, (Map) sqlCache, paramValues, false, macros, dialect);
result = SqlConfigParseUtils.parseSqlToyConfig(sql, realDialect, sqlType);
} else {
result = SqlConfigParseUtils.parseSqlToyConfig(sqlKey, realDialect, sqlType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ public interface LightDao {
public Store store();

/**
* @TODO 提供链式操作模式保存操作集合
* @TODO 提供链式操作模式保存操作集合,如:lightDao.save().dataSource(xxx).one(entity)
* lightDao.save().dataSource(xxx).many(entities)
* @return
*/
public Save save();
Expand Down Expand Up @@ -533,7 +534,8 @@ public <T extends Serializable> List<T> loadByIds(final Class<T> entityClass, fi

/**
* @TODO 根据QueryExecutor来链式操作灵活定义查询sql、条件、数据源等
* @param query new QueryExecutor(sql).names().values().filters() 链式设置查询
* @param query new QueryExecutor(sql).dataSource().names().values().filters()
* 链式设置查询
* @return
*/
public Object loadByQuery(final QueryExecutor query);
Expand Down Expand Up @@ -584,7 +586,7 @@ public <T extends Serializable> List<T> loadByIds(final Class<T> entityClass, fi
* @todo 通过QueryExecutor来构造查询逻辑进行分页查询
* @param page
* @param queryExecutor 范例:new
* QueryExecutor(sql).names(xxx).values(xxx).filters()
* QueryExecutor(sql).dataSource(dataSource).names(xxx).values(xxx).filters()
* 链式设置查询
* @return
*/
Expand Down Expand Up @@ -641,7 +643,9 @@ public <T> List<T> findTop(final String sqlOrSqlId, final Serializable entity, f
final double topSize);

/*
* 用QueryExecutor组织查询逻辑,findTopByQuery(new QueryExecutor(sqlOrSqlId,MapKit.keys(...).values(...)).resultType(resultDTO),10)
* 用QueryExecutor组织查询逻辑,findTopByQuery(new
* QueryExecutor(sqlOrSqlId,MapKit.keys(...).values(...)).resultType(resultDTO),
* 10)
*/
public QueryResult findTopByQuery(final QueryExecutor queryExecutor, final double topSize);

Expand Down Expand Up @@ -788,17 +792,11 @@ public <T> List<T> findRandom(final String sqlOrSqlId, final Map<String, Object>
* @todo 对数据集合通过反调函数对具体属性进行翻译
* <p>
* sqlToyLazyDao.translate(staffVOs<StaffInfoVO>, "staffIdName", new
* TranslateHandler() {
* //告知key值
* public Object getKey(Object row) {
* return ((StaffInfoVO)row).getStaffId();
* }
* // 将翻译后的名称值设置到对应的属性上
* public void setName(Object row, String name) {
* ((StaffInfoVO)row).setStaffName(name);
* }
* });
* </p>
* TranslateHandler() { //告知key值 public Object getKey(Object row) { return
* ((StaffInfoVO)row).getStaffId(); } // 将翻译后的名称值设置到对应的属性上 public void
* setName(Object row, String name) {
* ((StaffInfoVO)row).setStaffName(name); } });
* </p>
* @param dataSet 数据集合
* @param cacheName 缓存名称
* @param cacheType 例如数据字典存在分类的缓存填写字典分类,其它的如员工、机构等填null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ public abstract class AbstractMacro {
* @param keyValues 宏涉及的参数名称和对应的值
* @param paramValues sql语句中的参数属性名称和值对象(2023-08-18 新增)
* @param preSql 宏前面部分的sql,用于特定场景参考(目前主要是@loop循环判null场景)
* @param extSign 扩展标记(备用)
* @return
*/
public abstract String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql);
public abstract String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String extSign);

}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public class MacroUtils {
* @return
*/
public static String replaceMacros(String hasMacroStr, Map<String, Object> keyValues) {
return replaceMacros(hasMacroStr, keyValues, null, false, macros);
return replaceMacros(hasMacroStr, keyValues, null, false, macros, null);
}

/**
Expand All @@ -75,10 +75,11 @@ public static String replaceMacros(String hasMacroStr, Map<String, Object> keyVa
* @param isOuter(isOuter 当@abc(@do(),xxx):为true表示从最外层的macro@abce,false则会先执行@do()
* 然后再执行@abc())
* @param macros
* @param extSign 扩展标记,目前主要给@include使用,传递dialect
* @return
*/
public static String replaceMacros(String hasMacroStr, Map<String, Object> keyValues, Object paramsValues,
boolean isOuter, Map<String, AbstractMacro> macros) {
boolean isOuter, Map<String, AbstractMacro> macros, String extSign) {
if (StringUtil.isBlank(hasMacroStr)) {
return hasMacroStr;
}
Expand Down Expand Up @@ -121,14 +122,14 @@ public static String replaceMacros(String hasMacroStr, Map<String, Object> keyVa
// 调用转换器进行计算
AbstractMacro macro = macros.get(macroName);
String result = macro.execute(StringUtil.splitExcludeSymMark(macroParam, ",", filters), keyValues,
paramsValues, preSql);
paramsValues, preSql, extSign);
// 最外层是转换器,则将转结果直接以对象方式返回
if (hasMacroStr.trim().equals(macroStr.trim())) {
return result;
}
String macroResult = (result == null) ? "" : result;
hasMacroStr = replaceStr(hasMacroStr, macroStr, macroResult, macroIndex);
return replaceMacros(hasMacroStr, keyValues, paramsValues, isOuter, macros);
return replaceMacros(hasMacroStr, keyValues, paramsValues, isOuter, macros, extSign);
}
return hasMacroStr;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class Case extends AbstractMacro {
* org.sagacity.sqltoy.plugins.id.macro.AbstractMacro#execute(java.lang.Object)
*/
@Override
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql) {
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String extSign) {
if (params == null) {
return "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public class DateFormat extends AbstractMacro {
* org.sagacity.sqltoy.plugins.id.macro.AbstractMacro#execute(java.lang.Object)
*/
@Override
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql) {
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String extSign) {
Object dateValue = null;
String fmt = "yyMMdd";
if (params != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.sagacity.sqltoy.config.model.SqlToyConfig;
import org.sagacity.sqltoy.plugins.id.macro.AbstractMacro;
import org.sagacity.sqltoy.utils.BeanUtil;
import org.sagacity.sqltoy.utils.DataSourceUtils.Dialect;
import org.sagacity.sqltoy.utils.StringUtil;

/**
Expand All @@ -21,7 +22,8 @@
public class Include extends AbstractMacro {

@Override
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql) {
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String dialect) {
if (params.length == 0) {
return "";
}
Expand All @@ -47,7 +49,7 @@ public String execute(String[] params, Map<String, Object> keyValues, Object par
// 输出sql
return paramValue.toString();
}
SqlToyConfig sqlToyConfig = (SqlToyConfig) keyValues.get(sqlId);
SqlToyConfig sqlToyConfig = getSqlToyConfig(keyValues, sqlId, dialect);
if (sqlToyConfig == null) {
return "(sqlId='" + sqlId + "' not exists!)";
}
Expand All @@ -59,4 +61,39 @@ public String execute(String[] params, Map<String, Object> keyValues, Object par
return sqlToyConfig.getSql();
}

/**
* @TODO 增加对数据库方言的适配
* @param sqlCache
* @param sqlId
* @param dialect
* @return
*/
private SqlToyConfig getSqlToyConfig(Map<String, Object> sqlCache, String sqlId, String dialect) {
SqlToyConfig result = null;
if (StringUtil.isNotBlank(dialect)) {
// sqlId_dialect
result = (SqlToyConfig) sqlCache.get(sqlId.concat("_").concat(dialect));
// dialect_sqlId
if (result == null) {
result = (SqlToyConfig) sqlCache.get(dialect.concat("_").concat(sqlId));
}
// 兼容一下sqlserver的命名
if (result == null && dialect.equals(Dialect.SQLSERVER)) {
result = (SqlToyConfig) sqlCache.get(sqlId.concat("_mssql"));
if (result == null) {
result = (SqlToyConfig) sqlCache.get("mssql_".concat(sqlId));
}
} // 兼容一下postgres的命名
if (result == null && dialect.equals(Dialect.POSTGRESQL)) {
result = (SqlToyConfig) sqlCache.get(sqlId.concat("_postgres"));
if (result == null) {
result = (SqlToyConfig) sqlCache.get("postgres_".concat(sqlId));
}
}
}
if (result == null) {
result = (SqlToyConfig) sqlCache.get(sqlId);
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public SqlLoop(boolean skipBlank) {
}

@Override
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql) {
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String extSign) {
if (params == null || params.length < 2 || keyValues == null || keyValues.size() == 0) {
return " ";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
public class SubString extends AbstractMacro {

@Override
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql) {
public String execute(String[] params, Map<String, Object> keyValues, Object paramValues, String preSql,
String extSign) {
if (params == null || params.length < 3) {
return "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

/**
* @project sagacity-sqltoy
* @description 针对localCache提供动态从redis或数据库获取值并放入缓存的机制
* @description 针对localCache提供动态从redis或数据库获取值并放入缓存的机制(目前还未实现)
* @author zhongxuchen
* @version v1.0, Date:2024年1月18日
* @modify 2024年1月18日,修改说明
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1019,6 +1019,7 @@ private static Date oracleDateConvert(Object obj) throws Exception {
* @param datas
* @param props
* @return
* @throws RuntimeException
*/
public static List reflectBeansToList(List datas, String[] props) throws RuntimeException {
return reflectBeansToList(datas, props, null);
Expand All @@ -1029,7 +1030,7 @@ public static List reflectBeansToList(List datas, String[] props) throws Runtime
* @param datas
* @param propertyName
* @return
* @throws Exception
* @throws RuntimeException
*/
public static Object[] sliceToArray(List datas, String propertyName) throws RuntimeException {
List sliceList = reflectBeansToList(datas, new String[] { propertyName }, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -360,32 +360,37 @@ public static int judgeObjectDimen(Object obj) {
if (obj == null) {
return -1;
}

Object firstCellValue;
if (obj instanceof Collection || obj.getClass().isArray() || obj instanceof Map) {
result = 1;
if (obj instanceof Collection) {
Collection tmp = (Collection) obj;
if (tmp.isEmpty()) {
return result;
}
if (((List) obj).get(0) != null && ((List) obj).get(0) instanceof List) {
firstCellValue = ((List) obj).get(0);
if (firstCellValue != null && (firstCellValue instanceof Collection
|| firstCellValue.getClass().isArray() || firstCellValue instanceof Map)) {
result = 2;
}
} else if (obj.getClass().isArray()) {
Object[] tmp = convertArray(obj);
if (tmp.length == 0) {
return result;
}
if (tmp[0] != null && tmp[0].getClass().isArray()) {
firstCellValue = tmp[0];
if (firstCellValue != null && (firstCellValue instanceof Collection
|| firstCellValue.getClass().isArray() || firstCellValue instanceof Map)) {
result = 2;
}
} else if (obj instanceof Map) {
Map tmp = (Map) obj;
if (tmp.isEmpty()) {
return result;
}
Object setItem = tmp.values().iterator().next();
if (setItem.getClass().isArray() || setItem instanceof Collection || setItem instanceof Map) {
firstCellValue = tmp.values().iterator().next();
if (firstCellValue != null && (firstCellValue instanceof Collection
|| firstCellValue.getClass().isArray() || firstCellValue instanceof Map)) {
result = 2;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ private static String evalSimpleExpress(String evalExpression, List paramValues,
*/
public static boolean compare(Object value, String compareType, String compareValue) {
// 剔除首尾字符串标志符号
compareValue = clearChar(compareValue);
compareValue = removeStartEndQuote(compareValue);
// 只支持加减运算
String append = "0";
String[] calculateStr = { "+", "-" };
Expand Down Expand Up @@ -232,7 +232,7 @@ public static boolean compare(Object value, String compareType, String compareVa
compareValue = DateUtil.formatDate(DateUtil.addSecond(new Date(), Double.parseDouble(append)), dayFmt);
type = "date";
}
String valueStr = (value == null) ? "null" : clearChar(value.toString());
String valueStr = (value == null) ? "null" : removeStartEndQuote(value.toString());
if ("time".equals(type)) {
valueStr = DateUtil.formatDate(value, dayTimeFmt);
} else if ("date".equals(type)) {
Expand Down Expand Up @@ -497,7 +497,12 @@ private static boolean between(Object param, String valueStr, String beginContra
return false;
}

private static String clearChar(String source) {
/**
* @TODO 去除字符串首尾的单引号或双引号
* @param source
* @return
*/
private static String removeStartEndQuote(String source) {
if (source == null) {
return source;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
* @modify 2022-10-19 支持对象的多级父类属性的映射
* @modify 2023-05-01 支持多级子对象映射,代码全面改造完全工具类化,无需再依赖SqlToyContext
* @modify 2024-03-15 支持DTO<-->POJO 双向映射中@SqlToyFieldAlias,由gleam反馈
* @modify 2024-05-10 进一步强化对象间映射,增加指定属性映射fieldsMap参数
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class MapperUtils {
Expand Down
Loading

0 comments on commit 06b1cba

Please sign in to comment.