use of org.sagacity.sqltoy.config.model.SqlToyConfig in project sagacity-sqltoy by chenrenfei.
the class SqlXMLConfigParseTest method testChinaParamName.
@Test
public void testChinaParamName() throws Exception {
String sql = "select * from table where 1=1 #[and id=:单据_编号_id] and name like @value(:name) #[and status=:status]";
SqlToyConfig sqlToyConfig = SqlConfigParseUtils.parseSqlToyConfig(sql, "mysql", SqlType.search);
System.err.println(JSON.toJSONString(sqlToyConfig));
}
use of org.sagacity.sqltoy.config.model.SqlToyConfig in project sagacity-sqltoy by chenrenfei.
the class TranslateFactory method doSqlCheck.
/**
* @todo 执行sql检测
* @param sqlToyContext
* @param checkerConfig
* @param preCheckTime
* @return
* @throws Exception
*/
private static List doSqlCheck(final SqlToyContext sqlToyContext, final CheckerConfigModel checkerConfig, Timestamp preCheckTime) throws Exception {
final SqlToyConfig sqlToyConfig = sqlToyContext.getSqlToyConfig(checkerConfig.getSql(), SqlType.search, "");
String dataSourceName = checkerConfig.getDataSource();
if (dataSourceName == null) {
dataSourceName = sqlToyConfig.getDataSource();
}
DataSourceSelector dataSourceSelector = sqlToyContext.getDataSourceSelector();
DataSource dataSource = dataSourceSelector.getDataSource(sqlToyContext.getApplicationContext(), null, dataSourceName, null, sqlToyContext.getDefaultDataSource());
return DialectFactory.getInstance().findByQuery(sqlToyContext, new QueryExecutor(checkerConfig.getSql(), sqlToyConfig.getParamsName(), new Object[] { new Date(preCheckTime.getTime()) }), sqlToyConfig, null, dataSource).getRows();
}
use of org.sagacity.sqltoy.config.model.SqlToyConfig in project sagacity-sqltoy by chenrenfei.
the class DialectUtils method getUnifyParamsNamedConfig.
/**
* @todo 统一将查询的sql参数由?形式变成:named形式(分页和查询随机记录时)
* @param sqlToyContext
* @param sqlToyConfig
* @param queryExecutor
* @param dialect
* @param wrapNamed 只在分页场景下需要将?模式传参统一成:name模式,便于跟后面分页startIndex和endIndex参数结合,从而利用sql预编译功能
* @return
* @throws Exception
*/
public static SqlToyConfig getUnifyParamsNamedConfig(SqlToyContext sqlToyContext, SqlToyConfig sqlToyConfig, QueryExecutor queryExecutor, String dialect, boolean wrapNamed) throws Exception {
QueryExecutorExtend extend = queryExecutor.getInnerModel();
// 本身就是:named参数形式或sql中没有任何参数
boolean isNamed = false;
// 在QueryExecutorBuilder中已经对wrappedParamNames做了判断赋值
if (!extend.wrappedParamNames) {
// sql中是否存在? 形式参数
boolean hasQuestArg = SqlConfigParseUtils.hasQuestMarkArgs(sqlToyConfig.getSql());
isNamed = ((extend.paramsName != null && extend.paramsName.length > 0) || !hasQuestArg);
}
// 以queryExecutor自定义的分表策略覆盖sql xml中定义的
List<ShardingStrategyConfig> tableShardings = sqlToyConfig.getTableShardings();
if (!extend.tableShardings.isEmpty()) {
tableShardings = extend.tableShardings;
}
// sql条件以:named形式、无分表、无扩展缓存翻译则不存在对SqlToyConfig 内容的修改,直接返回
if ((isNamed || !wrapNamed) && tableShardings.isEmpty() && extend.translates.isEmpty()) {
return sqlToyConfig;
}
// clone sqltoyConfig避免直接修改原始的sql配置对后续执行产生影响
SqlToyConfig result = sqlToyConfig.clone();
// 存在扩展的缓存翻译
if (!extend.translates.isEmpty()) {
result.getTranslateMap().putAll(extend.translates);
}
// ?传参且分页模式,原因是分页存在取count场景,在@fast()情况下无法断定paramValues的值跟?的参数对应关系
if (!isNamed && wrapNamed) {
SqlParamsModel sqlParams;
// 存在fast查询
if (result.isHasFast()) {
// @fast 前部分
String fastPreSql = SqlConfigParseUtils.clearDblQuestMark(result.getFastPreSql(null));
sqlParams = convertParamsToNamed(fastPreSql, 0);
fastPreSql = SqlConfigParseUtils.recoverDblQuestMark(sqlParams.getSql());
result.setFastPreSql(fastPreSql);
int index = sqlParams.getParamCnt();
// @fas() 中间部分
String fastSql = SqlConfigParseUtils.clearDblQuestMark(result.getFastSql(null));
sqlParams = convertParamsToNamed(fastSql, index);
fastSql = SqlConfigParseUtils.recoverDblQuestMark(sqlParams.getSql());
result.setFastSql(fastSql);
index = index + sqlParams.getParamCnt();
// 尾部
String tailSql = SqlConfigParseUtils.clearDblQuestMark(result.getFastTailSql(null));
sqlParams = convertParamsToNamed(tailSql, index);
tailSql = SqlConfigParseUtils.recoverDblQuestMark(sqlParams.getSql());
result.setFastTailSql(tailSql);
// 完整sql
result.setSql(fastPreSql.concat(" (").concat(fastSql).concat(") ").concat(tailSql));
// 构造对应?参数个数的:named模式参数名数组
String[] paramsName = new String[index];
for (int i = 0; i < index; i++) {
paramsName[i] = SqlToyConstants.DEFAULT_PARAM_NAME + (i + 1);
}
result.setParamsName(paramsName);
} else {
sqlParams = convertParamsToNamed(SqlConfigParseUtils.clearDblQuestMark(result.getSql(null)), 0);
result.setSql(SqlConfigParseUtils.recoverDblQuestMark(sqlParams.getSql()));
result.setParamsName(sqlParams.getParamsName());
}
// 自定义分页的count sql,一般无需定义
sqlParams = convertParamsToNamed(SqlConfigParseUtils.clearDblQuestMark(result.getCountSql(null)), 0);
result.setCountSql(SqlConfigParseUtils.recoverDblQuestMark(sqlParams.getSql()));
// 清空方言缓存
result.clearDialectSql();
SqlConfigParseUtils.processFastWith(result, dialect);
}
// sharding table 替换sql中的表名称
ShardingUtils.replaceShardingSqlToyConfig(sqlToyContext, result, tableShardings, dialect, extend.getTableShardingParamsName(sqlToyConfig), extend.getTableShardingParamsValue(sqlToyConfig));
return result;
}
use of org.sagacity.sqltoy.config.model.SqlToyConfig in project sagacity-sqltoy by chenrenfei.
the class Elastic method findPage.
/**
* @todo 分页查询
* @param pageModel
* @return
*/
public Page findPage(Page pageModel) {
QueryExecutor queryExecutor = build();
SqlToyConfig sqlToyConfig = sqlToyContext.getSqlToyConfig(sql, SqlType.search, "");
NoSqlConfigModel noSqlConfig = sqlToyConfig.getNoSqlConfigModel();
if (noSqlConfig == null) {
throw new IllegalArgumentException(ERROR_MESSAGE);
}
Page pageResult = null;
try {
if (noSqlConfig.isSqlMode()) {
ElasticEndpoint esConfig = sqlToyContext.getElasticEndpoint(noSqlConfig.getEndpoint());
if (esConfig.isNativeSql()) {
throw new UnsupportedOperationException("elastic native sql pagination is not support!");
}
pageResult = ElasticSqlPlugin.findPage(sqlToyContext, sqlToyConfig, pageModel, queryExecutor);
} else {
pageResult = ElasticSearchPlugin.findPage(sqlToyContext, sqlToyConfig, pageModel, queryExecutor);
}
if (pageResult.getRecordCount() == 0 && sqlToyContext.isPageOverToFirst()) {
pageResult.setPageNo(1L);
}
return pageResult;
} catch (Exception e) {
e.printStackTrace();
throw new DataAccessException(e);
}
}
use of org.sagacity.sqltoy.config.model.SqlToyConfig in project sagacity-sqltoy by chenrenfei.
the class Elastic method findTop.
/**
* @todo 查询前多少条记录
* @param topSize
* @return
*/
public List<?> findTop(final int topSize) {
QueryExecutor queryExecutor = build();
SqlToyConfig sqlToyConfig = sqlToyContext.getSqlToyConfig(sql, SqlType.search, "");
if (sqlToyConfig.getNoSqlConfigModel() == null) {
throw new IllegalArgumentException(ERROR_MESSAGE);
}
try {
if (sqlToyConfig.getNoSqlConfigModel().isSqlMode()) {
return ElasticSqlPlugin.findTop(sqlToyContext, sqlToyConfig, queryExecutor, topSize);
}
return ElasticSearchPlugin.findTop(sqlToyContext, sqlToyConfig, queryExecutor, topSize);
} catch (Exception e) {
e.printStackTrace();
throw new DataAccessException(e);
}
}
Aggregations