Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.anyline.data.jdbc.adapter.init.AbstractJDBCAdapter Maven / Gradle / Ivy
/*
* Copyright 2006-2023 www.anyline.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.anyline.data.jdbc.adapter.init;
import org.anyline.adapter.KeyAdapter;
import org.anyline.data.adapter.init.AbstractDriverAdapter;
import org.anyline.data.entity.Join;
import org.anyline.data.jdbc.adapter.JDBCAdapter;
import org.anyline.data.param.ConfigParser;
import org.anyline.data.param.ConfigStore;
import org.anyline.data.param.init.DefaultConfigStore;
import org.anyline.data.prepare.RunPrepare;
import org.anyline.data.prepare.auto.AutoPrepare;
import org.anyline.data.prepare.auto.init.DefaultTextPrepare;
import org.anyline.data.run.*;
import org.anyline.data.runtime.DataRuntime;
import org.anyline.entity.*;
import org.anyline.entity.authorize.Privilege;
import org.anyline.entity.authorize.Role;
import org.anyline.entity.authorize.User;
import org.anyline.entity.generator.PrimaryGenerator;
import org.anyline.exception.CommandException;
import org.anyline.exception.CommandQueryException;
import org.anyline.exception.CommandUpdateException;
import org.anyline.exception.NotSupportException;
import org.anyline.metadata.*;
import org.anyline.metadata.refer.MetadataFieldRefer;
import org.anyline.metadata.type.DatabaseType;
import org.anyline.metadata.type.TypeMetadata;
import org.anyline.proxy.CacheProxy;
import org.anyline.proxy.EntityAdapterProxy;
import org.anyline.proxy.InterceptorProxy;
import org.anyline.util.*;
import org.anyline.util.encrypt.MD5Util;
import org.anyline.util.regular.RegularUtil;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.*;
/**
* SQL生成 子类主要实现与分页相关的SQL 以及delimiter
*/
public class AbstractJDBCAdapter extends AbstractDriverAdapter implements JDBCAdapter {
public AbstractJDBCAdapter() {
super();
}
@Override
public DatabaseType type() {
return DatabaseType.COMMON;
}
@Override
public boolean supportCatalog() {
return true;
}
@Override
public boolean supportSchema() {
return true;
}
/*
protected JdbcTemplate jdbc(DataRuntime runtime) {
Object processor = runtime.getProcessor();
return (JdbcTemplate) processor;
}
*/
private static Map types = new HashMap<>();
static {
types.put(Table.TYPE.NORMAL, "BASE TABLE");
types.put(Table.TYPE.VIEW, "VIEW");
types.put(View.TYPE.NORMAL, "VIEW");
types.put(Metadata.TYPE.TABLE, "BASE TABLE");
types.put(Metadata.TYPE.VIEW, "VIEW");
}
@Override
public String name(Type type) {
return types.get(type);
}
/**
* 验证运行环境与当前适配器是否匹配
* 默认不连接只根据连接参数
* 只有同一个种区分不同版本(如mmsql2000/mssql2005)或不同模式(如kingbase的oracle/pg模式)时才需要单独实现
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param compensate 是否补偿匹配,第一次失败后,会再匹配一次,第二次传入true
* @return boolean
*/
@Override
public boolean match(DataRuntime runtime, String feature, String adapterKey, boolean compensate) {
return super.match(runtime, feature, adapterKey, compensate);
}
@Override
public boolean match(String feature, List keywords, boolean compensate) {
return super.match(feature, keywords, compensate);
}
/* *****************************************************************************************************************
*
* DML
*
* =================================================================================================================
* INSERT : 插入
* UPDATE : 更新
* SAVE : 根据情况插入或更新
* QUERY : 查询(RunPrepare/XML/TABLE/VIEW/PROCEDURE)
* EXISTS : 是否存在
* COUNT : 统计
* EXECUTE : 执行(原生SQL及存储过程)
* DELETE : 删除
*
******************************************************************************************************************/
/* *****************************************************************************************************************
* INSERT
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* long insert(DataRuntime runtime, String random, int batch, Table dest, Object data, ConfigStore configs, List columns)
* [命令合成]
* public Run buildInsertRun(DataRuntime runtime, int batch, Table dest, Object obj, ConfigStore configs, List columns)
* public void fillInsertContent(DataRuntime runtime, Run run, Table dest, DataSet set, ConfigStore configs, LinkedHashMap columns)
* public void fillInsertContent(DataRuntime runtime, Run run, Table dest, Collection list, ConfigStore configs, LinkedHashMap columns)
* public LinkedHashMap confirmInsertColumns(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns, boolean batch)
* public String batchInsertSeparator()
* public boolean supportInsertPlaceholder()
* protected Run createInsertRun(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns)
* protected Run createInsertRunFromCollection(DataRuntime runtime, int batch, Table dest, Collection list, ConfigStore configs, List columns)
* public String generatedKey()
* [命令执行]
* long insert(DataRuntime runtime, String random, Object data, ConfigStore configs, Run run, String[] pks);
******************************************************************************************************************/
/**
* insert [调用入口]
* 执行前根据主键生成器补充主键值, 执行完成后会补齐自增主键值
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param data 需要插入入的数据
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须插入
* -:表示必须不插入
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return 影响行数
*/
@Override
public long insert(DataRuntime runtime, String random, int batch, Table dest, Object data, ConfigStore configs, List columns) {
return super.insert(runtime, random, batch, dest, data, configs, columns);
}
/**
* insert into table select * from table
* 与query参数一致
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 插入表
* @param prepare 查询表
* @param configs 查询条件及相关配置
* @param obj 查询条件
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return 影响行数
*/
@Override
public long insert(DataRuntime runtime, String random, Table dest, RunPrepare prepare, ConfigStore configs, Object obj, String ... conditions) {
String name = dest.getName();
if(name.contains("(")) {
String[] cols = name.substring(name.indexOf("(")+1, name.lastIndexOf(")")).split(",");
for(String col:cols) {
dest.addColumn(new Column(col));
}
dest.setName(name.substring(0, name.indexOf("(")));
}
if(null == random) {
random = random(runtime);
}
ACTION.SWITCH swt = ACTION.SWITCH.CONTINUE;
boolean cmd_success = false;
swt = InterceptorProxy.prepareInsert(runtime, random, dest, prepare, configs);
if(swt == ACTION.SWITCH.BREAK) {
return -1;
}
if(null != dmListener) {
swt = dmListener.prepareInsert(runtime, random, dest, prepare, configs);
}
if(swt == ACTION.SWITCH.BREAK) {
return -1;
}
Run run = buildInsertRun(runtime, dest, prepare, configs, obj, conditions);
//提前设置好columns,到了adapter中需要手动检测缓存
if(ConfigStore.IS_AUTO_CHECK_METADATA(configs)) {
dest.setColumns(columns(runtime, random, false, dest, false));
}
if(null == run) {
return 0;
}
long cnt = 0;
long fr = System.currentTimeMillis();
long millis = -1;
swt = InterceptorProxy.beforeInsert(runtime, random, run, dest, prepare, configs);
if(swt == ACTION.SWITCH.BREAK) {
return -1;
}
if(null != dmListener) {
swt = dmListener.beforeInsert(runtime, random, run, dest, prepare, configs);
}
if(swt == ACTION.SWITCH.BREAK) {
return -1;
}
cnt = insert(runtime, random, prepare, configs, run, null);
if (null != dmListener) {
dmListener.afterInsert(runtime, random, run, cnt, dest, prepare, configs, cmd_success, cnt, millis);
}
InterceptorProxy.afterInsert(runtime, random, run, dest, prepare, configs, cmd_success, cnt, System.currentTimeMillis() - fr);
return cnt;
}
/**
* insert [命令合成]
* 填充inset命令内容(创建批量INSERT RunPrepare)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析,表名可以事实前缀<数据源名>表示切换数据源
* @param prepare 查询
* @param configs 过滤条件及相关配置
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public Run buildInsertRun(DataRuntime runtime, Table dest, RunPrepare prepare, ConfigStore configs, Object obj, String ... conditions) {
Run run = new TableRun(runtime, dest);
StringBuilder builder = run.getBuilder();
if(BasicUtil.isEmpty(dest)) {
throw new CommandException("未指定表");
}
checkName(runtime, null, dest);
builder.append("INSERT INTO ");
name(runtime, builder, dest);
LinkedHashMap cols = dest.getColumns();
if(null != cols && !cols.isEmpty()) {
builder.append("(");
boolean first = true;
for(Column col:cols.values()) {
if(!first) {
builder.append(", ");
}
first = false;
name(runtime, builder, col);
}
builder.append(")");
}
builder.append("\n");
Run query = buildQueryRun(runtime, prepare, configs, conditions);
if (query.isValid()) {
String cmd = query.getFinalQuery();
builder.append(cmd);
run.setValues(query.getRunValues());
}
return run;
}
/**
* insert [命令合成]
* 填充inset命令内容(创建批量INSERT RunPrepare)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param obj 需要插入的数据
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public Run buildInsertRun(DataRuntime runtime, int batch, Table dest, Object obj, ConfigStore configs, List columns) {
return super.buildInsertRun(runtime, batch, dest, obj, configs, columns);
}
/**
* insert [命令合成-子流程]
* 填充inset命令内容(创建批量INSERT RunPrepare)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param set 需要插入的数据集合
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
*/
@Override
public void fillInsertContent(DataRuntime runtime, Run run, Table dest, DataSet set, ConfigStore configs, LinkedHashMap columns) {
StringBuilder builder = run.getBuilder();
int batch = run.getBatch();
if(null == builder) {
builder = new StringBuilder();
run.setBuilder(builder);
}
LinkedHashMap pks = null;
checkName(runtime, null, dest);
PrimaryGenerator generator = checkPrimaryGenerator(type(), dest.getName());
if(null != generator) {
pks = set.getRow(0).getPrimaryColumns();
columns.putAll(pks);
}
String head = insertHead(configs);
builder.append(head);
name(runtime, builder, dest);//.append(parseTable(dest));
if(dest instanceof PartitionTable) {
PartitionTable pt = (PartitionTable)dest;
fillInsertCreateTemplate(runtime, run, pt, configs);
}
builder.append("(");
delimiter(builder, Column.names(columns));
builder.append(")");
builder.append(" VALUES ");
int dataSize = set.size();
boolean el = ConfigStore.IS_AUTO_CHECK_EL_VALUE(configs);
for(int i=0; i
* 填充inset命令内容(创建批量INSERT RunPrepare)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param list 需要插入的数据集合
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
*/
@Override
public void fillInsertContent(DataRuntime runtime, Run run, Table dest, Collection list, ConfigStore configs, LinkedHashMap columns) {
StringBuilder builder = run.getBuilder();
int batch = run.getBatch();
if(null == builder) {
builder = new StringBuilder();
run.setBuilder(builder);
}
checkName(runtime, null, dest);
if(list instanceof DataSet) {
DataSet set = (DataSet) list;
this.fillInsertContent(runtime, run, dest, set, configs, columns);
return;
}
PrimaryGenerator generator = checkPrimaryGenerator(type(), dest.getName());
Object first = list.iterator().next();
LinkedHashMap pks = null;
if(null != generator) {
pks = EntityAdapterProxy.primaryKeys(first.getClass());
columns.putAll(pks);
}
String head = insertHead(configs);
builder.append(head);//
name(runtime, builder, dest);// .append(parseTable(dest));
if(dest instanceof PartitionTable) {
PartitionTable pt = (PartitionTable)dest;
fillInsertCreateTemplate(runtime, run, pt, configs);
}
builder.append("(");
delimiter(builder, Column.names(columns));
builder.append(")");
builder.append(" VALUES ");
boolean el = ConfigStore.IS_AUTO_CHECK_EL_VALUE(configs);
int dataSize = list.size();
int idx = 0;
for(Object obj:list) {
/*if(obj instanceof DataRow) {
DataRow row = (DataRow)obj;
if (row.hasPrimaryKeys() && BasicUtil.isEmpty(row.getPrimaryValue())) {
createPrimaryValue(row, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), row.getPrimaryKeys(), null);
}
insertValue(template, run, row, true, false, true, keys);
}else{*/
boolean create = EntityAdapterProxy.createPrimaryValue(obj, Column.names(columns));
if(!create && null != generator) {
generator.create(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), pks, null);
//createPrimaryValue(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), null, null);
}
builder.append(insertValue(runtime, run, obj, idx ==0,true, true, false, true, el, columns));
//}
if(idx
* 确认需要插入的列
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param obj Entity或DataRow
* @param batch 是否批量,批量时不检测值是否为空
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须插入
* -:表示必须不插入
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return List
*/
@Override
public LinkedHashMap confirmInsertColumns(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns, boolean batch) {
return super.confirmInsertColumns(runtime, dest, obj, configs, columns, batch);
}
/**
* insert [命令合成-子流程]
* 批量插入数据时, 多行数据之间分隔符
* @return String
*/
@Override
public String batchInsertSeparator() {
return ",";
}
/**
* insert [命令合成-子流程]
* 插入数据时是否支持占位符
* @return boolean
*/
@Override
public boolean supportInsertPlaceholder() {
return true;
}
/**
* insert [命令合成-子流程]
* 设置主键值
* @param obj obj
* @param value value
*/
@Override
protected void setPrimaryValue(Object obj, Object value) {
super.setPrimaryValue(obj, value);
}
/**
* insert [命令合成-子流程]
* 根据entity创建 INSERT RunPrepare由buildInsertRun调用
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param obj 数据
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
protected Run createInsertRun(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns) {
Run run = new TableRun(runtime, dest);
// List values = new ArrayList();
StringBuilder builder = run.getBuilder();
if(BasicUtil.isEmpty(dest)) {
throw new CommandException("未指定表");
}
if(null == configs) {
configs = new DefaultConfigStore();
}
checkName(runtime, null, dest);
PrimaryGenerator generator = checkPrimaryGenerator(type(), dest.getName());
Boolean placeholder = configs.getPlaceholder();
if(null == placeholder) {
placeholder = true;
}
Boolean unicode = null;
int type = 1;
StringBuilder valuesBuilder = new StringBuilder();
DataRow row = null;
if(obj instanceof Map) {
if(!(obj instanceof DataRow)) {
obj = new DataRow((Map) obj);
}
}
if(obj instanceof DataRow) {
row = (DataRow)obj;
unicode = row.getUnicode();
if(row.hasPrimaryKeys() && null != generator) {
generator.create(row, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), row.getPrimaryKeys(), null);
//createPrimaryValue(row, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), row.getPrimaryKeys(), null);
}
}else{
type = 2;
boolean create = EntityAdapterProxy.createPrimaryValue(obj, columns);
LinkedHashMap pks = EntityAdapterProxy.primaryKeys(obj.getClass());
if(!create && null != generator) {
generator.create(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), pks, null);
//createPrimaryValue(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), null, null);
}
}
if(null == unicode) {
unicode = configs.getUnicode();
}
run.setOriginType(type);
/*确定需要插入的列*/
LinkedHashMap cols = confirmInsertColumns(runtime, dest, obj, configs, columns, false);
if(null == cols || cols.isEmpty()) {
throw new CommandException("未指定列(DataRow或Entity中没有需要插入的属性值)["+obj.getClass().getName()+":"+BeanUtil.object2json(obj)+"]");
}
boolean replaceEmptyNull = false;
if(obj instanceof DataRow) {
row = (DataRow)obj;
replaceEmptyNull = row.isReplaceEmptyNull();
}else{
replaceEmptyNull = ConfigStore.IS_REPLACE_EMPTY_NULL(configs);
}
boolean el = ConfigStore.IS_AUTO_CHECK_EL_VALUE(configs);
String head = insertHead(configs);
builder.append(head);//.append(parseTable(dest));
name(runtime, builder, dest);
builder.append("(");
valuesBuilder.append(") VALUES (");
List insertColumns = new ArrayList<>();
boolean first = true;
for(Column column:cols.values()) {
if(!first) {
builder.append(", ");
valuesBuilder.append(", ");
}
first = false;
String key = column.getName();
Object value = null;
if(!(obj instanceof Map) && EntityAdapterProxy.hasAdapter(obj.getClass())) {
value = BeanUtil.getFieldValue(obj, EntityAdapterProxy.field(obj.getClass(), key));
}else{
value = BeanUtil.getFieldValue(obj, key, true);
}
String str = null;
if(value instanceof String) {
str = (String)value;
}
delimiter(builder, key);
//if (str.startsWith("${") && str.endsWith("}")) {
if (el && BasicUtil.checkEl(str)) {
value = str.substring(2, str.length()-1);
valuesBuilder.append(value);
}else if(value instanceof SQL_BUILD_IN_VALUE) {
//内置函数值
value = value(runtime, null, (SQL_BUILD_IN_VALUE)value);
valuesBuilder.append(value);
}else{
insertColumns.add(key);
if(supportInsertPlaceholder() && placeholder) {
//valuesBuilder.append("?");
value = convert(runtime, valuesBuilder, value, column, true, unicode, configs);
if ("NULL".equals(value)) {
value = null;
}else if("".equals(value) && replaceEmptyNull) {
value = null;
}
addRunValue(runtime, run, Compare.EQUAL, column, value);
}else{
if(null == unicode) {
unicode = false;
}
//Object write = write(runtime, null, value, false, unicode);
//valuesBuilder.append(write);
convert(runtime, valuesBuilder, value, column, false, unicode, configs);
}
}
}
valuesBuilder.append(")");
builder.append(valuesBuilder);
builder.append(insertFoot(configs, cols));
run.setInsertColumns(insertColumns);
return run;
}
/**
* insert [命令合成-子流程]
* 根据collection创建 INSERT RunPrepare由buildInsertRun调用
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param list 对象集合
* @param columns 需要插入的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
protected Run createInsertRunFromCollection(DataRuntime runtime, int batch, Table dest, Collection list, ConfigStore configs, List columns) {
return super.createInsertRunFromCollection(runtime, batch, dest, list, configs, columns);
}
/**
* insert [after]
* 执行insert后返回自增主键的key
* @return String
*/
@Override
public String generatedKey() {
return super.generatedKey();
}
/**
* insert [命令执行]
*
* 执行完成后会补齐自增主键值
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param data data
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @param pks 需要返回的主键
* @return 影响行数
*/
@Override
public long insert(DataRuntime runtime, String random, Object data, ConfigStore configs, Run run, String[] pks) {
return super.insert(runtime, random, data, configs, run, pks);
}
/* *****************************************************************************************************************
* UPDATE
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* long update(DataRuntime runtime, String random, int batch, Table dest, Object data, ConfigStore configs, List columns)
* [命令合成]
* Run buildUpdateRun(DataRuntime runtime, int batch, Table dest, Object obj, ConfigStore configs, List columns)
* Run buildUpdateRunFromEntity(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, LinkedHashMap columns)
* Run buildUpdateRunFromDataRow(DataRuntime runtime, Table dest, DataRow row, ConfigStore configs, LinkedHashMap columns)
* Run buildUpdateRunFromCollection(DataRuntime runtime, int batch, Table dest, Collection list, ConfigStore configs, LinkedHashMap columns)
* LinkedHashMap confirmUpdateColumns(DataRuntime runtime, Table dest, DataRow row, ConfigStore configs, List columns)
* LinkedHashMap confirmUpdateColumns(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns)
* [命令执行]
* long update(DataRuntime runtime, String random, Table dest, Object data, ConfigStore configs, Run run)
******************************************************************************************************************/
/**
* UPDATE [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param data 数据
* @param configs 条件
* @param columns 需要插入或更新的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须更新
* -:表示必须不更新
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return 影响行数
*/
@Override
public long update(DataRuntime runtime, String random, int batch, Table dest, Object data, ConfigStore configs, List columns) {
return super.update(runtime, random, batch, dest, data, configs, columns);
}
/**
* update [命令合成]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param obj Entity或DtaRow
* @param configs 更新条件
* @param columns 需要插入或更新的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须更新
* -:表示必须不更新
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public Run buildUpdateRun(DataRuntime runtime, int batch, Table dest, Object obj, ConfigStore configs, List columns) {
return super.buildUpdateRun(runtime, batch, dest, obj, configs, columns);
}
@Override
public Run buildUpdateRunFromEntity(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromEntity(runtime, dest, obj, configs, columns);
}
@Override
public Run buildUpdateRunFromDataRow(DataRuntime runtime, Table dest, DataRow row, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromDataRow(runtime, dest, row, configs, columns);
}
@Override
public Run buildUpdateRunFromCollection(DataRuntime runtime, int batch, Table dest, Collection list, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromCollection(runtime, batch, dest, list, configs, columns);
}
@Override
public Run buildUpdateRunFromEntity(DataRuntime runtime, String dest, Object obj, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromEntity(runtime, dest, obj, configs, columns);
}
@Override
public Run buildUpdateRunFromDataRow(DataRuntime runtime, String dest, DataRow row, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromDataRow(runtime, dest, row, configs, columns);
}
@Override
public Run buildUpdateRunFromCollection(DataRuntime runtime, int batch, String dest, Collection list, ConfigStore configs, LinkedHashMap columns) {
return super.buildUpdateRunFromCollection(runtime, batch, dest, list, configs, columns);
}
/**
* update [命令合成-子流程]
* 确认需要更新的列
* @param row DataRow
* @param configs 更新条件
* @param columns 需要插入或更新的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须更新
* -:表示必须不更新
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return List
*/
@Override
public LinkedHashMap confirmUpdateColumns(DataRuntime runtime, Table dest, DataRow row, ConfigStore configs, List columns) {
return super.confirmUpdateColumns(runtime, dest, row, configs, columns);
}
@Override
public LinkedHashMap confirmUpdateColumns(DataRuntime runtime, Table dest, Object obj, ConfigStore configs, List columns) {
return super.confirmUpdateColumns(runtime, dest, obj, configs, columns);
}
/**
* update [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param data 数据
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return 影响行数
*/
@Override
public long update(DataRuntime runtime, String random, Table dest, Object data, ConfigStore configs, Run run) {
return super.update(runtime, random, dest, data, configs, run);
}
/**
* save [调用入口]
*
* 根据是否有主键值确认insert | update
* 执行完成后会补齐自增主键值
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param data 数据
* @param configs 更新条件
* @param columns 需要插入或更新的列,如果不指定则根据data或configs获取注意会受到ConfigTable中是否插入更新空值的几个配置项影响
* 列可以加前缀
* +:表示必须更新
* -:表示必须不更新
* ?:根据是否有值
*
* 如果没有提供columns, 长度为0也算没有提供
* 则解析obj(遍历所有的属性工Key)获取insert列
*
* 如果提供了columns则根据columns获取insert列
*
* 但是columns中出现了添加前缀列, 则解析完columns后, 继续解析obj
*
* 以上执行完后, 如果开启了ConfigTable.IS_AUTO_CHECK_METADATA=true
* 则把执行结果与表结构对比, 删除表中没有的列
* @return 影响行数
*/
@Override
public long save(DataRuntime runtime, String random, Table dest, Object data, ConfigStore configs, List columns) {
return super.save(runtime, random, dest, data, configs, columns);
}
@Override
protected long saveCollection(DataRuntime runtime, String random, Table dest, Collection> data, ConfigStore configs, List columns) {
return super.saveCollection(runtime, random, dest, data, configs, columns);
}
@Override
protected long saveObject(DataRuntime runtime, String random, Table dest, Object data, ConfigStore configs, List columns) {
return super.saveObject(runtime, random, dest, data, configs, columns);
}
@Override
protected Boolean checkOverride(Object obj, ConfigStore configs) {
return super.checkOverride(obj, configs);
}
@Override
protected Boolean checkOverrideSync(Object obj, ConfigStore configs) {
return super.checkOverrideSync(obj, configs);
}
@Override
protected Map checkPv(Object obj) {
return super.checkPv(obj);
}
/**
* 是否是可以接收数组类型的值
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @param key key
* @return boolean
*/
@Override
protected boolean isMultipleValue(DataRuntime runtime, TableRun run, String key) {
return super.isMultipleValue(runtime, run, key);
}
@Override
protected boolean isMultipleValue(Column column) {
return super.isMultipleValue(column);
}
/**
* 过滤掉表结构中不存在的列
* @param table 表
* @param columns columns
* @return List
*/
@Override
public LinkedHashMap checkMetadata(DataRuntime runtime, Table table, ConfigStore configs, LinkedHashMap columns) {
return super.checkMetadata(runtime, table, configs, columns);
}
/* *****************************************************************************************************************
* QUERY
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* DataSet querys(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions)
* DataSet querys(DataRuntime runtime, String random, Procedure procedure, PageNavi navi)
* EntitySet selects(DataRuntime runtime, String random, RunPrepare prepare, Class clazz, ConfigStore configs, String... conditions)
* List> maps(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions)
* [命令合成]
* Run buildQueryRun(DataRuntime runtime, RunPrepare prepare, ConfigStore configs, String ... conditions)
* List buildQuerySequence(DataRuntime runtime, boolean next, String ... names)
* Run fillQueryContent(DataRuntime runtime, Run run)
* String mergeFinalQuery(DataRuntime runtime, Run run)
* RunValue createConditionLike(DataRuntime runtime, StringBuilder builder, Compare compare, Object value, boolean placeholder, boolean unicode)
* Object createConditionFindInSet(DataRuntime runtime, StringBuilder builder, String column, Compare compare, Object value, boolean placeholder, boolean unicode)
* StringBuilder createConditionIn(DataRuntime runtime, StringBuilder builder, Compare compare, Object value, boolean placeholder, boolean unicode)
* [命令执行]
* DataSet select(DataRuntime runtime, String random, boolean system, String table, ConfigStore configs, Run run)
* List> maps(DataRuntime runtime, String random, ConfigStore configs, Run run)
* Map map(DataRuntime runtime, String random, ConfigStore configs, Run run)
* DataRow sequence(DataRuntime runtime, String random, boolean next, String ... names)
* List> process(DataRuntime runtime, List> list)
******************************************************************************************************************/
/**
* query [调用入口]
*
* 返回DataSet中包含元数据信息,如果性能有要求换成maps
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 过滤条件及相关配置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return DataSet
*/
@Override
public DataSet querys(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.querys(runtime, random, prepare, configs, conditions);
}
/**
* query procedure [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param procedure 存储过程
* @param navi 分页
* @return DataSet
*/
@Override
public DataSet querys(DataRuntime runtime, String random, Procedure procedure, PageNavi navi) {
DataSet set = null;
final List inputs = procedure.getInputs();
final List outputs = procedure.getOutputs();
if(ConfigTable.IS_LOG_SQL && log.isInfoEnabled()) {
log.info("{}[action:procedure][cmd:\n{}\n][input param:{}]\n[output param:{}]", random, procedure.getName(), LogUtil.param(inputs), LogUtil.param(outputs));
}
long millis = -1;
try{
ACTION.SWITCH swt = InterceptorProxy.prepareQuery(runtime, random, procedure, navi);
if(swt == ACTION.SWITCH.BREAK) {
return new DataSet();
}
swt = InterceptorProxy.beforeQuery(runtime, random, procedure, navi);
if(swt == ACTION.SWITCH.BREAK) {
return new DataSet();
}
if(null != dmListener) {
dmListener.beforeQuery(runtime, random, procedure);
}
long fr = System.currentTimeMillis();
set = actuator.querys(this, runtime, random, procedure, navi);
millis = System.currentTimeMillis() - fr;
boolean slow = false;
long SLOW_SQL_MILLIS = ConfigTable.SLOW_SQL_MILLIS;
if(SLOW_SQL_MILLIS > 0 && ConfigTable.IS_LOG_SLOW_SQL) {
if(millis > SLOW_SQL_MILLIS) {
log.warn("{}[slow cmd][action:procedure][执行耗时:{}][cmd:\n{}\n][input param:{}]\n[output param:{}]"
, random
, DateUtil.format(millis)
, procedure.getName()
, LogUtil.param(inputs)
, LogUtil.param(outputs));
if(null != dmListener) {
dmListener.slow(runtime, random, ACTION.DML.PROCEDURE, null, procedure.getName(), inputs, outputs, true, set, millis);
}
}
}
/* if(null != queryInterceptor) {
queryInterceptor.after(procedure, set, millis);
}*/
if(!slow && ConfigTable.IS_LOG_SQL_TIME && log.isInfoEnabled()) {
log.info("{}[action:procedure][执行耗时:{}]", random, DateUtil.format(millis));
}
}catch(Exception e) {
if(ConfigTable.IS_PRINT_EXCEPTION_STACK_TRACE) {
log.error("query 异常:", e);
}
if(ConfigTable.IS_THROW_SQL_QUERY_EXCEPTION) {
CommandQueryException ex = new CommandQueryException("query异常:"+e.toString(), e);
throw ex;
}else{
if(ConfigTable.IS_LOG_SQL_WHEN_ERROR) {
log.error("{}[{}][action:procedure][cmd:\n{}\n]\n[input param:{}]\n[output param:{}]"
, random
, LogUtil.format("存储过程查询异常:", 33)+e.toString()
, procedure.getName()
, LogUtil.param(inputs)
, LogUtil.param(outputs));
}
}
}
return set;
}
/**
* query [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param clazz 类
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 过滤条件及相关配置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return EntitySet
* @param Entity
*/
@Override
public EntitySet selects(DataRuntime runtime, String random, RunPrepare prepare, Class clazz, ConfigStore configs, String ... conditions) {
return super.selects(runtime, random, prepare, clazz, configs, conditions);
}
/**
* select [命令执行-子流程]
* DataRow转换成Entity
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param clazz entity class
* @param table table
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return EntitySet
* @param entity.class
*
*/
@Override
protected EntitySet select(DataRuntime runtime, String random, Class clazz, Table table, ConfigStore configs, Run run) {
return super.select(runtime, random, clazz, table, configs, run);
}
/**
* query [调用入口]
*
* 对性能有要求的场景调用,返回java原生map集合, 结果中不包含元数据信息
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 过滤条件及相关配置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return maps 返回map集合
*/
@Override
public List> maps(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.maps(runtime, random, prepare, configs, conditions);
}
/**
* select[命令合成] 最终可执行命令
* 创建查询SQL
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 过滤条件及相关配置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public Run buildQueryRun(DataRuntime runtime, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.buildQueryRun(runtime, prepare, configs, conditions);
}
/**
* 查询序列cur 或 next value
* @param next 是否生成返回下一个序列 false:cur true:next
* @param names 序列名
* @return String
*/
@Override
public List buildQuerySequence(DataRuntime runtime, boolean next, String ... names) {
return super.buildQuerySequence(runtime, next, names);
}
/**
* select[命令合成-子流程]
* 构造查询主体
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
*/
@Override
public Run fillQueryContent(DataRuntime runtime, Run run) {
return super.fillQueryContent(runtime, run);
}
@Override
protected Run fillQueryContent(DataRuntime runtime, XMLRun run) {
return super.fillQueryContent(runtime, run);
}
@Override
protected Run fillQueryContent(DataRuntime runtime, TextRun run) {
return super.fillQueryContent(runtime, run);
}
@Override
protected Run fillQueryContent(DataRuntime runtime, StringBuilder builder, TableRun run) {
return super.fillQueryContent(runtime, builder, run);
}
@Override
protected Run fillQueryContent(DataRuntime runtime, TableRun run) {
StringBuilder builder = run.getBuilder();
fillQueryContent(runtime, builder, run);
//UNION
List unions = run.getUnions();
if(null != unions) {
for(Run union:unions) {
builder.append("\n UNION ");
if(union.isUnionAll()) {
builder.append(" ALL ");
}
builder.append("\n");
fillQueryContent(runtime, builder, union);
run.getRunValues().addAll(union.getRunValues());
}
}
run.appendOrderStore();
run.checkValid();
return run;
}
/**
* select[命令合成-子流程]
* 合成最终 select 命令 包含分页 排序
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return String
*/
@Override
public String mergeFinalQuery(DataRuntime runtime, Run run) {
return super.mergeFinalQuery(runtime, run);
}
/**
* select[命令合成-子流程]
* 构造 LIKE 查询条件
* 如果不需要占位符 返回null 否则原样返回value
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param builder builder
* @param compare 比较方式 默认 equal 多个值默认 in
* @param value value
* @return value 有占位符时返回占位值,没有占位符返回null
*/
@Override
public RunValue createConditionLike(DataRuntime runtime, StringBuilder builder, Compare compare, Object value, boolean placeholder, boolean unicode) {
RunValue rv = new RunValue();
int code = compare.getCode();
if(code > 100) {
builder.append(" NOT");
code = code - 100;
}
// %A% 50
// A% 51
// %A 52
// NOT %A% 150
// NOT A% 151
// NOT %A 152
if(null == value) {
value = "";
}
if(placeholder) {
if (compare == Compare.LIKE_SIMPLE) {
builder.append(" LIKE ?");
} else if (code == 50) {
builder.append(" LIKE ").append(concat(runtime, "'%'", "?", "'%'"));
} else if (code == 51) {
builder.append(" LIKE ").append(concat(runtime, "?", "'%'"));
} else if (code == 52) {
builder.append(" LIKE ").append(concat(runtime, "'%'", "?"));
}
rv.setValue(value);
}else{
value = BeanUtil.first(value);
rv.setPlaceholder(false);
if (compare == Compare.LIKE_SIMPLE) {
builder.append(" LIKE '").append(value).append("'");
} else if (code == 50) {
builder.append(" LIKE '%").append(value).append("%'");
} else if (code == 51) {
builder.append(" LIKE '").append(value).append("%'");
} else if (code == 52) {
builder.append(" LIKE '%").append(value).append("'");
}
}
return rv;
}
/**
* select[命令合成-子流程]
* 构造 [not] exists 查询条件
* 如果不需要占位符 返回null 否则原样返回value
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param builder builder
* @param compare 比较方式 默认 equal 多个值默认 in
* @param prepare RunPrepare
* @return value 有占位符时返回占位值,没有占位符返回null
*/
@Override
public List createConditionExists(DataRuntime runtime, StringBuilder builder, Compare compare, RunPrepare prepare, boolean placeholder, boolean unicode) {
List values = new ArrayList<>();
// EXISTS
org.anyline.data.Run run = buildQueryRun(runtime, prepare, new DefaultConfigStore());
if(null != run){
String sql = run.getBaseQuery(placeholder);
sql = BasicUtil.tab(sql);
List vs = run.getValues();
for(Object v:vs){
RunValue rv = new RunValue();
rv.setValue(v);
values.add(rv);
}
if(compare.getCode() == 19){
builder.append(" NOT");
}
builder.append(" EXISTS(\n").append(sql).append("\n)");
}
return values;
}
/**
* select[命令合成-子流程]
* 构造 FIND_IN_SET 查询条件
* 如果不需要占位符 返回null 否则原样返回value
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param builder builder
* @param column 列
* @param compare 比较方式 默认 equal 多个值默认 in
* @param value value
* @return value
*/
@Override
public Object createConditionFindInSet(DataRuntime runtime, StringBuilder builder, String column, Compare compare, Object value, boolean placeholder, boolean unicode) throws NotSupportException {
return super.createConditionFindInSet(runtime, builder, column, compare, value, placeholder, unicode);
}
/**
* select[命令合成-子流程]
* 构造(NOT) IN 查询条件
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param builder builder
* @param compare 比较方式 默认 equal 多个值默认 in
* @param value value
* @return builder
*/
@Override
public StringBuilder createConditionIn(DataRuntime runtime, StringBuilder builder, Compare compare, Object value, boolean placeholder, boolean unicode) {
if(compare == Compare.NOT_IN) {
builder.append(" NOT");
}
builder.append(" IN (");
if(value instanceof Collection) {
Collection values = (Collection)value;
boolean first = true;
for(Object v:values) {
if(!first) {
builder.append(", ");
}
first = false;
if(placeholder) {
//builder.append("?");
convert(runtime, builder, value, null, placeholder, unicode, null);
}else{
if(v instanceof Number) {
builder.append(v);
}else{
builder.append("'").append(v).append("'");
}
}
}
builder.append(")");
}else{
if(placeholder) {
builder.append(" = ?");
}else{
if(value instanceof Number) {
builder.append(value);
}else{
builder.append("'").append(value).append("'");
}
}
}
return builder;
}
/**
* select [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param system 系统表不检测列属性
* @param table 表
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return DataSet
*/
@Override
public DataSet select(DataRuntime runtime, String random, boolean system, Table table, ConfigStore configs, Run run) {
if(run instanceof ProcedureRun) {
ProcedureRun pr = (ProcedureRun)run;
return querys(runtime, random, pr.getProcedure(), configs.getPageNavi());
}
String cmd = mergeFinalQuery(runtime, run);//run.getFinalQuery();
if(BasicUtil.isEmpty(cmd)) {
return new DataSet().setTable(table);
}
List values = run.getValues();
return select(runtime, random, system, ACTION.DML.SELECT, table, configs, run, cmd, values);
}
/**
* select [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return maps
*/
@Override
public List> maps(DataRuntime runtime, String random, ConfigStore configs, Run run) {
return super.maps(runtime, random, configs, run);
}
/**
* select [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return map
*/
@Override
public Map map(DataRuntime runtime, String random, ConfigStore configs, Run run) {
return super.map(runtime, random, configs, run);
}
/**
* select [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param next 是否查下一个序列值
* @param names 存储过程名称s
* @return DataRow 保存序列查询结果 以存储过程name作为key
*/
@Override
public DataRow sequence(DataRuntime runtime, String random, boolean next, String ... names) {
List runs = buildQuerySequence(runtime, next, names);
if (null != runs && !runs.isEmpty()) {
Run run = runs.get(0);
if(!run.isValid()) {
if(ConfigTable.IS_LOG_SQL && log.isWarnEnabled()) {
log.warn("[valid:false][不具备执行条件][sequence:"+names);
}
return new DataRow();
}
DataSet set = select(runtime, random, true, (Table)null, null, run);
if (!set.isEmpty()) {
return set.getRow(0);
}
}
return new DataRow();
}
/**
* select [结果集封装-子流程]
* JDBC执行完成后的结果处理
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param list JDBC执行返回的结果集
* @return maps
*/
@Override
public List> process(DataRuntime runtime, List> list) {
return super.process(runtime, list);
}
/* *****************************************************************************************************************
* COUNT
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* long count(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions)
* [命令合成]
* String mergeFinalTotal(DataRuntime runtime, Run run)
* [命令执行]
* long count(DataRuntime runtime, String random, Run run)
******************************************************************************************************************/
/**
* count [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 过滤条件及相关配置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return long
*/
@Override
public long count(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.count(runtime, random, prepare, configs, conditions);
}
/**
* count [命令合成]
* 合成最终 select count 命令
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return String
*/
@Override
public String mergeFinalTotal(DataRuntime runtime, Run run) {
String base = run.getBuilder().toString();
String sql = SQLUtil.mergeFinalTotal(base);
return sql;
}
/**
* count [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return long
*/
@Override
public long count(DataRuntime runtime, String random, Run run) {
long total = 0;
DataSet set = select(runtime, random, false, ACTION.DML.COUNT, null, null, run, run.getTotalQuery(), run.getValues());
total = set.toUpperKey().getInt(0, "CNT", 0);
return total;
}
/* *****************************************************************************************************************
* EXISTS
* -----------------------------------------------------------------------------------------------------------------
* boolean exists(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions)
* String mergeFinalExists(DataRuntime runtime, Run run)
******************************************************************************************************************/
/**
* exists [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 查询条件及相关设置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return boolean
*/
@Override
public boolean exists(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions) {
boolean result = false;
if(null == random) {
random = random(runtime);
}
ACTION.SWITCH swt = ACTION.SWITCH.CONTINUE;
if (null != dmListener) {
swt = dmListener.prepareQuery(runtime, random, prepare, configs, conditions);
}
if(swt == ACTION.SWITCH.BREAK) {
return false;
}
Run run = buildQueryRun(runtime, prepare, configs, conditions);
if(!run.isValid()) {
if(log.isWarnEnabled() &&ConfigStore.IS_LOG_SQL(configs)) {
log.warn("[valid:false][不具备执行条件][RunPrepare:" + ConfigParser.createSQLSign(false, false, prepare.getTableName(), configs, conditions) + "][thread:" + Thread.currentThread().getId() + "][ds:" + runtime.datasource() + "]");
}
return false;
}
if(null != dmListener) {
dmListener.beforeExists(runtime, random, run);
}
long fr = System.currentTimeMillis();
try {
Map map = map(runtime, random, configs, run);
if (null == map) {
result = false;
} else {
result = BasicUtil.parseBoolean(map.get("IS_EXISTS"), false);
}
}catch (Exception e) {
return false;
}
Long millis = System.currentTimeMillis() - fr;
if(null != dmListener) {
dmListener.afterExists(runtime, random, run, true, result, millis);
}
return result;
}
@Override
public String mergeFinalExists(DataRuntime runtime, Run run) {
String sql = "SELECT EXISTS(\n" + run.getBuilder().toString() +"\n) IS_EXISTS";
sql = sql.replaceAll("WHERE\\s*1=1\\s*AND","WHERE ");
return sql;
}
/* *****************************************************************************************************************
* EXECUTE
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* long execute(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions)
* long execute(DataRuntime runtime, String random, int batch, ConfigStore configs, RunPrepare prepare, Collection values)
* boolean execute(DataRuntime runtime, String random, Procedure procedure)
* [命令合成]
* Run buildExecuteRun(DataRuntime runtime, RunPrepare prepare, ConfigStore configs, String ... conditions)
* void fillExecuteContent(DataRuntime runtime, Run run)
* [命令执行]
* long execute(DataRuntime runtime, String random, ConfigStore configs, Run run)
******************************************************************************************************************/
/**
* execute [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 查询条件及相关设置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return 影响行数
*/
@Override
public long execute(DataRuntime runtime, String random, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.execute(runtime, random, prepare, configs, conditions);
}
@Override
public long execute(DataRuntime runtime, String random, int batch, ConfigStore configs, RunPrepare prepare, Collection values) {
return super.execute(runtime, random, batch, configs, prepare, values);
}
/**
* procedure [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param procedure 存储过程
* @param random random
* @return 影响行数
*/
@Override
public boolean execute(DataRuntime runtime, String random, Procedure procedure) {
boolean result = false;
ACTION.SWITCH swt = ACTION.SWITCH.CONTINUE;
boolean cmd_success = false;
List list = new ArrayList();
final List inputs = procedure.getInputs();
final List outputs = procedure.getOutputs();
long fr = System.currentTimeMillis();
String sql = " {";
// 带有返回值
int returnIndex = 0;
if(procedure.hasReturn()) {
sql += "? = ";
returnIndex = 1;
}
sql += "call " +procedure.getName()+"(";
final int sizeIn = inputs.size();
final int sizeOut = outputs.size();
final int size = sizeIn + sizeOut;
for(int i=0; i 0 && ConfigTable.IS_LOG_SLOW_SQL) {
if(millis > SLOW_SQL_MILLIS) {
log.warn("{}[slow cmd][action:procedure][执行耗时:{}][cmd:\n{}\n]\n[input param:{}]\n[output param:{}]", random, DateUtil.format(millis), sql, LogUtil.param(inputs), LogUtil.param(list));
if(null != dmListener) {
dmListener.slow(runtime, random, ACTION.DML.PROCEDURE, null, sql, inputs, list, true, result, millis);
}
}
}
if (null != dmListener) {
dmListener.afterExecute(runtime, random, procedure, result, millis);
}
if (!slow && ConfigTable.IS_LOG_SQL_TIME && log.isInfoEnabled()) {
log.info("{}[action:procedure][执行耗时:{}]\n[output param:{}]", random, DateUtil.format(millis), list);
}
}catch(Exception e) {
result = false;
if(ConfigTable.IS_PRINT_EXCEPTION_STACK_TRACE) {
e.printStackTrace();
}
if(ConfigTable.IS_THROW_SQL_UPDATE_EXCEPTION) {
CommandUpdateException ex = new CommandUpdateException("execute异常:"+e.toString(), e);
ex.setCmd(sql);
throw ex;
}else{
if(ConfigTable.IS_LOG_SQL_WHEN_ERROR) {
log.error("{}[{}][action:procedure][cmd:\n{}\n]\n[input param:{}]\n[output param:{}]", random, LogUtil.format("存储过程执行异常:", 33)+e.toString(), sql, LogUtil.param(inputs), LogUtil.param(outputs));
}
}
}
return result;
}
/**
* execute [命令合成]
* 创建执行SQL
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param configs 查询条件及相关设置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public Run buildExecuteRun(DataRuntime runtime, RunPrepare prepare, ConfigStore configs, String ... conditions) {
return super.buildExecuteRun(runtime, prepare, configs, conditions);
}
@Override
protected void fillExecuteContent(DataRuntime runtime, XMLRun run) {
super.fillExecuteContent(runtime, run);
}
@Override
protected void fillExecuteContent(DataRuntime runtime, TextRun run) {
super.fillExecuteContent(runtime, run);
}
@Override
protected void fillExecuteContent(DataRuntime runtime, TableRun run) {
super.fillExecuteContent(runtime, run);
}
/**
* execute [命令合成-子流程]
* 填充 execute 命令内容
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
*/
@Override
public void fillExecuteContent(DataRuntime runtime, Run run) {
super.fillExecuteContent(runtime, run);
}
/**
* execute [命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return 影响行数
*/
@Override
public long execute(DataRuntime runtime, String random, ConfigStore configs, Run run) {
return super.execute(runtime, random, configs, run);
}
/* *****************************************************************************************************************
* DELETE
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* long deletes(DataRuntime runtime, String random, int batch, Table table, ConfigStore configs, String column, Collection values)
* long delete(DataRuntime runtime, String random, Table table, ConfigStore configs, Object obj, String... columns)
* long delete(DataRuntime runtime, String random, Table table, ConfigStore configs, String... conditions)
* long truncate(DataRuntime runtime, String random, Table table)
* [命令合成]
* List buildDeleteRun(DataRuntime runtime, Table table, ConfigStore configs, Object obj, String ... columns)
* List buildDeleteRun(DataRuntime runtime, int batch, Table table, ConfigStore configs, String column, Object values)
* List buildTruncateRun(DataRuntime runtime, Table table)
* List buildDeleteRunFromTable(DataRuntime runtime, int batch, Table table, ConfigStore configs, String column, Object values)
* List buildDeleteRunFromEntity(DataRuntime runtime, Table table, ConfigStore configs, Object obj, String ... columns)
* void fillDeleteRunContent(DataRuntime runtime, Run run)
* [命令执行]
* long delete(DataRuntime runtime, String random, ConfigStore configs, Run run)
******************************************************************************************************************/
/**
* delete [调用入口]
*
* 合成 where column in (values)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param table 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源
* @param values 列对应的值
* @return 影响行数
* @param T
*/
@Override
public long deletes(DataRuntime runtime, String random, int batch, Table table, ConfigStore configs, String key, Collection values) {
return super.deletes(runtime, random, batch, table, configs, key, values);
}
/**
* delete [调用入口]
*
* 合成 where k1 = v1 and k2 = v2
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param obj entity或DataRow
* @param columns 删除条件的列或属性,根据columns取obj值并合成删除条件
* @return 影响行数
*/
@Override
public long delete(DataRuntime runtime, String random, Table dest, ConfigStore configs, Object obj, String... columns) {
return super.delete(runtime, random, dest, configs, obj, columns);
}
/**
* delete [调用入口]
*
* 根据configs和conditions过滤条件
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param table 表
* @param configs 查询条件及相关设置
* @param conditions 查询条件 支持k:v k:v::type 以及原生sql形式(包含ORDER、GROUP、HAVING)默认忽略空值条件
* @return 影响行数
*/
@Override
public long delete(DataRuntime runtime, String random, Table table, ConfigStore configs, String... conditions) {
return super.delete(runtime, random, table, configs, conditions);
}
/**
* truncate [调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param table 表
* @return 1表示成功执行
*/
@Override
public long truncate(DataRuntime runtime, String random, Table table) {
return super.truncate(runtime, random, table);
}
/**
* delete[命令合成]
* 合成 where k1 = v1 and k2 = v2
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param dest 表 如果不提供表名则根据data解析,表名可以事实前缀<数据源名>表示切换数据源
* @param obj entity或DataRow
* @param columns 删除条件的列或属性,根据columns取obj值并合成删除条件
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public List buildDeleteRun(DataRuntime runtime, Table dest, ConfigStore configs, Object obj, String ... columns) {
return super.buildDeleteRun(runtime, dest, configs, obj, columns);
}
/**
* delete[命令合成]
* 合成 where column in (values)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param table 表 如果不提供表名则根据data解析,表名可以事实前缀<数据源名>表示切换数据源
* @param key 根据属性解析出列
* @param values values
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public List buildDeleteRun(DataRuntime runtime, int batch, Table table, ConfigStore configs, String key, Object values) {
return super.buildDeleteRun(runtime, batch, table, configs, key, values);
}
@Override
public List buildTruncateRun(DataRuntime runtime, Table table) {
List runs = new ArrayList<>();
Run run = new SimpleRun(runtime);
runs.add(run);
StringBuilder builder = run.getBuilder();
builder.append("TRUNCATE TABLE ");
name(runtime, builder, table);
return runs;
}
/**
* delete[命令合成-子流程]
* 合成 where column in (values)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param table 表 如果不提供表名则根据data解析,表名可以事实前缀<数据源名>表示切换数据源
* @param key 列
* @param values values
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public List buildDeleteRunFromTable(DataRuntime runtime, int batch, Table table, ConfigStore configs, String key, Object values) {
List runs = new ArrayList<>();
if(null == table && null != configs) {
table = configs.table();
}
if(null == table) {
if((null == key || null == values) && (null == configs || configs.isEmptyCondition())) {
return null;
}
}
TableRun run = new TableRun(runtime, table);
StringBuilder builder = run.getBuilder();
builder.append("DELETE FROM ");
name(runtime, builder, table);
builder.append(" WHERE ");
if(values instanceof Collection) {
Collection cons = (Collection)values;
delimiter(builder, key);
if(batch >1) {
builder.append(" = ?");
List list = null;
if(values instanceof List) {
list = (List) values;
}else{
list = new ArrayList<>();
for(Object item:cons) {
list.add(item);
}
}
run.setValues(key, list);
run.setVol(1);
run.setBatch(batch);
}else {
if (cons.size() > 1) {
builder.append(" IN(");
int idx = 0;
for (Object obj : cons) {
if (idx > 0) {
builder.append(", ");
}
// builder.append("'").append(obj).append("'");
builder.append("?");
idx++;
}
builder.append(")");
} else if (cons.size() == 1) {
for (Object obj : cons) {
builder.append("=?");
}
} else {
throw new CommandUpdateException("删除异常:删除条件为空,delete方法不支持删除整表操作.");
}
addRunValue(runtime, run, Compare.IN, new Column(key), values);
}
}else{
delimiter(builder, key);
builder.append("=?");
addRunValue(runtime, run, Compare.EQUAL, new Column(key), values);
}
runs.add(run);
return runs;
}
/**
* delete[命令合成-子流程]
* 合成 where k1 = v1 and k2 = v2
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param table 表 如果不提供表名则根据data解析,表名可以事实前缀<数据源名>表示切换数据源 如果为空 可以根据obj解析
* @param obj entity或DataRow
* @param columns 删除条件的列或属性,根据columns取obj值并合成删除条件
* @return Run 最终执行命令 如JDBC环境中的 SQL 与 参数值
*/
@Override
public List buildDeleteRunFromEntity(DataRuntime runtime, Table table, ConfigStore configs, Object obj, String... columns) {
List runs = new ArrayList<>();
TableRun run = new TableRun(runtime, table);
run.setOriginType(2);
run.setConfigStore(configs);
run.init();
StringBuilder builder = run.getBuilder();
builder.append("DELETE FROM ");
name(runtime, builder, table);
//没有configs条件的 才根据主键删除
if(null == configs || configs.isEmptyCondition()) {
builder.append(" WHERE ");
List keys = new ArrayList<>();
if (null != columns && columns.length > 0) {
for (String col : columns) {
keys.add(col);
}
} else {
if (obj instanceof DataRow) {
keys = ((DataRow) obj).getPrimaryKeys();
} else {
keys.addAll(EntityAdapterProxy.primaryKeys(obj.getClass()).keySet());
}
}
int size = keys.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
if (i > 0) {
builder.append("\nAND ");
}
String key = keys.get(i);
delimiter(builder, key).append(" = ? ");
Object value = null;
if (obj instanceof DataRow) {
value = ((DataRow) obj).get(key);
} else {
if (EntityAdapterProxy.hasAdapter(obj.getClass())) {
value = BeanUtil.getFieldValue(obj, EntityAdapterProxy.field(obj.getClass(), key));
} else {
value = BeanUtil.getFieldValue(obj, key, true);
}
}
addRunValue(runtime, run, Compare.EQUAL, new Column(key), value);
}
} else {
throw new CommandUpdateException("删除异常:删除条件为空,delete方法不支持删除整表操作.");
}
}else{
run.appendCondition(this, true, true);
}
run.setBuilder(builder);
runs.add(run);
return runs;
}
/**
* delete[命令合成-子流程]
* 构造查询主体 拼接where group等(不含分页 ORDER)
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
*/
@Override
public void fillDeleteRunContent(DataRuntime runtime, Run run) {
if(null != run) {
if(run instanceof TableRun) {
TableRun r = (TableRun) run;
fillDeleteRunContent(runtime, r);
}
}
}
/**
* delete[命令合成-子流程]
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
*/
protected void fillDeleteRunContent(DataRuntime runtime, TableRun run) {
AutoPrepare prepare = (AutoPrepare)run.getPrepare();
StringBuilder builder = run.getBuilder();
builder.append("DELETE FROM ");
name(runtime, builder, run.getTable());
builder.append(BR);
if(BasicUtil.isNotEmpty(prepare.getAlias())) {
// builder.append(" AS ").append(sql.getAlias());
builder.append(" ").append(prepare.getAlias());
}
List joins = prepare.getJoins();
if(null != joins) {
for (RunPrepare join:joins) {
Join jn = join.getJoin();
builder.append(BR_TAB).append(jn.getType().getCode()).append(" ");
Table joinTable = join.getTable();
String jionTableAlias = joinTable.getAlias();
name(runtime, builder, joinTable);
if(BasicUtil.isNotEmpty(jionTableAlias)) {
builder.append(" ").append(jionTableAlias);
}
builder.append(" ON ").append(jn.getConditions().getRunText(runtime, false));
}
}
//builder.append("\nWHERE 1=1\n\t");
/*添加查询条件*/
// appendConfigStore();
run.appendCondition(this, true, true);
run.appendGroup();
run.appendOrderStore();
run.checkValid();
}
/**
* delete[命令执行]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param configs 查询条件及相关设置
* @param run 最终待执行的命令和参数(如JDBC环境中的SQL)
* @return 影响行数
*/
@Override
public long delete(DataRuntime runtime, String random, ConfigStore configs, Run run) {
return super.delete(runtime, random, configs, run);
}
/* *****************************************************************************************************************
*
* metadata
*
* =================================================================================================================
* database : 数据库(catalog, schema)
* table : 表
* master table : 主表
* partition table : 分区表
* column : 列
* tag : 标签
* primary key : 主键
* foreign key : 外键
* index : 索引
* constraint : 约束
* trigger : 触发器
* procedure : 存储过程
* function : 函数
******************************************************************************************************************/
/**
* 根据结果集对象获取列结构,如果有表名应该调用metadata().columns(table);或metadata().table(table).getColumns()
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param prepare 构建最终执行命令的全部参数,包含表(或视图|函数|自定义SQL)查询条件 排序 分页等
* @param comment 是否需要查询列注释
* @return LinkedHashMap
*/
public LinkedHashMap metadata(DataRuntime runtime, RunPrepare prepare, boolean comment) {
LinkedHashMap columns = null;
String random = random(runtime);
long fr = System.currentTimeMillis();
try {
Run run = buildQueryRun(runtime, prepare, null, null);
String sql = run.getFinalQuery(false);
columns = actuator.metadata(this, runtime, random, run, comment);
if (ConfigTable.IS_LOG_SQL && log.isInfoEnabled()) {
log.info("{}[action:metadata][执行耗时:{}]", random, DateUtil.format(System.currentTimeMillis() - fr));
}
if(comment) {
Map tables = new HashMap<>();
for(Column column:columns.values()) {
Table table = column.getTable(false);
if(null != table && BasicUtil.isNotEmpty(table.getName()) && !tables.containsKey(table.getIdentity())) {
tables.put(table.getIdentity(), table);
}
}
//提取所有表名和列名的别名
//解析一层
String col_sql = sql.toUpperCase().split("FROM")[0];
List chks = RegularUtil.fetch(col_sql,"\\S+\\s+AS\\s+\\S+");
for(String col:chks) {
String[] tmps =col.split("AS");
String original = tmps[0];
String label = tmps[1];
if(original.contains(".")) {
String[] names = original.split("\\.");
String table = names[1];
original = names[1];
}
original = original.trim();
label = label.trim();
Column column = columns.get(label);
if(null != column) {
column.setOriginName(original);
}
}
//TODO JDBC没有返回列.表名的 解析SQL确认表与列的关系
//mssql 列元数据中 不返回 表名
if(tables.isEmpty()) {
List tmps = RegularUtil.fetch(sql, "(\\s+FROM\\s+\\S+)|(\\s+JOIN\\s+\\S+)");
for(String tmp:tmps) {
String name = tmp.trim().split("\\s+")[1].trim();
tables.put(name.toUpperCase(), new Table(name));
}
}
for(Table table:tables.values()) {
LinkedHashMap ccols = columns(runtime, random, false, table, false);
for(Column ccol:ccols.values()) {
String name = ccol.getName();
for(Column column:columns.values()) {
if(column.getTableName(false).equals(ccol.getTableName(false))) {
String label = column.getName();
String original = column.getOriginName();
if(name.equalsIgnoreCase(label) || name.equalsIgnoreCase(original)) {
column.setComment(ccol.getComment());
}
}
}
}
}
}
}catch(Exception e) {
columns = new LinkedHashMap<>();
e.printStackTrace();
}
log.info("{}[action:metadata][封装耗时:{}][封装行数:{}]", random, DateUtil.format(System.currentTimeMillis() - fr), LogUtil.format(columns.size(), 34));
return columns;
}
/* *****************************************************************************************************************
* database
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* LinkedHashMap databases(DataRuntime runtime, String random, String name)
* List databases(DataRuntime runtime, String random, boolean greedy, String name)
* Database database(DataRuntime runtime, String random, String name)
* Database database(DataRuntime runtime, String random)
* String String product(DataRuntime runtime, String random);
* String String version(DataRuntime runtime, String random);
* [命令合成]
* List buildQueryDatabasesRun(DataRuntime runtime, boolean greedy, String name)
* List buildQueryDatabaseRun(DataRuntime runtime, boolean greedy, String name)
* List buildQueryProductRun(DataRuntime runtime, boolean greedy, String name)
* List buildQueryVersionRun(DataRuntime runtime, boolean greedy, String name)
* [结果集封装]
* LinkedHashMap databases(DataRuntime runtime, int index, boolean create, LinkedHashMap databases, Catalog catalog, Schema schema, DataSet set)
* List databases(DataRuntime runtime, int index, boolean create, List databases, Catalog catalog, Schema schema, DataSet set)
* Database database(DataRuntime runtime, boolean create, Database dataase, DataSet set)
* Database database(DataRuntime runtime, boolean create, Database dataase)
* String product(DataRuntime runtime, boolean create, Database product, DataSet set)
* String product(DataRuntime runtime, boolean create, String product)
* String version(DataRuntime runtime, int index, boolean create, String version, DataSet set)
* String version(DataRuntime runtime, boolean create, String version)
* Catalog catalog(DataRuntime runtime, boolean create, Catalog catalog, DataSet set)
* Catalog catalog(DataRuntime runtime, boolean create, Catalog catalog)
* Schema schema(DataRuntime runtime, boolean create, Schema schema, DataSet set)
* Schema schema(DataRuntime runtime, boolean create, Schema schema)
******************************************************************************************************************/
/**
* database[调用入口]
* 当前数据库
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @return Database
*/
@Override
public Database database(DataRuntime runtime, String random) {
Catalog catalog = catalog(runtime, random);
if(null != catalog) {
return new Database(catalog.getName());
}
return super.database(runtime, random);
}
/**
* database[调用入口]
* 当前数据源 数据库描述(产品名称+版本号)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @return String
*/
public String product(DataRuntime runtime, String random) {
return super.product(runtime, random);
}
/**
* database[调用入口]
* 当前数据源 数据库类型
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @return String
*/
public String version(DataRuntime runtime, String random) {
return super.version(runtime, random);
}
/**
* database[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public List databases(DataRuntime runtime, String random, boolean greedy, Database query) {
return super.databases(runtime, random, greedy, query);
}
/**
* database[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public LinkedHashMap databases(DataRuntime runtime, String random, Database query) {
return super.databases(runtime, random, query);
}
/**
* database[命令合成]
* 查询当前数据源 数据库产品说明(产品名称+版本号)
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @return runs
* @throws Exception 异常
*/
@Override
public List buildQueryProductRun(DataRuntime runtime) throws Exception {
return super.buildQueryProductRun(runtime);
}
/**
* database[命令合成]
* 查询当前数据源 数据库版本 版本号比较复杂 不是全数字
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @return runs
* @throws Exception 异常
*/
@Override
public List buildQueryVersionRun(DataRuntime runtime) throws Exception {
return super.buildQueryVersionRun(runtime);
}
/**
* database[命令合成]
* 查询全部数据库
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param query 查询条件 根据metadata属性
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @return runs
* @throws Exception 异常
*/
@Override
public List buildQueryDatabasesRun(DataRuntime runtime, boolean greedy, Database query) throws Exception {
return super.buildQueryDatabasesRun(runtime, greedy, query);
}
/**
* database[结果集封装]
* database 属性与结果集对应关系
* @return MetadataFieldRefer
*/
@Override
public MetadataFieldRefer initDatabaseFieldRefer() {
return super.initDatabaseFieldRefer();
}
/**
* database[结果集封装]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDatabaseRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @param set 查询结果集
* @return LinkedHashMap
* @throws Exception
*/
@Override
public LinkedHashMap databases(DataRuntime runtime, int index, boolean create, LinkedHashMap previous, Database query, DataSet set) throws Exception {
return super.databases(runtime, index, create, previous, query, set);
}
@Override
public List databases(DataRuntime runtime, int index, boolean create, List previous, Database query, DataSet set) throws Exception {
return super.databases(runtime, index, create, previous, query, set);
}
/**
* database[结果集封装]
* 当前database 根据查询结果集
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDatabaseRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @param set 查询结果集
* @return database
* @throws Exception 异常
*/
@Override
public Database database(DataRuntime runtime, int index, boolean create, Database meta, DataSet set) throws Exception {
return super.database(runtime, index, create, meta, set);
}
/**
* database[结果集封装]
* 当前database 根据驱动内置接口补充
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @return database
* @throws Exception 异常
*/
@Override
public Database database(DataRuntime runtime, boolean create, Database meta) throws Exception {
return super.database(runtime, create, meta);
}
/**
* database[结果集封装]
* 根据查询结果集构造 product
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param product 上一步查询结果
* @param set 查询结果集
* @return product
* @throws Exception 异常
*/
@Override
public String product(DataRuntime runtime, int index, boolean create, String product, DataSet set) {
return super.product(runtime, index, create, product, set);
}
/**
* database[结果集封装]
* 根据JDBC内置接口 product
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param product 上一步查询结果
* @return product
* @throws Exception 异常
*/
@Override
public String product(DataRuntime runtime, boolean create, String product) {
return actuator.product(this, runtime, create, product);
}
/**
* database[结果集封装]
* 根据查询结果集构造 version
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param version 上一步查询结果
* @param set 查询结果集
* @return version
* @throws Exception 异常
*/
@Override
public String version(DataRuntime runtime, int index, boolean create, String version, DataSet set) {
return super.version(runtime, index, create, version, set);
}
/**
* database[结果集封装]
* 根据JDBC内置接口 version
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param version 上一步查询结果
* @return version
* @throws Exception 异常
*/
@Override
public String version(DataRuntime runtime, boolean create, String version) {
return actuator.version(this, runtime, create, version);
}
/* *****************************************************************************************************************
* catalog
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* LinkedHashMap catalogs(DataRuntime runtime, String random, String name)
* List catalogs(DataRuntime runtime, String random, boolean greedy, String name)
* [命令合成]
* List buildQueryCatalogsRun(DataRuntime runtime, boolean greedy, String name)
* [结果集封装]
* List catalogs(DataRuntime runtime, int index, boolean create, List catalogs, DataSet set)
* LinkedHashMap catalogs(DataRuntime runtime, int index, boolean create, LinkedHashMap catalogs, DataSet set)
* List catalogs(DataRuntime runtime, boolean create, List catalogs, DataSet set)
* LinkedHashMap catalogs(DataRuntime runtime, boolean create, LinkedHashMap catalogs, DataSet set)
* Catalog catalog(DataRuntime runtime, int index, boolean create, Catalog catalog, DataSet set)
* Catalog catalog(DataRuntime runtime, int index, boolean create, Catalog catalog)
******************************************************************************************************************/
/**
* catalog[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public LinkedHashMap catalogs(DataRuntime runtime, String random, Catalog query) {
return super.catalogs(runtime, random, query);
}
/**
* catalog[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public List catalogs(DataRuntime runtime, String random, boolean greedy, Catalog query) {
return super.catalogs(runtime, random, greedy, query);
}
/**
* catalog[命令合成]
* 查询全部数据库
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param query 查询条件 根据metadata属性
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @return runs
* @throws Exception 异常
*/
@Override
public List buildQueryCatalogsRun(DataRuntime runtime, boolean greedy, Catalog query) throws Exception {
return super.buildQueryCatalogsRun(runtime, greedy, query);
}
/**
* Catalog[结果集封装]
* Catalog 属性与结果集对应关系
* @return MetadataFieldRefer
*/
@Override
public MetadataFieldRefer initCatalogFieldRefer() {
return super.initCatalogFieldRefer();
}
/**
* catalog[结果集封装]
* 根据查询结果集构造 Database
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDatabaseRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @param set 查询结果集
* @return databases
* @throws Exception 异常
*/
@Override
public List catalogs(DataRuntime runtime, int index, boolean create, List previous, Catalog query, DataSet set) throws Exception {
return super.catalogs(runtime, index, create, previous, query, set);
}
/**
* catalog[结果集封装]
* 根据驱动内置接口补充 catalog
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @return databases
* @throws Exception 异常
*/
@Override
public LinkedHashMap catalogs(DataRuntime runtime, boolean create, LinkedHashMap previous) throws Exception {
return super.catalogs(runtime, create, previous);
}
/**
* catalog[结果集封装]
* 根据驱动内置接口补充 catalog
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @return catalogs
* @throws Exception 异常
*/
@Override
public List catalogs(DataRuntime runtime, boolean create, List previous) throws Exception {
return super.catalogs(runtime, create, previous);
}
/**
* catalog[结果集封装]
* 当前catalog 根据查询结果集
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDatabaseRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @param set 查询结果集
* @return Catalog
* @throws Exception 异常
*/
@Override
public Catalog catalog(DataRuntime runtime, int index, boolean create, Catalog meta, DataSet set) throws Exception {
return super.catalog(runtime, index, create, meta, set);
}
/**
* catalog[结果集封装]
* 当前catalog 根据驱动内置接口补充
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @return Catalog
* @throws Exception 异常
*/
@Override
public Catalog catalog(DataRuntime runtime, boolean create, Catalog meta) throws Exception {
if(null == meta) {
Table table = new Table();
checkSchema(runtime, table);
meta = table.getCatalog();
}
return meta;
}
/* *****************************************************************************************************************
* schema
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* LinkedHashMap schemas(DataRuntime runtime, String random, Catalog catalog, String name)
* List schemas(DataRuntime runtime, String random, boolean greedy, Catalog catalog, String name)
* [命令合成]
* List buildQuerySchemasRun(DataRuntime runtime, boolean greedy, Catalog catalog, String name)
* [结果集封装]
* LinkedHashMap schemas(DataRuntime runtime, int index, boolean create, LinkedHashMap schemas, Catalog catalog, Schema schema, DataSet set)
* List schemas(DataRuntime runtime, int index, boolean create, List schemas, Catalog catalog, Schema schema, DataSet set)
* Schema schema(DataRuntime runtime, int index, boolean create, Schema schema, DataSet set)
* Schema schema(DataRuntime runtime, int index, boolean create, Schema schema)
******************************************************************************************************************/
/**
* schema[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public LinkedHashMap schemas(DataRuntime runtime, String random, Schema query) {
return super.schemas(runtime, random, query);
}
/**
* schema[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
* @return LinkedHashMap
*/
@Override
public List schemas(DataRuntime runtime, String random, boolean greedy, Schema query) {
return super.schemas(runtime, random, greedy, query);
}
/**
* catalog[命令合成]
* 查询全部数据库
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param query 查询条件 根据metadata属性
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @return runs
* @throws Exception 异常
*/
@Override
public List buildQuerySchemasRun(DataRuntime runtime, boolean greedy, Schema query) throws Exception {
return super.buildQuerySchemasRun(runtime, greedy, query);
}
/**
* Schema[结果集封装]
* Schema 属性与结果集对应关系
* @return MetadataFieldRefer
*/
@Override
public MetadataFieldRefer initSchemaFieldRefer() {
return super.initSchemaFieldRefer();
}
/**
* schema[结果集封装]
* 根据查询结果集构造 Database
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDatabaseRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @param set 查询结果集
* @return databases
* @throws Exception 异常
*/
@Override
public LinkedHashMap schemas(DataRuntime runtime, int index, boolean create, LinkedHashMap previous, Schema query, DataSet set) throws Exception {
return super.schemas(runtime, index, create, previous, query, set);
}
@Override
public List schemas(DataRuntime runtime, int index, boolean create, List previous, Schema query, DataSet set) throws Exception {
return super.schemas(runtime, index, create, previous, query, set);
}
/**
* schema[结果集封装]
* 当前schema 根据查询结果集
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQuerySchemaRun 返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @param set 查询结果集
* @return schema
* @throws Exception 异常
*/
@Override
public Schema schema(DataRuntime runtime, int index, boolean create, Schema meta, DataSet set) throws Exception {
return super.schema(runtime, index, create, meta, set);
}
/**
* schema[结果集封装]
* 当前schema 根据驱动内置接口补充
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param meta 上一步查询结果
* @return schema
* @throws Exception 异常
*/
@Override
public Schema schema(DataRuntime runtime, boolean create, Schema meta) throws Exception {
if(null == meta) {
Table table = new Table();
checkSchema(runtime, table);
meta = table.getSchema();
}
return meta;
}
/**
* 检测name,name中可能包含catalog.schema.name
* 如果有一项或三项,在父类中解析
* 如果只有两项,需要根据不同数据库区分出最前一项是catalog还是schema,如果区分不出来的抛出异常
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param meta 表,视图等
* @return T
* @throws Exception 如果区分不出来的抛出异常
*/
public T checkName(DataRuntime runtime, String random, T meta) throws RuntimeException {
if(null == meta) {
return null;
}
String name = meta.getName();
if(null != name && name.contains(".")) {
String[] ks = name.split("\\.");
if(ks.length == 3) {
meta.setCatalog(ks[0]);
meta.setSchema(ks[1]);
meta.setName(ks[2]);
}else if(ks.length == 2) {
meta.setSchema(ks[0]);
meta.setName(ks[1]);
}else{
throw new RuntimeException("无法实别schema或catalog(子类未" + this.getClass().getSimpleName() + "实现)");
}
}
return meta;
}
/* *****************************************************************************************************************
* table
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
* List tables(DataRuntime runtime, String random, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, boolean struct)
* LinkedHashMap tables(DataRuntime runtime, String random, Catalog catalog, Schema schema, String pattern, String types, boolean struct)
* [命令合成]
* List buildQueryTablesRun(DataRuntime runtime, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs)
* List buildQueryTablesCommentRun(DataRuntime runtime, Catalog catalog, Schema schema, String pattern, int types)
* [结果集封装]
* LinkedHashMap tables(DataRuntime runtime, int index, boolean create, LinkedHashMap tables, Catalog catalog, Schema schema, DataSet set)
* List tables(DataRuntime runtime, int index, boolean create, List tables, Catalog catalog, Schema schema, DataSet set)
* LinkedHashMap tables(DataRuntime runtime, boolean create, LinkedHashMap tables, Catalog catalog, Schema schema, String pattern, int types)
* List tables(DataRuntime runtime, boolean create, List tables, Catalog catalog, Schema schema, String pattern, int types)
* LinkedHashMap comments(DataRuntime runtime, int index, boolean create, LinkedHashMap tables, Catalog catalog, Schema schema, DataSet set)
* [调用入口]
* List ddl(DataRuntime runtime, String random, Table table, boolean init)
* [命令合成]
* List buildQueryDdlRun(DataRuntime runtime, Table table)
* [结果集封装]
* List ddl(DataRuntime runtime, int index, Table table, List ddls, DataSet set)
******************************************************************************************************************/
/**
*
* table[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @param query 查询条件 根据metadata属性
* @param types 查询的类型 参考 Table.TYPE 多个类型相加算出总和
* @param struct 查询的属性 参考Metadata.TYPE 多个属性相加算出总和 true:表示查询全部
* @return List
* @param Table
*/
@Override
public List tables(DataRuntime runtime, String random, boolean greedy, Table query, int types, int struct, ConfigStore configs) {
return super.tables(runtime, random, greedy, query, types, struct, configs);
}
/**
* table[结果集封装-子流程]
* 查出所有key并以大写缓存 用来实现忽略大小写
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param query 查询条件 根据metadata属性
*/
@Override
protected void tableMap(DataRuntime runtime, String random, boolean greedy, Table query, ConfigStore configs) {
super.tableMap(runtime, random, greedy, query, configs);
}
public LinkedHashMap tables(DataRuntime runtime, String random, Table query, int types, int struct, ConfigStore configs) {
return super.tables(runtime, random, query, types, struct, configs);
}
/**
* table[命令合成]
* 查询表,不是查表中的数据
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param greedy 贪婪模式 true:查询权限范围内尽可能多的数据 false:只查当前catalog/schema/database范围内数据
* @param query 查询条件 根据metadata属性
* @param types 查询的类型 参考 Table.TYPE 多个类型相加算出总和
* @return String
* @throws Exception Exception
*/
@Override
public List buildQueryTablesRun(DataRuntime runtime, boolean greedy, Table query, int types, ConfigStore configs) throws Exception {
return super.buildQueryTablesRun(runtime, greedy, query, types, configs);
}
/**
* Table[结果集封装]
* Table 属性与结果集对应关系
* @return MetadataFieldRefer
*/
@Override
public MetadataFieldRefer initTableFieldRefer() {
return super.initTableFieldRefer();
}
/**
* table[命令合成]
* 查询表备注
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param query 查询条件 根据metadata属性
* @param types 查询的类型 参考 Table.TYPE 多个类型相加算出总和
* @return String
* @throws Exception Exception
*/
@Override
public List buildQueryTablesCommentRun(DataRuntime runtime, Table query, int types) throws Exception {
return super.buildQueryTablesCommentRun(runtime, query, types);
}
/**
* table[结果集封装]
* 根据查询结果集构造Table
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照buildQueryTablesRun返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param query 查询条件 根据metadata属性
* @param set 查询结果集
* @return tables
* @throws Exception 异常
*/
@Override
public LinkedHashMap tables(DataRuntime runtime, int index, boolean create, LinkedHashMap previous, Table query, DataSet set) throws Exception {
return super.tables(runtime, index, create, previous, query, set);
}
/**
* table[结果集封装]
* 根据查询结果集构造Table
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照buildQueryTablesRun返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param query 查询条件 根据metadata属性
* @param previous 上一步查询结果
* @param set 查询结果集
* @return tables
* @throws Exception 异常
*/
@Override
public List tables(DataRuntime runtime, int index, boolean create, List previous, Table query, DataSet set) throws Exception {
return super.tables(runtime, index, create, previous, query, set);
}
/**
* table[结果集封装]
* 根据驱动内置方法补充
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @param query 查询条件 根据metadata属性
* @param types 查询的类型 参考 Table.TYPE 多个类型相加算出总和
* @return tables
* @throws Exception 异常
*/
@Override
public LinkedHashMap tables(DataRuntime runtime, boolean create, LinkedHashMap previous, Table query, int types) throws Exception {
return actuator.tables(this, runtime, create, previous, query, types);
}
/**
* table[结果集封装]
* 根据驱动内置方法补充
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param create 上一步没有查到的,这一步是否需要新创建
* @param previous 上一步查询结果
* @param query 查询条件 根据metadata属性
* @param types 查询的类型 参考 Table.TYPE 多个类型相加算出总和
* @return tables
* @throws Exception 异常
*/
@Override
public List tables(DataRuntime runtime, boolean create, List previous, Table query, int types) throws Exception {
return actuator.tables(this, runtime, create, previous, query, types);
}
/**
* table[结果集封装]
* 表备注
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照buildQueryTablesRun返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param query 查询条件 根据metadata属性
* @param previous 上一步查询结果
* @param set 查询结果集
* @return tables
* @throws Exception 异常
*/
@Override
public LinkedHashMap comments(DataRuntime runtime, int index, boolean create, LinkedHashMap previous, Table query, DataSet set) throws Exception {
return super.comments(runtime, index, create, previous, query, set);
}
/**
* table[结果集封装]
* 表备注
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照buildQueryTablesRun返回顺序
* @param create 上一步没有查到的,这一步是否需要新创建
* @param query 查询条件 根据metadata属性
* @param previous 上一步查询结果
* @param set 查询结果集
* @return tables
* @throws Exception 异常
*/
@Override
public List comments(DataRuntime runtime, int index, boolean create, List previous, Table query, DataSet set) throws Exception {
return super.comments(runtime, index, create, previous, query, set);
}
/**
*
* table[调用入口]
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param random 用来标记同一组命令
* @param table 表
* @param init 是否还原初始状态 如自增状态
* @return List
*/
@Override
public List ddl(DataRuntime runtime, String random, Table table, boolean init) {
return super.ddl(runtime, random, table, init);
}
/**
* table[命令合成]
* 查询表DDL
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param table 表
* @return List
*/
@Override
public List buildQueryDdlRun(DataRuntime runtime, Table table) throws Exception {
return super.buildQueryDdlRun(runtime, table);
}
/**
* table[结果集封装]
* 查询表DDL
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index 第几条SQL 对照 buildQueryDdlRun 返回顺序
* @param table 表
* @param set sql执行的结果集
* @return List
*/
@Override
public List ddl(DataRuntime runtime, int index, Table table, List ddls, DataSet set) {
return super.ddl(runtime, index, table, ddls, set);
}
/**
* table[结果集封装]
* 根据查询结果封装Table基础属性
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param index index
* @param meta 上一步封装结果
* @param query 查询条件 根据metadata属性
* @param row 查询结果集
* @return Table
* @param Table
*/
public T init(DataRuntime runtime, int index, T meta, Table query, DataRow row) {
return super.init(runtime, index, meta, query, row);
}
/**
* table[结果集封装]
* 根据查询结果封装Table更多属性
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param meta 上一步封装结果
* @param row 查询结果集
* @return Table
*/
@Override
public T detail(DataRuntime runtime, int index, T meta, Table query, DataRow row) {
return super.detail(runtime, index, meta, query, row);
}
/* *****************************************************************************************************************
* view
* -----------------------------------------------------------------------------------------------------------------
* [调用入口]
*