org.sagacity.sqltoy.dialect.impl.ImpalaDialect Maven / Gradle / Ivy
package org.sagacity.sqltoy.dialect.impl;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.sagacity.sqltoy.SqlToyConstants;
import org.sagacity.sqltoy.SqlToyContext;
import org.sagacity.sqltoy.callback.DecryptHandler;
import org.sagacity.sqltoy.callback.PreparedStatementResultHandler;
import org.sagacity.sqltoy.callback.ReflectPropsHandler;
import org.sagacity.sqltoy.callback.UpdateRowHandler;
import org.sagacity.sqltoy.config.model.EntityMeta;
import org.sagacity.sqltoy.config.model.PKStrategy;
import org.sagacity.sqltoy.config.model.SqlToyConfig;
import org.sagacity.sqltoy.config.model.SqlType;
import org.sagacity.sqltoy.dialect.Dialect;
import org.sagacity.sqltoy.dialect.utils.DefaultDialectUtils;
import org.sagacity.sqltoy.dialect.utils.DialectExtUtils;
import org.sagacity.sqltoy.dialect.utils.DialectUtils;
import org.sagacity.sqltoy.model.ColumnMeta;
import org.sagacity.sqltoy.model.LockMode;
import org.sagacity.sqltoy.model.QueryExecutor;
import org.sagacity.sqltoy.model.QueryResult;
import org.sagacity.sqltoy.model.StoreResult;
import org.sagacity.sqltoy.model.TableMeta;
import org.sagacity.sqltoy.model.inner.QueryExecutorExtend;
import org.sagacity.sqltoy.utils.BeanUtil;
import org.sagacity.sqltoy.utils.SqlUtil;
import org.sagacity.sqltoy.utils.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @project sqltoy-orm
* @description 提供基于impala对kudu的支持
* @author zhongxuchen
* @version v1.0,Date:2021-8-1
*/
@SuppressWarnings({ "rawtypes" })
public class ImpalaDialect implements Dialect {
/**
* 定义日志
*/
protected final Logger logger = LoggerFactory.getLogger(ImpalaDialect.class);
/**
* 判定为null的函数
*/
public static final String NVL_FUNCTION = "ifnull";
@Override
public boolean isUnique(final SqlToyContext sqlToyContext, Serializable entity, String[] paramsNamed,
Connection conn, final Integer dbType, final String tableName) {
return DialectUtils.isUnique(sqlToyContext, entity, paramsNamed, conn, dbType, tableName,
(entityMeta, realParamNamed, table, topSize) -> {
String queryStr = DialectExtUtils.wrapUniqueSql(entityMeta, realParamNamed, dbType, table);
return queryStr + " limit " + topSize;
});
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#getRandomResult(org. sagacity
* .sqltoy.SqlToyContext, org.sagacity.sqltoy.config.model.SqlToyConfig,
* org.sagacity.sqltoy.model.QueryExecutor, java.lang.Long, java.lang.Long,
* java.sql.Connection)
*/
@Override
public QueryResult getRandomResult(SqlToyContext sqlToyContext, SqlToyConfig sqlToyConfig,
QueryExecutor queryExecutor, final DecryptHandler decryptHandler, Long totalCount, Long randomCount,
Connection conn, final Integer dbType, final String dialect, final int fetchSize, final int maxRows)
throws Exception {
return DefaultDialectUtils.getRandomResult(sqlToyContext, sqlToyConfig, queryExecutor, decryptHandler,
totalCount, randomCount, conn, dbType, dialect, fetchSize, maxRows);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#findPageBySql(org.sagacity
* .sqltoy.SqlToyContext, org.sagacity.sqltoy.config.model.SqlToyConfig,
* org.sagacity.sqltoy.model.QueryExecutor,
* org.sagacity.sqltoy.callback.RowCallbackHandler, java.lang.Long,
* java.lang.Integer, java.sql.Connection)
*/
@Override
public QueryResult findPageBySql(SqlToyContext sqlToyContext, SqlToyConfig sqlToyConfig,
QueryExecutor queryExecutor, final DecryptHandler decryptHandler, Long pageNo, Integer pageSize,
Connection conn, final Integer dbType, final String dialect, final int fetchSize, final int maxRows)
throws Exception {
return DefaultDialectUtils.findPageBySql(sqlToyContext, sqlToyConfig, queryExecutor, decryptHandler, pageNo,
pageSize, conn, dbType, dialect, fetchSize, maxRows);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#findTopBySql(org.sagacity.sqltoy.
* SqlToyContext, org.sagacity.sqltoy.config.model.SqlToyConfig,
* org.sagacity.sqltoy.model.QueryExecutor, double, java.sql.Connection)
*/
@Override
public QueryResult findTopBySql(SqlToyContext sqlToyContext, SqlToyConfig sqlToyConfig, QueryExecutor queryExecutor,
final DecryptHandler decryptHandler, Integer topSize, Connection conn, final Integer dbType,
final String dialect, final int fetchSize, final int maxRows) throws Exception {
return DefaultDialectUtils.findTopBySql(sqlToyContext, sqlToyConfig, queryExecutor, decryptHandler, topSize,
conn, dbType, dialect, fetchSize, maxRows);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#findBySql(org.sagacity.
* sqltoy.config.model.SqlToyConfig, java.lang.String[], java.lang.Object[],
* java.lang.reflect.Type, org.sagacity.sqltoy.callback.RowCallbackHandler,
* java.sql.Connection)
*/
@Override
public QueryResult findBySql(final SqlToyContext sqlToyContext, final SqlToyConfig sqlToyConfig, final String sql,
final Object[] paramsValue, final QueryExecutorExtend queryExecutorExtend,
final DecryptHandler decryptHandler, final Connection conn, final LockMode lockMode, final Integer dbType,
final String dialect, final int fetchSize, final int maxRows) throws Exception {
return DialectUtils.findBySql(sqlToyContext, sqlToyConfig, sql, paramsValue, queryExecutorExtend,
decryptHandler, conn, dbType, 0, fetchSize, maxRows);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#getCountBySql(java.lang .String,
* java.lang.String[], java.lang.Object[], java.sql.Connection)
*/
@Override
public Long getCountBySql(final SqlToyContext sqlToyContext, final SqlToyConfig sqlToyConfig, String sql,
Object[] paramsValue, boolean isLastSql, final Connection conn, final Integer dbType, final String dialect)
throws Exception {
return DialectUtils.getCountBySql(sqlToyContext, sqlToyConfig, sql, paramsValue, isLastSql, conn, dbType);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#saveOrUpdate(org.sagacity.sqltoy.
* SqlToyContext, java.io.Serializable, java.sql.Connection)
*/
@Override
public Long saveOrUpdate(SqlToyContext sqlToyContext, Serializable entity, final String[] forceUpdateFields,
Connection conn, final Integer dbType, final String dialect, final Boolean autoCommit,
final String tableName) throws Exception {
List entities = new ArrayList();
entities.add(entity);
return saveOrUpdateAll(sqlToyContext, entities, sqlToyContext.getBatchSize(), null, forceUpdateFields, conn,
dbType, dialect, autoCommit, tableName);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#saveOrUpdateAll(org.sagacity.sqltoy
* .SqlToyContext, java.util.List, java.sql.Connection)
*/
@Override
public Long saveOrUpdateAll(SqlToyContext sqlToyContext, List> entities, final int batchSize,
ReflectPropsHandler reflectPropsHandler, final String[] forceUpdateFields, Connection conn,
final Integer dbType, final String dialect, final Boolean autoCommit, final String tableName)
throws Exception {
EntityMeta entityMeta = sqlToyContext.getEntityMeta(entities.get(0).getClass());
boolean isAssignPK = isAssignPKValue(entityMeta.getIdStrategy());
String insertSql = DialectExtUtils.generateInsertSql(sqlToyContext.getUnifyFieldsHandler(), dbType, entityMeta,
entityMeta.getIdStrategy(), NVL_FUNCTION, "NEXTVAL FOR " + entityMeta.getSequence(), isAssignPK,
tableName).replaceFirst("(?i)insert ", "upsert ");
return DialectUtils.saveAll(sqlToyContext, entityMeta, entityMeta.getIdStrategy(), isAssignPK, insertSql,
entities, batchSize, reflectPropsHandler, conn, dbType, autoCommit);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#saveAllNotExist(org.sagacity.sqltoy.
* SqlToyContext, java.util.List,
* org.sagacity.sqltoy.callback.ReflectPropsHandler, java.sql.Connection,
* java.lang.Boolean)
*/
@Override
public Long saveAllIgnoreExist(SqlToyContext sqlToyContext, List> entities, final int batchSize,
ReflectPropsHandler reflectPropsHandler, Connection conn, final Integer dbType, final String dialect,
final Boolean autoCommit, final String tableName) throws Exception {
EntityMeta entityMeta = sqlToyContext.getEntityMeta(entities.get(0).getClass());
boolean isAssignPK = isAssignPKValue(entityMeta.getIdStrategy());
String insertSql = DialectExtUtils.generateInsertSql(sqlToyContext.getUnifyFieldsHandler(), dbType, entityMeta,
entityMeta.getIdStrategy(), NVL_FUNCTION, "NEXTVAL FOR " + entityMeta.getSequence(), isAssignPK,
tableName);
return DialectUtils.saveAll(sqlToyContext, entityMeta, entityMeta.getIdStrategy(), isAssignPK, insertSql,
entities, batchSize, reflectPropsHandler, conn, dbType, autoCommit);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#load(java.io.Serializable,
* java.util.List, java.sql.Connection)
*/
@Override
public Serializable load(final SqlToyContext sqlToyContext, Serializable entity, boolean onlySubTables,
List cascadeTypes, LockMode lockMode, Connection conn, final Integer dbType, final String dialect,
final String tableName) throws Exception {
EntityMeta entityMeta = sqlToyContext.getEntityMeta(entity.getClass());
// 获取loadsql(loadsql 可以通过@loadSql进行改变,所以需要sqltoyContext重新获取)
SqlToyConfig sqlToyConfig = sqlToyContext.getSqlToyConfig(entityMeta.getLoadSql(tableName), SqlType.search,
dialect, null);
String loadSql = sqlToyConfig.getSql(dialect);
return (Serializable) DialectUtils.load(sqlToyContext, sqlToyConfig, loadSql, entityMeta, entity, onlySubTables,
cascadeTypes, conn, dbType);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#loadAll(java.util.List,
* java.util.List, java.sql.Connection)
*/
@Override
public List> loadAll(final SqlToyContext sqlToyContext, List> entities, boolean onlySubTables,
List cascadeTypes, LockMode lockMode, Connection conn, final Integer dbType, final String dialect,
final String tableName, final int fetchSize, final int maxRows) throws Exception {
return DialectUtils.loadAll(sqlToyContext, entities, onlySubTables, cascadeTypes, lockMode, conn, dbType,
tableName, null, fetchSize, maxRows);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#save(org.sagacity.sqltoy.
* SqlToyContext , java.io.Serializable, java.util.List, java.sql.Connection)
*/
@Override
public Object save(SqlToyContext sqlToyContext, Serializable entity, Connection conn, final Integer dbType,
final String dialect, final String tableName) throws Exception {
EntityMeta entityMeta = sqlToyContext.getEntityMeta(entity.getClass());
PKStrategy pkStrategy = entityMeta.getIdStrategy();
// 主键值已经存在,则主键策略改为assign,避免跳号
if (pkStrategy != null && (pkStrategy.equals(PKStrategy.IDENTITY) || pkStrategy.equals(PKStrategy.SEQUENCE))) {
Object id = BeanUtil.getProperty(entity, entityMeta.getIdArray()[0]);
if (StringUtil.isNotBlank(id)) {
pkStrategy = PKStrategy.ASSIGN;
}
}
boolean isAssignPK = isAssignPKValue(pkStrategy);
String insertSql = DialectExtUtils.generateInsertSql(sqlToyContext.getUnifyFieldsHandler(), dbType, entityMeta,
pkStrategy, NVL_FUNCTION, "NEXTVAL FOR " + entityMeta.getSequence(), isAssignPK, tableName);
return DialectUtils.save(sqlToyContext, entityMeta, pkStrategy, isAssignPK, insertSql, entity, null, null, conn,
dbType);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#saveAll(org.sagacity.sqltoy.
* SqlToyContext , java.util.List,
* org.sagacity.sqltoy.callback.ReflectPropsHandler, java.sql.Connection)
*/
@Override
public Long saveAll(SqlToyContext sqlToyContext, List> entities, final int batchSize,
ReflectPropsHandler reflectPropsHandler, Connection conn, final Integer dbType, final String dialect,
final Boolean autoCommit, final String tableName) throws Exception {
EntityMeta entityMeta = sqlToyContext.getEntityMeta(entities.get(0).getClass());
boolean isAssignPK = isAssignPKValue(entityMeta.getIdStrategy());
String insertSql = DialectExtUtils.generateInsertSql(sqlToyContext.getUnifyFieldsHandler(), dbType, entityMeta,
entityMeta.getIdStrategy(), NVL_FUNCTION, "NEXTVAL FOR " + entityMeta.getSequence(), isAssignPK,
tableName);
return DialectUtils.saveAll(sqlToyContext, entityMeta, entityMeta.getIdStrategy(), isAssignPK, insertSql,
entities, batchSize, reflectPropsHandler, conn, dbType, autoCommit);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#update(org.sagacity.sqltoy.
* SqlToyContext , java.io.Serializable, java.lang.String[],
* java.sql.Connection)
*/
@Override
public Long update(SqlToyContext sqlToyContext, Serializable entity, String[] forceUpdateFields,
final boolean cascade, final Class[] forceCascadeClasses,
final HashMap subTableForceUpdateProps, Connection conn, final Integer dbType,
final String dialect, final String tableName) throws Exception {
return saveOrUpdate(sqlToyContext, entity, forceUpdateFields, conn, dbType, dialect, null, tableName);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#updateAll(org.sagacity.sqltoy.
* SqlToyContext, java.util.List,
* org.sagacity.sqltoy.callback.ReflectPropsHandler, java.sql.Connection)
*/
@Override
public Long updateAll(SqlToyContext sqlToyContext, List> entities, final int batchSize,
final String[] uniqueFields, final String[] forceUpdateFields, ReflectPropsHandler reflectPropsHandler,
Connection conn, final Integer dbType, final String dialect, final Boolean autoCommit,
final String tableName) throws Exception {
return this.saveOrUpdateAll(sqlToyContext, entities, batchSize, reflectPropsHandler, forceUpdateFields, conn,
dbType, dialect, autoCommit, tableName);
}
@Override
public Serializable updateSaveFetch(SqlToyContext sqlToyContext, Serializable entity,
UpdateRowHandler updateRowHandler, String[] uniqueProps, Connection conn, Integer dbType, String dialect,
String tableName) throws Exception {
// 不支持
throw new UnsupportedOperationException(SqlToyConstants.UN_SUPPORT_MESSAGE);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#delete(org.sagacity.sqltoy.
* SqlToyContext , java.io.Serializable, java.sql.Connection)
*/
@Override
public Long delete(SqlToyContext sqlToyContext, Serializable entity, Connection conn, final Integer dbType,
final String dialect, final String tableName) throws Exception {
return DialectUtils.delete(sqlToyContext, entity, conn, dbType, tableName);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#deleteAll(org.sagacity.sqltoy.
* SqlToyContext, java.util.List, java.sql.Connection)
*/
@Override
public Long deleteAll(SqlToyContext sqlToyContext, List> entities, final int batchSize, Connection conn,
final Integer dbType, final String dialect, final Boolean autoCommit, final String tableName)
throws Exception {
return DefaultDialectUtils.deleteAll(sqlToyContext, entities, batchSize, conn, dbType, autoCommit, tableName);
}
/*
* (non-Javadoc)
*
* @see org.sagacity.sqltoy.dialect.Dialect#updateFatch(org.sagacity.sqltoy.
* SqlToyContext, org.sagacity.sqltoy.config.model.SqlToyConfig,
* org.sagacity.sqltoy.model.QueryExecutor,
* org.sagacity.sqltoy.callback.UpdateRowHandler, java.sql.Connection)
*/
@Override
public QueryResult updateFetch(SqlToyContext sqlToyContext, SqlToyConfig sqlToyConfig, String sql,
Object[] paramsValue, UpdateRowHandler updateRowHandler, Connection conn, final Integer dbType,
final String dialect, final LockMode lockMode, final int fetchSize, final int maxRows) throws Exception {
// 不支持
throw new UnsupportedOperationException(SqlToyConstants.UN_SUPPORT_MESSAGE);
}
@Override
public StoreResult executeStore(SqlToyContext sqlToyContext, final SqlToyConfig sqlToyConfig, final String sql,
final Object[] inParamsValue, final Integer[] outParamsType, final boolean moreResult,
final Connection conn, final Integer dbType, final String dialect, final int fetchSize) throws Exception {
return DialectUtils.executeStore(sqlToyConfig, sqlToyContext, sql, inParamsValue, outParamsType, moreResult,
conn, dbType, fetchSize);
}
@SuppressWarnings("unchecked")
@Override
public List getTableColumns(String catalog, String schema, String tableName, Connection conn,
Integer dbType, String dialect) throws Exception {
List tableCols = DefaultDialectUtils.getTableColumns(catalog, schema, tableName, conn, dbType,
dialect);
// 获取主键信息
PreparedStatement pst = conn.prepareStatement("DESCRIBE " + tableName);
ResultSet rs = pst.executeQuery();
Map colMap = (Map) SqlUtil.preparedStatementProcess(null, pst, rs,
new PreparedStatementResultHandler() {
@Override
public void execute(Object rowData, PreparedStatement pst, ResultSet rs) throws Exception {
Map colComments = new HashMap();
while (rs.next()) {
ColumnMeta colMeta = new ColumnMeta();
colMeta.setColName(rs.getString("NAME"));
colMeta.setPK(rs.getBoolean("PRIMARY_KEY"));
colComments.put(colMeta.getColName(), colMeta);
}
this.setResult(colComments);
}
});
ColumnMeta mapColMeta;
for (ColumnMeta col : tableCols) {
mapColMeta = colMap.get(col.getColName());
if (mapColMeta != null) {
col.setPK(mapColMeta.isPK());
}
}
return tableCols;
}
@Override
public List getTables(String catalog, String schema, String tableName, Connection conn, Integer dbType,
String dialect) throws Exception {
return DefaultDialectUtils.getTables(catalog, schema, tableName, conn, dbType, dialect);
}
public static boolean isAssignPKValue(PKStrategy pkStrategy) {
if (pkStrategy == null) {
return true;
}
// 目前不支持sequence模式
if (pkStrategy.equals(PKStrategy.SEQUENCE)) {
return false;
}
if (pkStrategy.equals(PKStrategy.IDENTITY)) {
return true;
}
return true;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy