提交 14ca8aa9 编写于 作者: zhouweidong's avatar zhouweidong

规则执行结果动态存储

上级 329091a8
...@@ -3,19 +3,12 @@ package cn.ibizlab.core.extensions.service; ...@@ -3,19 +3,12 @@ package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.lite.extensions.service.DbEntityService; import cn.ibizlab.core.lite.extensions.service.DbEntityService;
import cn.ibizlab.core.rule.domain.ExecResult; import cn.ibizlab.core.rule.domain.ExecResult;
import cn.ibizlab.core.rule.service.impl.ExecResultServiceImpl; import cn.ibizlab.core.rule.service.impl.ExecResultServiceImpl;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
import java.util.*; import java.util.*;
/** /**
...@@ -26,16 +19,9 @@ import java.util.*; ...@@ -26,16 +19,9 @@ import java.util.*;
@Service("ExecResultExService") @Service("ExecResultExService")
public class ExecResultExService extends ExecResultServiceImpl { public class ExecResultExService extends ExecResultServiceImpl {
@Autowired
private DstDataSourceExService dstDataSourceService;
@Autowired @Autowired
private DbEntityService dbEntityService; private DbEntityService dbEntityService;
@Autowired
@Lazy
private DynamicRoutingDataSource dynamicRoutingDataSource;
private Map<String, List<ExecResult>> resultsSaveAsync = new HashMap<>(); private Map<String, List<ExecResult>> resultsSaveAsync = new HashMap<>();
private Object objResultSaveAsyncLock = new Object(); private Object objResultSaveAsyncLock = new Object();
private Timer timerSaveAsync = null; private Timer timerSaveAsync = null;
...@@ -66,7 +52,6 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -66,7 +52,6 @@ public class ExecResultExService extends ExecResultServiceImpl {
timerSaveAsync = new Timer(); timerSaveAsync = new Timer();
//schedule方法是执行时间定时任务的方法 //schedule方法是执行时间定时任务的方法
timerSaveAsync.schedule(new TimerTask() { timerSaveAsync.schedule(new TimerTask() {
//run方法就是具体需要定时执行的任务 //run方法就是具体需要定时执行的任务
@Override @Override
public void run() { public void run() {
...@@ -74,25 +59,20 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -74,25 +59,20 @@ public class ExecResultExService extends ExecResultServiceImpl {
synchronized (objResultSaveAsyncLock) { synchronized (objResultSaveAsyncLock) {
if (resultsSaveAsync.size() > 0) { if (resultsSaveAsync.size() > 0) {
for (Map.Entry<String, List<ExecResult>> entry : resultsSaveAsync.entrySet()) { for (Map.Entry<String, List<ExecResult>> entry : resultsSaveAsync.entrySet()) {
String tabName = "";
String dsName = entry.getKey(); String dsName = entry.getKey();
List<ExecResult> execResults = entry.getValue(); List<ExecResult> execResults = entry.getValue();
List<ExecResult> tempExecResults = new ArrayList<>(); List<ExecResult> tempExecResults = new ArrayList<>();
if (execResults.size() > 0) { if (execResults.size() > 0) {
dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName);
for (ExecResult execResult : execResults) { for (ExecResult execResult : execResults) {
tempExecResults.add(execResult); tempExecResults.add(execResult);
Object objTabName = execResult.get(RuleEngineExService.Setting_ResultTableName);
if (StringUtils.isEmpty(tabName) && !ObjectUtils.isEmpty(objTabName)) {
tabName = String.valueOf(objTabName);
}
if (tempExecResults.size() >= 500) { if (tempExecResults.size() >= 500) {
saveResultBatch(tempExecResults, dsName, tabName); dbEntityService.saveResultBatch(tempExecResults,dsName);
tempExecResults.clear();
} }
} }
if (tempExecResults.size() > 0) { if (tempExecResults.size() > 0) {
saveResultBatch(tempExecResults, dsName, tabName); dbEntityService.saveResultBatch(tempExecResults,dsName);
tempExecResults.clear();
} }
resultsSaveAsync.remove(dsName); resultsSaveAsync.remove(dsName);
} }
...@@ -101,10 +81,7 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -101,10 +81,7 @@ public class ExecResultExService extends ExecResultServiceImpl {
} }
} catch (Exception ex) { } catch (Exception ex) {
log.error(ex.getMessage()); log.error(ex.getMessage());
} finally {
DynamicDataSourceContextHolder.poll();
} }
} }
}, 1000, 10000); }, 1000, 10000);
} }
...@@ -135,25 +112,18 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -135,25 +112,18 @@ public class ExecResultExService extends ExecResultServiceImpl {
synchronized (objResultDeleteAsyncLock) { synchronized (objResultDeleteAsyncLock) {
if (resultsDeleteAsync.size() > 0) { if (resultsDeleteAsync.size() > 0) {
for (Map.Entry<String, List<ExecResult>> entry : resultsDeleteAsync.entrySet()) { for (Map.Entry<String, List<ExecResult>> entry : resultsDeleteAsync.entrySet()) {
String tabName = "";
String dsName = entry.getKey(); String dsName = entry.getKey();
List<ExecResult> execResults = entry.getValue(); List<ExecResult> execResults = entry.getValue();
List<ExecResult> tempExecResults = new ArrayList<>(); List<ExecResult> tempExecResults = new ArrayList<>();
if (execResults.size() > 0) { if (execResults.size() > 0) {
dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName);
for (ExecResult execResult : execResults) { for (ExecResult execResult : execResults) {
tempExecResults.add(execResult); tempExecResults.add(execResult);
Object objTabName = execResult.get(RuleEngineExService.Setting_ResultTableName);
if (StringUtils.isEmpty(tabName) && !ObjectUtils.isEmpty(objTabName)) {
tabName = String.valueOf(objTabName);
}
if (tempExecResults.size() >= 500) { if (tempExecResults.size() >= 500) {
dbEntityService.clearResultBatch(tempExecResults, tabName); dbEntityService.clearResultBatch(tempExecResults,dsName);
} }
} }
if (tempExecResults.size() > 0) { if (tempExecResults.size() > 0) {
dbEntityService.clearResultBatch(tempExecResults, tabName); dbEntityService.clearResultBatch(tempExecResults,dsName);
} }
resultsDeleteAsync.remove(dsName); resultsDeleteAsync.remove(dsName);
} }
...@@ -162,10 +132,7 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -162,10 +132,7 @@ public class ExecResultExService extends ExecResultServiceImpl {
} }
} catch (Exception ex) { } catch (Exception ex) {
log.error(ex.getMessage()); log.error(ex.getMessage());
} finally {
DynamicDataSourceContextHolder.poll();
} }
} }
}, 1000, 10000); }, 1000, 10000);
} }
...@@ -195,27 +162,5 @@ public class ExecResultExService extends ExecResultServiceImpl { ...@@ -195,27 +162,5 @@ public class ExecResultExService extends ExecResultServiceImpl {
}}); }});
} }
} }
/**
* 根据数据源类型保存结果
* @param args
* @param
*/
private void saveResultBatch(List<ExecResult> args, String dsName, String tabName) {
Map<String, DataSource> dynamicDSMap = dynamicRoutingDataSource.getCurrentDataSources();
if (!ObjectUtils.isEmpty(dynamicDSMap) && dynamicDSMap.containsKey(dsName)) {
DataSource ds = dynamicDSMap.get(dsName);
if (ds instanceof DruidDataSource) {
DruidDataSource druidDataSource = (DruidDataSource) dynamicDSMap.get(dsName);
if ("oracle".equals(druidDataSource.getDbType())) {
dbEntityService.saveResultBatchByOracle(args, tabName);
args.clear();
return;
}
}
}
dbEntityService.saveResultBatch(args, tabName);
args.clear();
}
} }
...@@ -2,6 +2,7 @@ package cn.ibizlab.core.lite.extensions.service; ...@@ -2,6 +2,7 @@ package cn.ibizlab.core.lite.extensions.service;
import cn.ibizlab.core.extensions.mapper.DbEntityMapper; import cn.ibizlab.core.extensions.mapper.DbEntityMapper;
import cn.ibizlab.core.extensions.service.DstDataSourceExService; import cn.ibizlab.core.extensions.service.DstDataSourceExService;
import cn.ibizlab.core.extensions.service.RuleEngineExService;
import cn.ibizlab.core.lite.extensions.domain.EntityModel; import cn.ibizlab.core.lite.extensions.domain.EntityModel;
import cn.ibizlab.core.lite.extensions.domain.EntityObj; import cn.ibizlab.core.lite.extensions.domain.EntityObj;
import cn.ibizlab.core.lite.extensions.domain.FieldModel; import cn.ibizlab.core.lite.extensions.domain.FieldModel;
...@@ -12,70 +13,71 @@ import cn.ibizlab.core.lite.extensions.model.Property; ...@@ -12,70 +13,71 @@ import cn.ibizlab.core.lite.extensions.model.Property;
import cn.ibizlab.core.lite.service.IMetaModelService; import cn.ibizlab.core.lite.service.IMetaModelService;
import cn.ibizlab.core.rule.domain.ExecResult; import cn.ibizlab.core.rule.domain.ExecResult;
import cn.ibizlab.util.filter.QueryFilter; import cn.ibizlab.util.filter.QueryFilter;
import com.alibaba.fastjson.JSON; import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.sql.DataSource;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.Reader; import java.io.Reader;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
@Service @Service
@Primary @Primary
@Slf4j @Slf4j
public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> implements CommonEntityService{ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> implements CommonEntityService {
@Autowired @Autowired
private DstDataSourceExService dstDataSourceService; private DstDataSourceExService dstDataSourceService;
@Autowired
@Lazy
private DynamicRoutingDataSource dynamicRoutingDataSource;
@Override @Override
public List<EntityObj> selectBase(EntityModel entityModel, QueryFilter filter) { public List<EntityObj> selectBase(EntityModel entityModel, QueryFilter filter) {
return search("BASE",entityModel,filter); return search("BASE", entityModel, filter);
} }
@Override @Override
public List<EntityObj> selectCore(EntityModel entityModel, QueryFilter filter) { public List<EntityObj> selectCore(EntityModel entityModel, QueryFilter filter) {
return search("CORE",entityModel,filter); return search("CORE", entityModel, filter);
} }
@Override @Override
public Integer selectCount(EntityModel entityModel, QueryFilter filter) { public Integer selectCount(EntityModel entityModel, QueryFilter filter) {
String sql=entityModel.getSqlSegment("COUNT"); String sql = entityModel.getSqlSegment("COUNT");
String dsName = entityModel.getDsName(); String dsName = entityModel.getDsName();
try try {
{
dstDataSourceService.initDataSource(dsName); dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName); DynamicDataSourceContextHolder.push(dsName);
DbEntitySearchContext context=new DbEntitySearchContext(); DbEntitySearchContext context = new DbEntitySearchContext();
context.setFilter(filter); context.setFilter(filter);
QueryWrapper qw=context.getSelectCond(); QueryWrapper qw = context.getSelectCond();
if(!StringUtils.isEmpty(filter.getCustSqlSegment())) if (!StringUtils.isEmpty(filter.getCustSqlSegment()))
qw.apply(filter.getCustSqlSegment()); qw.apply(filter.getCustSqlSegment());
Integer count=baseMapper.searchCount(sql,qw); Integer count = baseMapper.searchCount(sql, qw);
return count; return count;
} } catch (Exception ex) {
catch(Exception ex)
{
log.error("详细错误信息:" + ex.getMessage() + ", 执行sql:" + sql); log.error("详细错误信息:" + ex.getMessage() + ", 执行sql:" + sql);
return null; return null;
} } finally {
finally
{
DynamicDataSourceContextHolder.poll(); DynamicDataSourceContextHolder.poll();
} }
} }
...@@ -83,38 +85,36 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -83,38 +85,36 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
@Override @Override
public List<EntityObj> search(String dataSet, EntityModel entityModel, QueryFilter filter) { public List<EntityObj> search(String dataSet, EntityModel entityModel, QueryFilter filter) {
String sql=entityModel.getSqlSegment(dataSet); String sql = entityModel.getSqlSegment(dataSet);
if(StringUtils.isEmpty(sql)) if (StringUtils.isEmpty(sql))
return new ArrayList<>(); return new ArrayList<>();
else else
return search(entityModel.getDsName(),sql,filter); return search(entityModel.getDsName(), sql, filter);
} }
@Override @Override
public List<EntityObj> search(String dsName, String sql, QueryFilter filter) { public List<EntityObj> search(String dsName, String sql, QueryFilter filter) {
try try {
{
dstDataSourceService.initDataSource(dsName); dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName); DynamicDataSourceContextHolder.push(dsName);
DbEntitySearchContext context=new DbEntitySearchContext(); DbEntitySearchContext context = new DbEntitySearchContext();
context.setFilter(filter); context.setFilter(filter);
QueryWrapper qw=context.getSelectCond(); QueryWrapper qw = context.getSelectCond();
if(!StringUtils.isEmpty(filter.getCustSqlSegment())) if (!StringUtils.isEmpty(filter.getCustSqlSegment()))
qw.apply(filter.getCustSqlSegment()); qw.apply(filter.getCustSqlSegment());
List<EntityObj> list=baseMapper.search(sql,qw); List<EntityObj> list = baseMapper.search(sql, qw);
list.forEach(entityObj -> { list.forEach(entityObj -> {
entityObj.keySet().forEach(key->{ entityObj.keySet().forEach(key -> {
Object value=entityObj.get(key); Object value = entityObj.get(key);
if(value!=null&&value instanceof java.sql.Clob) if (value != null && value instanceof java.sql.Clob) {
{
// Clob类型 转String // Clob类型 转String
BufferedReader br =null; BufferedReader br = null;
Reader is = null; Reader is = null;
try { try {
String reString = ""; String reString = "";
is = ((java.sql.Clob)value).getCharacterStream(); is = ((java.sql.Clob) value).getCharacterStream();
br = new BufferedReader(is); br = new BufferedReader(is);
String s = br.readLine(); String s = br.readLine();
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
...@@ -124,29 +124,22 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -124,29 +124,22 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
} }
reString = sb.toString(); reString = sb.toString();
entityObj.put(key,reString); entityObj.put(key, reString);
} } catch (Exception ex) {
catch (Exception ex)
{
} } finally {
finally { try {
try if (br != null) {
{
if(br!=null){
br.close(); br.close();
} }
} catch (Exception ex) {
} }
catch (Exception ex) try {
{} if (is != null) {
try
{
if(is!=null){
is.close(); is.close();
} }
} catch (Exception ex) {
} }
catch (Exception ex)
{}
} }
...@@ -154,14 +147,10 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -154,14 +147,10 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
}); });
}); });
return list; return list;
} } catch (Exception ex) {
catch(Exception ex)
{
log.error("详细错误信息:" + ex.getMessage() + ", 执行sql:" + sql); log.error("详细错误信息:" + ex.getMessage() + ", 执行sql:" + sql);
return null; return null;
} } finally {
finally
{
DynamicDataSourceContextHolder.poll(); DynamicDataSourceContextHolder.poll();
} }
} }
...@@ -179,18 +168,59 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -179,18 +168,59 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
@Autowired @Autowired
private DbEntityMapper dbEntityMapper; private DbEntityMapper dbEntityMapper;
public int saveResultBatch(List<ExecResult> var1,String tableName) public int saveResultBatch(List<ExecResult> execResults, String dsName) {
{ int result = 0;
return dbEntityMapper.replaceBatch(var1,tableName); try {
String tableName = getTableName(execResults);
Map<String, DataSource> dynamicDSMap = dynamicRoutingDataSource.getCurrentDataSources();
dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName);
if (!ObjectUtils.isEmpty(dynamicDSMap) && dynamicDSMap.containsKey(dsName)) {
DataSource ds = dynamicDSMap.get(dsName);
if (ds instanceof DruidDataSource) {
DruidDataSource druidDataSource = (DruidDataSource) dynamicDSMap.get(dsName);
if ("oracle".equals(druidDataSource.getDbType())) {
return dbEntityMapper.replaceBatchByOracle(execResults, tableName);
}
}
}
result = dbEntityMapper.replaceBatch(execResults, tableName);
} catch (Exception ex) {
log.error("存储规则结果发生异常,详细错误信息:" + ex.getMessage());
} finally {
DynamicDataSourceContextHolder.poll();
}
return result;
} }
public int saveResultBatchByOracle(List<ExecResult> var1,String tableName) { /**
return dbEntityMapper.replaceBatchByOracle(var1,tableName); * 获取规则结果表名
* @param execResults
* @return
*/
private String getTableName(List<ExecResult> execResults) {
String tableName= RuleEngineExService.Default_ResultTableName;
for(ExecResult execResult : execResults){
if(!ObjectUtils.isEmpty(execResult.get(RuleEngineExService.Setting_ResultTableName))){
return String.valueOf(execResult.get(RuleEngineExService.Setting_ResultTableName));
}
}
return tableName;
} }
public int clearResultBatch(List<ExecResult> var1,String tableName) public int clearResultBatch(List<ExecResult> execResults, String dsName) {
{ int result = 0;
return dbEntityMapper.clearBatch(var1,tableName); try {
String tableName = getTableName(execResults);
dstDataSourceService.initDataSource(dsName);
DynamicDataSourceContextHolder.push(dsName);
result = dbEntityMapper.clearBatch(execResults, tableName);
} catch (Exception ex) {
log.error("存储规则结果发生异常,详细错误信息:" + ex.getMessage());
} finally {
DynamicDataSourceContextHolder.poll();
}
return result;
} }
@Autowired @Autowired
...@@ -201,84 +231,76 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -201,84 +231,76 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
@Override @Override
public List<ModelObj> getModelObjs(String metaModelId, Set<String> fillPropertys, Timestamp lastModify) public List<ModelObj> getModelObjs(String metaModelId, Set<String> fillPropertys, Timestamp lastModify) {
{ DataModel dataModel = liteModelService.getDataModel(metaModelId);
DataModel dataModel= liteModelService.getDataModel(metaModelId); EntityModel entityModel = dataModel.getFactEntityModel();
EntityModel entityModel=dataModel.getFactEntityModel(); FieldModel lastModifyField = entityModel.getLastModifyField();
FieldModel lastModifyField=entityModel.getLastModifyField(); QueryFilter filter = new QueryFilter();
QueryFilter filter=new QueryFilter();
if (lastModifyField != null)
if(lastModifyField!=null)
filter.ge(lastModifyField.getColumnName(), lastModify); filter.ge(lastModifyField.getColumnName(), lastModify);
List<EntityObj> kEntityObjs=this.selectCore(entityModel, filter); List<EntityObj> kEntityObjs = this.selectCore(entityModel, filter);
return getModelObjs(dataModel,fillPropertys,kEntityObjs); return getModelObjs(dataModel, fillPropertys, kEntityObjs);
} }
@Override @Override
public ModelObj getModelObjs(String metaModelId, Set<String> fillPropertys, Object factKey) public ModelObj getModelObjs(String metaModelId, Set<String> fillPropertys, Object factKey) {
{ DataModel dataModel = liteModelService.getDataModel(metaModelId);
DataModel dataModel= liteModelService.getDataModel(metaModelId);
List<EntityObj> kEntityObjs = new ArrayList<>(); List<EntityObj> kEntityObjs = new ArrayList<>();
kEntityObjs.add(new EntityObj().set(dataModel.getFactEntityModel().getKeyField().getColumnName(),factKey)); kEntityObjs.add(new EntityObj().set(dataModel.getFactEntityModel().getKeyField().getColumnName(), factKey));
List<ModelObj> list = getModelObjs(dataModel,fillPropertys,kEntityObjs); List<ModelObj> list = getModelObjs(dataModel, fillPropertys, kEntityObjs);
if(list.size()>0) if (list.size() > 0)
return list.get(0); return list.get(0);
return null; return null;
} }
@Override @Override
public ModelObj getModelObjs(String metaModelId, Set<String> fillPropertys, Object... factUniKey) public ModelObj getModelObjs(String metaModelId, Set<String> fillPropertys, Object... factUniKey) {
{ DataModel dataModel = liteModelService.getDataModel(metaModelId);
DataModel dataModel= liteModelService.getDataModel(metaModelId);
List<EntityObj> kEntityObjs = new ArrayList<>(); List<EntityObj> kEntityObjs = new ArrayList<>();
EntityObj entityObj = new EntityObj(); EntityObj entityObj = new EntityObj();
List<FieldModel> uniKeys = dataModel.getFactEntityModel().getUnionKeyFields(); List<FieldModel> uniKeys = dataModel.getFactEntityModel().getUnionKeyFields();
for(int i=0;i<uniKeys.size();i++) for (int i = 0; i < uniKeys.size(); i++)
entityObj.set(uniKeys.get(i).getColumnName(),factUniKey[i]); entityObj.set(uniKeys.get(i).getColumnName(), factUniKey[i]);
kEntityObjs.add(entityObj); kEntityObjs.add(entityObj);
List<ModelObj> list = getModelObjs(dataModel,fillPropertys,kEntityObjs); List<ModelObj> list = getModelObjs(dataModel, fillPropertys, kEntityObjs);
if(list.size()>0) if (list.size() > 0)
return list.get(0); return list.get(0);
return null; return null;
} }
@Override @Override
public List<ModelObj> getModelObjs(String metaModelId, Set<String> fillPropertys, List<EntityObj> kEntityObjs) public List<ModelObj> getModelObjs(String metaModelId, Set<String> fillPropertys, List<EntityObj> kEntityObjs) {
{ DataModel dataModel = liteModelService.getDataModel(metaModelId);
DataModel dataModel= liteModelService.getDataModel(metaModelId); return getModelObjs(dataModel, fillPropertys, kEntityObjs);
return getModelObjs(dataModel,fillPropertys,kEntityObjs);
} }
public List<ModelObj> getModelObjs(DataModel dataModel, Set<String> fillPropertys, List<EntityObj> kEntityObjs) public List<ModelObj> getModelObjs(DataModel dataModel, Set<String> fillPropertys, List<EntityObj> kEntityObjs) {
{ EntityModel entityModel = dataModel.getFactEntityModel();
EntityModel entityModel=dataModel.getFactEntityModel(); List<ModelObj> rt = new ArrayList<>();
List<ModelObj> rt=new ArrayList<>();
List<EntityObj> factEntityList = new ArrayList<>(); List<EntityObj> factEntityList = new ArrayList<>();
if(fillPropertys==null||fillPropertys.size()==0||fillPropertys.contains(dataModel.getFactPorperty().getPropertyName())) if (fillPropertys == null || fillPropertys.size() == 0 || fillPropertys.contains(dataModel.getFactPorperty().getPropertyName()))
splitList(kEntityObjs,1000).forEach(list -> factEntityList.addAll(this.selectBase(entityModel, QueryFilter.createQuery().cust(dataModel.lookup(list))))); splitList(kEntityObjs, 1000).forEach(list -> factEntityList.addAll(this.selectBase(entityModel, QueryFilter.createQuery().cust(dataModel.lookup(list)))));
factEntityList.forEach(entityObj-> factEntityList.forEach(entityObj ->
rt.add(new ModelObj().setDataModel(dataModel).setFactEntity(entityObj.setProperty(dataModel.getFactPorperty())))); rt.add(new ModelObj().setDataModel(dataModel).setFactEntity(entityObj.setProperty(dataModel.getFactPorperty()))));
fillEntityObj(dataModel,fillPropertys,rt); fillEntityObj(dataModel, fillPropertys, rt);
dataModel.getNestedDataModels().forEach(subModel-> dataModel.getNestedDataModels().forEach(subModel ->
this.getModelObjs(subModel,fillPropertys, factEntityList).forEach(subObj->subObj.findParent(rt))); this.getModelObjs(subModel, fillPropertys, factEntityList).forEach(subObj -> subObj.findParent(rt)));
rt.forEach(modelObj -> modelObj.getTimestamp()); rt.forEach(modelObj -> modelObj.getTimestamp());
return rt; return rt;
} }
public void fillEntityObj(DataModel dataModel, Set<String> fillPropertys, List<ModelObj> modelObjs) public void fillEntityObj(DataModel dataModel, Set<String> fillPropertys, List<ModelObj> modelObjs) {
{ if (dataModel.getObjectProperties().size() > 1) {
if(dataModel.getObjectProperties().size()>1) for (Property property : dataModel.getObjectProperties()) {
{ if (property.getPropertyName().equals(dataModel.getFactPorperty().getPropertyName()))
for(Property property:dataModel.getObjectProperties())
{
if(property.getPropertyName().equals(dataModel.getFactPorperty().getPropertyName()))
continue; continue;
EntityModel entityModel=property.getEntityModel(); EntityModel entityModel = property.getEntityModel();
List<EntityObj> entityObjs = new ArrayList<>(); List<EntityObj> entityObjs = new ArrayList<>();
if(fillPropertys==null||fillPropertys.size()==0||fillPropertys.contains(property.getPropertyName())) if (fillPropertys == null || fillPropertys.size() == 0 || fillPropertys.contains(property.getPropertyName()))
splitList(modelObjs,1000).forEach(list -> entityObjs.addAll(this.selectBase(entityModel, QueryFilter.createQuery().cust(property.lookup(list))))); splitList(modelObjs, 1000).forEach(list -> entityObjs.addAll(this.selectBase(entityModel, QueryFilter.createQuery().cust(property.lookup(list)))));
entityObjs.forEach(entityObj -> { entityObjs.forEach(entityObj -> {
entityObj.setProperty(property); entityObj.setProperty(property);
...@@ -289,19 +311,19 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl ...@@ -289,19 +311,19 @@ public class DbEntityService extends ServiceImpl<DbEntityMapper, EntityObj> impl
} }
private <T> List<List<T>> splitList(List<T> list, int groupSize){ private <T> List<List<T>> splitList(List<T> list, int groupSize) {
int length = list.size(); int length = list.size();
// 计算可以分成多少组 // 计算可以分成多少组
int num = ( length + groupSize - 1 )/groupSize ; // TODO int num = (length + groupSize - 1) / groupSize; // TODO
List<List<T>> newList = new ArrayList<>(num); List<List<T>> newList = new ArrayList<>(num);
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
// 开始位置 // 开始位置
int fromIndex = i * groupSize; int fromIndex = i * groupSize;
// 结束位置 // 结束位置
int toIndex = (i+1) * groupSize < length ? ( i+1 ) * groupSize : length ; int toIndex = (i + 1) * groupSize < length ? (i + 1) * groupSize : length;
newList.add(list.subList(fromIndex,toIndex)) ; newList.add(list.subList(fromIndex, toIndex));
} }
return newList ; return newList;
} }
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册