提交 c2e78922 编写于 作者: sq3536's avatar sq3536

es实现

上级 3fdab763
......@@ -2,11 +2,10 @@ package cn.ibizlab.core.data.dto;
import cn.ibizlab.core.data.filter.QueryBuildContext;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.core.data.filter.QueryFilter;
import cn.ibizlab.core.data.filter.QueryWrapperContext;
import cn.ibizlab.util.filter.EsQueryContext;
import cn.ibizlab.util.helper.DataObject;
import cn.ibizlab.util.security.AuthenticationUser;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
......@@ -17,6 +16,8 @@ import com.mongodb.QueryBuilder;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
......@@ -384,6 +385,83 @@ public class FilterData<T> extends BaseData
return queryBuilder;
}
@JsonIgnore
@JSONField(serialize = false)
private CriteriaQuery esCriteriaQuery=null;
@JsonIgnore
@JSONField(serialize = false)
public CriteriaQuery getEsQuery() {
if(esCriteriaQuery==null)
{
esCriteriaQuery=new EsQueryContext().getSelectCond();
}
if(this.getPOSchema()!=null)
{
if(!StringUtils.isEmpty(this.getQuery()))
{
if(!ObjectUtils.isEmpty(this.getPOSchema().getQuickSearch()))
{
Criteria critera=new Criteria();
for(String column:this.getPOSchema().getQuickSearch().keySet())
critera.or(column).contains(this.getQuery());
esCriteriaQuery.getCriteria().and(critera);
}
}
if(!ObjectUtils.isEmpty(this.getPOSchema().getSearchMap()))
{
for(Map.Entry<String, POSchema.Column> search:this.getPOSchema().getSearchMap().entrySet())
{
String key=search.getKey().toLowerCase();
String name=search.getValue().getName().toLowerCase();
if(this.keySet().contains(key))
{
POSchema.Column column=search.getValue();
Object obj=column.isDateTime()?this.getTimestampValue(key,null):this.get(key);
if(!ObjectUtils.isEmpty(obj)) {
if(key.endsWith("_like")) {
esCriteriaQuery.getCriteria().and(name).contains(obj.toString());
}
else if(key.endsWith("_leftlike")){
esCriteriaQuery.getCriteria().and(name).startsWith(obj.toString());
}
else if(key.endsWith("_rightlike")){
esCriteriaQuery.getCriteria().and(name).endsWith(obj.toString());
}
else if(key.endsWith("_eq"))
esCriteriaQuery.getCriteria().and(name).is(obj);
else if(key.endsWith("_noteq"))
esCriteriaQuery.getCriteria().not().and(name).is(obj);
else if(key.endsWith("_gt"))
esCriteriaQuery.getCriteria().and(name).greaterThan(obj);
else if(key.endsWith("_gtandeq"))
esCriteriaQuery.getCriteria().and(name).greaterThanEqual(obj);
else if(key.endsWith("_lt"))
esCriteriaQuery.getCriteria().and(name).lessThan(obj);
else if(key.endsWith("_ltandeq"))
esCriteriaQuery.getCriteria().and(name).lessThanEqual(obj);
else if(key.endsWith("_isnotnull")&& DataObject.getIntegerValue(obj,1)==1)
esCriteriaQuery.getCriteria().not().and(name).is(null);
else if(key.endsWith("_isnull")&& DataObject.getIntegerValue(obj,1)==1)
esCriteriaQuery.getCriteria().and(name).is(null);
else if(key.endsWith("_in"))
esCriteriaQuery.getCriteria().and(name).in(DataObject.getStringValue(obj,"").split(";|,"));
else if(key.endsWith("_notin"))
esCriteriaQuery.getCriteria().and(name).notIn(DataObject.getStringValue(obj,"").split(";|,"));
}
}
}
}
}
return esCriteriaQuery;
}
public String getSql(String codename)
{
Assert.notNull(getPOSchema(),"未找到查询片段");
......
package cn.ibizlab.core.data.repository;
import cn.ibizlab.core.data.dto.BaseData;
import cn.ibizlab.core.data.dto.FilterData;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.core.data.elasticsearch.DynamicEsContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.IdsQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.*;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import reactor.core.publisher.Flux;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
public class EsDataRepository {
@Autowired
@Lazy
private ReactiveElasticsearchTemplate esTemplate;
final private String TYPE="_doc";
/**
* 反射获取泛型类型
*
* @return
*/
protected Class<BaseData> getEntityClass()
{
return getEntityClass();
}
/**
* 将查询条件对象转换为query
*
* @param object
* @return
* @author Jason
*/
private Query getQueryByObject(BaseData object) {
Criteria query = new Criteria();
Map<String, Object> dataMap = (Map)object;
Criteria criteria = new Criteria();
for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
criteria.and(entry.getKey()).is(entry.getValue());
}
return new CriteriaQuery(query);
}
public Query getKeyQuery(BaseData data)
{
Assert.notNull(data.getKey(),"未找到主键");
return new CriteriaQuery(new Criteria().and("_id").is(data.getKey()));
}
public Query getKeyQuery(List list)
{
List<String> ids=new ArrayList<>();
if(list.get(0) instanceof BaseData)
{
list.forEach(item -> {
BaseData data = (BaseData) item;
Serializable key=data.getKey();
Assert.notNull(key,"未找到主键");
ids.add(key.toString());
});
}
else
{
ids.addAll(list);
}
return new CriteriaQuery(new Criteria().and("_id").in(ids));
}
public IdsQueryBuilder getKeyQueryBuilder(List list)
{
IdsQueryBuilder ids = QueryBuilders.idsQuery();
if(list.get(0) instanceof BaseData)
{
list.forEach(item -> {
BaseData data = (BaseData) item;
Serializable key=data.getKey();
Assert.notNull(key,"未找到主键");
ids.addIds(key.toString());
});
}
else
{
list.forEach(key->ids.addIds(key.toString()));
}
return ids;
}
public void insertData(String ds,POSchema schema, BaseData data){
try
{
DynamicEsContextHolder.push(ds);
data.setAll(this.esTemplate.save(data,schema.getName(),TYPE).block());
}
finally {
DynamicEsContextHolder.poll();
}
}
public void insertBathData(String ds,POSchema schema, List<BaseData> list){
try
{
DynamicEsContextHolder.push(ds);
this.esTemplate.save(Flux.fromIterable(list),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public void updateData(String ds,POSchema schema, BaseData data){
try
{
DynamicEsContextHolder.push(ds);
data.setAll(this.esTemplate.save(data,schema.getName(),TYPE).block());
}
finally {
DynamicEsContextHolder.poll();
}
}
public void updateBathData(String ds,POSchema schema, List<BaseData> list){
try
{
DynamicEsContextHolder.push(ds);
this.esTemplate.save(Flux.fromIterable(list),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public void removeData(String ds,POSchema schema, BaseData data){
try
{
Assert.notNull(data.getKey(),"未找到主键");
DynamicEsContextHolder.push(ds);
this.esTemplate.deleteById(data.getKey().toString(),getEntityClass(),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public void removeBathData(String ds,POSchema schema, List list){
try
{
DynamicEsContextHolder.push(ds);
esTemplate.deleteBy(getKeyQuery(list),getEntityClass(),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public void saveData(String ds,POSchema schema, BaseData data){
try
{
DynamicEsContextHolder.push(ds);
data.setAll(this.esTemplate.save(data, schema.getName(),TYPE).block());;
}
finally {
DynamicEsContextHolder.poll();
}
}
public void saveBatchData(String ds,POSchema schema, List<BaseData> list){
try
{
DynamicEsContextHolder.push(ds);
this.esTemplate.save(Flux.fromIterable(list),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public long countData(String ds,POSchema schema, BaseData data){
try
{
DynamicEsContextHolder.push(ds);
return esTemplate.count(getQueryByObject(data),getEntityClass(),schema.getName(),TYPE).block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public List<BaseData> getData(String ds,POSchema schema, BaseData data){
try
{
Assert.notNull(data.getKey(),"未找到主键");
DynamicEsContextHolder.push(ds);
return esTemplate.find(getKeyQuery(data),getEntityClass(),schema.getName(),TYPE).collectList().block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public List<BaseData> getBatchData(String ds,POSchema schema, List<BaseData> list){
try
{
DynamicEsContextHolder.push(ds);
return esTemplate.find(getKeyQuery(list),getEntityClass(),schema.getName(),TYPE).collectList().block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public List<BaseData> getBatchKey(String ds,POSchema schema, List<BaseData> list){
try
{
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(getKeyQueryBuilder(list)).withSourceFilter(new SourceFilter() {
@Override
public String[] getIncludes() {
return new String[]{"_id"};
}
@Override
public String[] getExcludes() {
return new String[]{""};
}
}).build();
DynamicEsContextHolder.push(ds);
return esTemplate.find(query,getEntityClass(),schema.getName(),TYPE).collectList().block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public List<BaseData> selectData(String ds,POSchema schema, BaseData data){
try
{
DynamicEsContextHolder.push(ds);
return esTemplate.find(getQueryByObject(data),getEntityClass(),schema.getName(),TYPE).collectList().block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public Page<BaseData> selectData(String ds,POSchema schema, BaseData data, Pageable page){
try
{
if(page==null)
page= PageRequest.of(0,20, Sort.unsorted());
Query query = getQueryByObject(data);
DynamicEsContextHolder.push(ds);
long total = esTemplate.count(query, getEntityClass(),schema.getName()).block();
List<BaseData> list=(total==0)?new ArrayList<>():esTemplate.find(query.setPageable(page),getEntityClass(),schema.getName()).collectList().block();
return new PageImpl<BaseData>(list,page,total);
}
finally {
DynamicEsContextHolder.poll();
}
}
public List<BaseData> queryData(String ds,POSchema schema, String sql, FilterData context){
try
{
DynamicEsContextHolder.push(ds);
return esTemplate.find(context.getEsQuery(),getEntityClass(),schema.getName(),TYPE).collectList().block();
}
finally {
DynamicEsContextHolder.poll();
}
}
public Page<BaseData> queryData(String ds,POSchema schema, String sql, FilterData context, Pageable page){
try
{
if(page==null)
page=context.getPageable();
else
context.setPageable(page);
DynamicEsContextHolder.push(ds);
Query query=context.getEsQuery();
long total = esTemplate.count(query,getEntityClass(),schema.getName(),TYPE).block();
List<BaseData> list=(total==0)?new ArrayList<>():esTemplate.find(query.setPageable(page),getEntityClass(),schema.getName(),TYPE).collectList().block();
return new PageImpl<BaseData>(list,page,total);
}
finally {
DynamicEsContextHolder.poll();
}
}
}
......@@ -12,12 +12,12 @@ import com.mongodb.BasicDBObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.castor.core.util.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -25,6 +25,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
......@@ -117,13 +118,12 @@ public class MongoDataRepository {
}
public int insertData(String ds,POSchema schema, BaseData data){
public void insertData(String ds,POSchema schema, BaseData data){
try
{
DynamicMongoContextHolder.push(ds);
this.mongoTemplate.save(data, schema.getName());
return 1;
}
finally {
DynamicMongoContextHolder.poll();
......@@ -142,14 +142,14 @@ public class MongoDataRepository {
}
}
public int updateData(String ds,POSchema schema, BaseData data){
public long updateData(String ds,POSchema schema, BaseData data){
try
{
Query query = getKeyQuery(data);
Update update = getUpdateByObject(data);
DynamicMongoContextHolder.push(ds);
return (int)this.mongoTemplate.updateFirst(query, update, schema.getName()).getModifiedCount();
return this.mongoTemplate.updateFirst(query, update, schema.getName()).getModifiedCount();
}
finally {
DynamicMongoContextHolder.poll();
......@@ -160,47 +160,49 @@ public class MongoDataRepository {
try
{
DynamicMongoContextHolder.push(ds);
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, schema.getName());
list.forEach(data -> {
Query query = getKeyQuery(data);
Update update = getUpdateByObject(data);
this.mongoTemplate.updateFirst(query, update, schema.getName());
ops.updateOne(query, update);
});
ops.execute();
}
finally {
DynamicMongoContextHolder.poll();
}
}
public int removeData(String ds,POSchema schema, BaseData data){
public long removeData(String ds,POSchema schema, BaseData data){
try
{
DynamicMongoContextHolder.push(ds);
return (int)this.mongoTemplate.remove(getKeyQuery(data),schema.getName()).getDeletedCount();
return this.mongoTemplate.remove(getKeyQuery(data),schema.getName()).getDeletedCount();
}
finally {
DynamicMongoContextHolder.poll();
}
}
public int removeBathData(String ds,POSchema schema, List list){
public long removeBathData(String ds,POSchema schema, List list){
try
{
DynamicMongoContextHolder.push(ds);
return (int)mongoTemplate.remove(getKeyQuery(list),schema.getName()).getDeletedCount();
return mongoTemplate.remove(getKeyQuery(list),schema.getName()).getDeletedCount();
}
finally {
DynamicMongoContextHolder.poll();
}
}
public int saveData(String ds,POSchema schema, BaseData data){
public long saveData(String ds,POSchema schema, BaseData data){
try
{
Query query = getKeyQuery(data);
Update update = getUpdateByObject(data);
DynamicMongoContextHolder.push(ds);
return (int)this.mongoTemplate.upsert(query, update, schema.getName()).getModifiedCount();
return this.mongoTemplate.upsert(query, update, schema.getName()).getModifiedCount();
}
finally {
DynamicMongoContextHolder.poll();
......@@ -211,11 +213,13 @@ public class MongoDataRepository {
try
{
DynamicMongoContextHolder.push(ds);
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, schema.getName());
list.forEach(data -> {
Query query = getKeyQuery(data);
Update update = getUpdateByObject(data);
mongoTemplate.upsert(query, update, schema.getName());
ops.upsert(query, update);
});
ops.execute();
}
finally {
DynamicMongoContextHolder.poll();
......@@ -301,7 +305,7 @@ public class MongoDataRepository {
DynamicMongoContextHolder.push(ds);
long total = mongoTemplate.count(query, BaseData.class,schema.getName());
List<BaseData> list=mongoTemplate.find(query.with(page),BaseData.class,schema.getName());
List<BaseData> list=(total==0)?new ArrayList<>():mongoTemplate.find(query.with(page),BaseData.class,schema.getName());
return new PageImpl<BaseData>(list,page,total);
}
finally {
......@@ -332,7 +336,7 @@ public class MongoDataRepository {
DynamicMongoContextHolder.push(ds);
long total = mongoTemplate.count(query, BaseData.class,schema.getName());
List<BaseData> list=mongoTemplate.find(query.with(page),BaseData.class,schema.getName());
List<BaseData> list=(total==0)?new ArrayList<>():mongoTemplate.find(query.with(page),BaseData.class,schema.getName());
return new PageImpl<BaseData>(list,page,total);
}
finally {
......
......@@ -6,6 +6,9 @@ import cn.ibizlab.core.data.model.DSLink;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.core.data.model.PojoSchema;
import cn.ibizlab.core.data.model.TransUtils;
import cn.ibizlab.core.data.service.impl.DbPersistentServiceImpl;
import cn.ibizlab.core.data.service.impl.EsPersistentServiceImpl;
import cn.ibizlab.core.data.service.impl.MongoPersistentServiceImpl;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.helper.DataObject;
import cn.ibizlab.util.helper.Inflector;
......@@ -66,6 +69,44 @@ public class ModelService {
@Lazy
private ModelService proxy;
@Autowired
@Lazy
private DbPersistentServiceImpl dbProxyService;
@Autowired
@Lazy
private MongoPersistentServiceImpl mongoProxyService;
@Autowired
@Lazy
private EsPersistentServiceImpl esProxyService;
@Autowired
@Lazy
private IDSSettingService dsSettingService;
public IPersistentService getProxyService(String datasource)
{
return getProxyService(getDSLink(datasource));
}
public IPersistentService getProxyService(DSLink link)
{
if(link.isMongodb())
return mongoProxyService;
else if(link.isElasticSearch())
return esProxyService;
else if(link.isCassandra())
return dbProxyService;
else
return dbProxyService;
}
public DSLink getDSLink(String datasource) {
return dsSettingService.getDataSource(datasource);
}
@Cacheable( value="syspssystem",key = "'row:sys-dst-sys-local'")
......
......@@ -35,6 +35,7 @@ public class BaseDataServiceImpl implements IDataService {
@Autowired
@Lazy
private DbPersistentServiceImpl dbProxyService;
@Autowired
......@@ -42,22 +43,18 @@ public class BaseDataServiceImpl implements IDataService {
private MongoPersistentServiceImpl mongoProxyService;
@Autowired
private ModelService modelService;
@Lazy
private EsPersistentServiceImpl esProxyService;
@Autowired
private IDSSettingService dsSettingService;
@Lazy
private ModelService modelService;
public IPersistentService getProxyService(DSLink link)
{
if(link.isMongodb())
return mongoProxyService;
else if(link.isElasticSearch())
return dbProxyService;
else if(link.isCassandra())
return dbProxyService;
else
return dbProxyService;
return modelService.getProxyService(link);
}
@Override
......@@ -68,7 +65,7 @@ public class BaseDataServiceImpl implements IDataService {
@Override
public DSLink getDSLink(String datasource) {
return dsSettingService.getDataSource(datasource);
return modelService.getDSLink(datasource);
}
@Override
......
......@@ -5,13 +5,13 @@ import cn.ibizlab.core.data.dto.FilterData;
import cn.ibizlab.core.data.mapper.DbDataMapper;
import cn.ibizlab.core.data.model.DSLink;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.core.data.service.IDSSettingService;
import cn.ibizlab.core.data.service.IPersistentService;
import cn.ibizlab.core.data.service.ModelService;
import cn.ibizlab.util.errors.BadRequestAlertException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
......@@ -37,6 +37,7 @@ public class DbPersistentServiceImpl implements IPersistentService {
@Autowired
private DbDataMapper repository;
@Autowired
@Lazy
private ModelService modelService;
@Override
......@@ -336,11 +337,9 @@ public class DbPersistentServiceImpl implements IPersistentService {
return new PageImpl<BaseData>(pages.getRecords(), pageable, pages.getTotal());
}
@Autowired
private IDSSettingService dsSettingService;
@Override
public DSLink getDSLink(String datasource) {
return dsSettingService.getDataSource(datasource);
return modelService.getDSLink(datasource);
}
@Override
......
package cn.ibizlab.core.data.service.impl;
import cn.ibizlab.core.data.dto.BaseData;
import cn.ibizlab.core.data.dto.FilterData;
import cn.ibizlab.core.data.model.DSLink;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.core.data.repository.EsDataRepository;
import cn.ibizlab.core.data.service.IPersistentService;
import cn.ibizlab.core.data.service.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class EsPersistentServiceImpl implements IPersistentService {
@Autowired
private EsDataRepository repository;
@Autowired
@Lazy
private ModelService modelService;
@Override
public BaseData create(DSLink link, POSchema poSchema, BaseData et, boolean bGet) {
repository.insertData(link.getName(),poSchema,et);
if(bGet) et.setAll(getByMap(link,poSchema,et));
return et;
}
@Override
public List<BaseData> createBatch(DSLink link, POSchema poSchema, List<BaseData> list, boolean bGet) {
repository.insertBathData(link.getName(),poSchema,list);
if(bGet) return getByMapBatch(link,poSchema,list);
return list;
}
@Override
public BaseData update(DSLink link, POSchema poSchema, BaseData et, boolean bGet) {
repository.updateData(link.getName(),poSchema,et);
if(bGet) et.setAll(getByMap(link,poSchema,et));
return et;
}
@Override
public List<BaseData> updateBatch(DSLink link, POSchema poSchema, List<BaseData> list, boolean bGet) {
repository.updateBathData(link.getName(),poSchema,list);
if(bGet) return getByMapBatch(link,poSchema,list);
return list;
}
@Override
public boolean remove(DSLink link, POSchema poSchema, Serializable key) {
BaseData et=poSchema.newData(key);
Assert.notNull(et,"未找到主键");
repository.removeData(link.getName(),poSchema,et);
return true;
}
@Override
public boolean removeBatch(DSLink link, POSchema poSchema, List<Serializable> idList) {
List<BaseData> batch=new ArrayList<>();
idList.forEach(key->{
BaseData et = poSchema.newData(key);
Assert.notNull(et,"未找到主键");
batch.add(et);
});
if(batch.size()>0)
{
repository.removeBathData(link.getName(),poSchema,batch);
batch.clear();
}
return true;
}
@Override
public boolean removeByMap(DSLink link, POSchema poSchema, BaseData et) {
repository.removeData(link.getName(),poSchema,et);
return true;
}
@Override
public boolean removeByMapBatch(DSLink link, POSchema poSchema, List<BaseData> list) {
repository.removeBathData(link.getName(),poSchema,list);
return true;
}
@Override
public BaseData get(DSLink link, POSchema poSchema, Serializable key) {
BaseData et=poSchema.newData(key);
Assert.notNull(et,"未找到主键");
List<BaseData> list = repository.getData(link.getName(),poSchema,et);
if(ObjectUtils.isEmpty(list)||list.size()>1)
throw new IllegalArgumentException("未找到数据"+poSchema.getName()+":"+key);
return list.get(0);
}
@Override
public List<BaseData> getBatch(DSLink link, POSchema poSchema, List<Serializable> idList) {
List<BaseData> batch=new ArrayList<>();
idList.forEach(key->{
BaseData et = poSchema.newData(key);
Assert.notNull(et,"未找到主键");
batch.add(et);
});
return repository.getBatchData(link.getName(),poSchema,batch);
}
@Override
public BaseData getByMap(DSLink link, POSchema poSchema, BaseData et) {
List<BaseData> list = repository.getData(link.getName(),poSchema,et);
if(ObjectUtils.isEmpty(list)||list.size()>1)
throw new IllegalArgumentException("未找到数据"+poSchema.getName()+":"+et.getKey());
return list.get(0);
}
@Override
public List<BaseData> getByMapBatch(DSLink link, POSchema poSchema, List<BaseData> list) {
return repository.getBatchData(link.getName(),poSchema,list);
}
@Override
public List<BaseData> getBatchKey(DSLink link, POSchema poSchema, List<BaseData> list) {
return repository.getBatchKey(link.getName(),poSchema,list);
}
@Override
public Long count(DSLink link, POSchema poSchema, BaseData et) {
return repository.countData(link.getName(),poSchema,et);
}
@Override
public boolean checkKey(DSLink link, POSchema poSchema, BaseData et) {
Long cnt=repository.countData(link.getName(),poSchema,et);
return cnt==1;
}
@Override
public BaseData save(DSLink link, POSchema poSchema, BaseData et, boolean bGet) {
if(checkKey(link,poSchema,et))
return update(link,poSchema,et,bGet);
else
return create(link,poSchema,et,bGet);
}
@Override
public List<BaseData> saveBatch(DSLink link, POSchema poSchema, List<BaseData> list, boolean bGet) {
repository.saveBatchData(link.getName(),poSchema,list);
if(bGet) return getByMapBatch(link,poSchema,list);
return list;
}
@Override
public List<BaseData> select(DSLink link, POSchema poSchema, BaseData et) {
return repository.selectData(link.getName(),poSchema,et);
}
@Override
public Page<BaseData> select(DSLink link, POSchema poSchema, BaseData et, Pageable pageable) {
Page<BaseData> pages= repository.selectData(link.getName(),poSchema,poSchema.trans2PO(et),pageable);
return pages;
}
@Override
public List<BaseData> query(DSLink link, POSchema poSchema, String dataQuery, FilterData context) {
context.setPOSchema(poSchema);
return repository.queryData(link.getName(),poSchema,"",context);
}
@Override
public Page<BaseData> query(DSLink link, POSchema poSchema, String dataQuery, FilterData context, Pageable pageable) {
context.setPOSchema(poSchema);
if(pageable!=null)
context.setPageable(pageable);
else
pageable=context.getPageable();
Page<BaseData> pages=repository.queryData(link.getName(),poSchema,"",context,pageable);
return pages;
}
@Override
public List<BaseData> selectRaw(DSLink link, POSchema poSchema, String sql, FilterData context) {
return repository.queryData(link.getName(),poSchema,sql,context);
}
@Override
public boolean execRaw(DSLink link, POSchema poSchema, String sql, BaseData param) {
throw new IllegalArgumentException(String.format("没有实现方法execRaw,%1$s,%2$s",poSchema.getName(),sql));
}
@Override
public List<BaseData> fetch(DSLink link, POSchema poSchema, String dataSet, FilterData context) {
context.setPOSchema(poSchema);
return repository.queryData(link.getName(),poSchema,"",context);
}
@Override
public Page<BaseData> fetch(DSLink link, POSchema poSchema, String dataSet, FilterData context, Pageable pageable) {
context.setPOSchema(poSchema);
if(pageable!=null)
context.setPageable(pageable);
else
pageable=context.getPageable();
Page<BaseData> pages=repository.queryData(link.getName(),poSchema,"",context,pageable);
return pages;
}
@Override
public DSLink getDSLink(String datasource) {
return modelService.getDSLink(datasource);
}
@Override
public POSchema getSchema(DSLink link, String system, String table) {
return modelService.getPOSchema(system,table,link.getType());
}
}
......@@ -5,12 +5,11 @@ import cn.ibizlab.core.data.dto.FilterData;
import cn.ibizlab.core.data.model.DSLink;
import cn.ibizlab.core.data.model.POSchema;
import cn.ibizlab.core.data.repository.MongoDataRepository;
import cn.ibizlab.core.data.service.IDSSettingService;
import cn.ibizlab.core.data.service.IPersistentService;
import cn.ibizlab.core.data.service.ModelService;
import cn.ibizlab.util.errors.BadRequestAlertException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
......@@ -31,6 +30,7 @@ public class MongoPersistentServiceImpl implements IPersistentService {
@Autowired
private MongoDataRepository repository;
@Autowired
@Lazy
private ModelService modelService;
@Override
......@@ -158,32 +158,9 @@ public class MongoPersistentServiceImpl implements IPersistentService {
@Override
public List<BaseData> saveBatch(DSLink link, POSchema poSchema, List<BaseData> list, boolean bGet) {
List<BaseData> rt=this.getBatchKey(link,poSchema,list);
Map<Serializable,Integer> keys=new LinkedHashMap<>();
rt.forEach(et->{
Serializable key=poSchema.getKeyValue(et,false);
if(!ObjectUtils.isEmpty(key))
keys.put(key,1);
});
List<BaseData> create=new ArrayList<>();
List<BaseData> update=new ArrayList<>();
list.forEach(et-> {
Serializable key = poSchema.getKeyValue(et, false);
if(keys.containsKey(key))
update.add(et);
else
create.add(et);
});
List rtList=new ArrayList<>();
if(update.size()>0)
rtList.addAll(this.updateBatch(link,poSchema,update,bGet));
if(create.size()>0)
rtList.addAll(this.createBatch(link,poSchema,create,bGet));
return rtList;
repository.saveBatchData(link.getName(),poSchema,list);
if(bGet) return getByMapBatch(link,poSchema,list);
return list;
}
@Override
......@@ -242,11 +219,9 @@ public class MongoPersistentServiceImpl implements IPersistentService {
return pages;
}
@Autowired
private IDSSettingService dsSettingService;
@Override
public DSLink getDSLink(String datasource) {
return dsSettingService.getDataSource(datasource);
return modelService.getDSLink(datasource);
}
@Override
......
package cn.ibizlab.util.filter;
import cn.ibizlab.core.data.filter.QueryFilter;
import cn.ibizlab.core.data.filter.SearchContextBase;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
@Slf4j
@Data
public class EsQueryContext extends SearchContextBase {
@JsonIgnore
@JSONField(serialize = false)
private CriteriaQuery selectCond=null;
public CriteriaQuery getSearchCond(){
return this.selectCond;
}
/**
* 填充自定义查询条件
* @return
*/
public CriteriaQuery getSelectCond() {
if(selectCond==null&&(!ObjectUtils.isEmpty(filter))){
Criteria queryBuilder=parseQueryFilter(filter);
if(!ObjectUtils.isEmpty(queryBuilder)){
selectCond=new CriteriaQuery(queryBuilder);
}
}
else if(selectCond==null)
{
selectCond=new CriteriaQuery(new Criteria());
}
return selectCond;
}
/**
* 解析自定义查询条件
* @param queryFilter
* @return
*/
private Criteria parseQueryFilter(QueryFilter queryFilter){
if(ObjectUtils.isEmpty(queryFilter.get$and()) && ObjectUtils.isEmpty(queryFilter.get$or()) && ObjectUtils.isEmpty(queryFilter.any())) {
return null;
}
Criteria rsBuilder=new Criteria();
Criteria fieldBuilder=parseFieldMap(queryFilter.any());
Criteria orBuilder=parseOrQueryFilter(queryFilter.get$or());
Criteria andBuilder=parseAndQueryFilter(queryFilter.get$and());
if(!ObjectUtils.isEmpty(fieldBuilder)){
rsBuilder.and(fieldBuilder);
}
if(!ObjectUtils.isEmpty(orBuilder)){
rsBuilder.and(orBuilder);
}
if(!ObjectUtils.isEmpty(andBuilder)){
rsBuilder.and(andBuilder);
}
return rsBuilder;
}
/**
* 解析自定义条件[or]
* @param queryFilters
* @return
*/
private Criteria parseOrQueryFilter(List<QueryFilter> queryFilters) {
Criteria orBuilder =new Criteria();
if(queryFilters==null || queryFilters.size()==0){
return null;
}
for(QueryFilter queryFilter: queryFilters){
Criteria queryBuilder=parseQueryFilter(queryFilter);
if(!ObjectUtils.isEmpty(queryBuilder)){
orBuilder.or(queryBuilder);
}
}
return orBuilder;
}
/**
* 解析自定义条件[and]
* @param queryFilters
* @return
*/
private Criteria parseAndQueryFilter(List<QueryFilter> queryFilters) {
Criteria orBuilder =new Criteria();
if(queryFilters==null || queryFilters.size()==0){
return null;
}
for(QueryFilter queryFilter: queryFilters){
Criteria queryBuilder=parseQueryFilter(queryFilter);
if(!ObjectUtils.isEmpty(queryBuilder)){
orBuilder.and(queryBuilder);
}
}
return orBuilder;
}
/**
* 解析自定义条件[字段条件]
* @param fieldMap
* @return
*/
private Criteria parseFieldMap(Map<String , QueryFilter.SegmentCond> fieldMap) {
if(fieldMap.size()==0) {
return null;
}
Criteria fieldBuilders=new Criteria();
for(Map.Entry<String, QueryFilter.SegmentCond> entry: fieldMap.entrySet()){
getSegmentCondSql(entry.getKey(),entry.getValue(),fieldBuilders);
}
return fieldBuilders;
}
/**
* 解析自定义条件[字段条件]
* @param fieldName
* @param segmentCond
* @param fieldBuilder
*/
private void getSegmentCondSql(String fieldName, QueryFilter.SegmentCond segmentCond,Criteria fieldBuilder) {
Map<String , Object> segmentCondMap = segmentCond.any();
for(Map.Entry<String , Object> entry: segmentCondMap.entrySet()){
Object value=entry.getValue();
switch (entry.getKey()){
case "$eq":
fieldBuilder.and(fieldName).is(value);
break;
case "$ne":
fieldBuilder.not().and(fieldName).is(value);
break;
case "$gt":
fieldBuilder.and(fieldName).greaterThan(value);
break;
case "$gte":
fieldBuilder.and(fieldName).greaterThanEqual(value);
break;
case "$lt":
fieldBuilder.and(fieldName).lessThan(value);
break;
case "$lte":
fieldBuilder.and(fieldName).lessThanEqual(value);
break;
case "$null":
fieldBuilder.and(fieldName).is(null);
break;
case "$notNull":
fieldBuilder.not().and(fieldName).is(null);
break;
case "$in":
fieldBuilder.and(fieldName).in(value);
break;
case "$notIn":
fieldBuilder.and(fieldName).notIn(value);
break;
case "$like":
if(!ObjectUtils.isEmpty(value))
fieldBuilder.and(fieldName).contains(value.toString());
break;
case "$startsWith":
if(!ObjectUtils.isEmpty(value))
fieldBuilder.and(fieldName).startsWith(value.toString());
break;
case "$endsWith":
if(!ObjectUtils.isEmpty(value))
fieldBuilder.and(fieldName).endsWith(value.toString());
break;
case "$exists":
break;
case "$notExists":
break;
}
}
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册