提交 3268b2d9 编写于 作者: O o2null

Merge branch 'feature/内容管理文档查询优化' into 'wrdp'

[内容管理]文档分页查询优化

See merge request o2oa/o2oa!4445
......@@ -15,6 +15,7 @@ import com.x.cms.core.entity.Review_;
import com.x.cms.core.express.tools.CriteriaBuilderTools;
import com.x.cms.core.express.tools.filter.QueryFilter;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import javax.persistence.EntityManager;
......@@ -431,7 +432,7 @@ public class DocumentFactory extends AbstractFactory {
* @throws NoSuchFieldException
*/
public List<Document> listPagingWithCondition( String personName, String orderField, String orderType, QueryFilter queryFilter, Integer adjustPage,
Integer adjustPageSize ) throws Exception {
Integer adjustPageSize, Boolean isAuthor) throws Exception {
EntityManager em = this.entityManagerContainer().get( Document.class );
CriteriaBuilder cb = em.getCriteriaBuilder();
EntityManager em1 = this.entityManagerContainer().get( Review.class );
......@@ -442,16 +443,50 @@ public class DocumentFactory extends AbstractFactory {
Predicate p = CriteriaBuilderTools.composePredicateWithQueryFilter( Document_.class, cb, null, root, queryFilter );
if(StringUtils.isNotBlank(personName)){
Subquery<Review> subquery = cq.subquery(Review.class);
Root<Review> root2 = subquery.from(em1.getMetamodel().entity(Review.class));
subquery.select(root2);
Predicate p_permission = cb1.conjunction();
p_permission = cb1.and(p_permission,
cb1.or(cb1.equal( root2.get( Review_.permissionObj), "*"),
cb1.equal( root2.get( Review_.permissionObj ), personName )));
p_permission = cb1.and(p_permission, cb1.equal(root.get(Document_.id), root2.get(Review_.docId)));
subquery.where(p_permission);
p = cb.and(p, cb.exists(subquery));
if(!BooleanUtils.isTrue(isAuthor)) {
Subquery<Review> subquery = cq.subquery(Review.class);
Root<Review> root2 = subquery.from(em1.getMetamodel().entity(Review.class));
subquery.select(root2);
Predicate p_permission = cb1.conjunction();
p_permission = cb1.and(p_permission,
cb1.or(cb1.equal(root2.get(Review_.permissionObj), "*"),
cb1.equal(root2.get(Review_.permissionObj), personName)));
p_permission = cb1.and(p_permission, cb1.equal(root.get(Document_.id), root2.get(Review_.docId)));
subquery.where(p_permission);
p = cb.and(p, cb.exists(subquery));
}else {
List<String> list = new ArrayList<>();
List<String> unitAllList = this.business().organization().unit().listWithPersonSupNested(personName);
if(unitAllList!=null) {
for (String item : unitAllList) {
if (item.indexOf("@") > -1) {
list.add(StringUtils.substringAfter(item, "@"));
}
}
unitAllList.addAll(list);
list.clear();
}
List<String> groupList = this.business().organization().group().listWithPersonReference(
ListTools.toList(personName), true, true, true);
if(groupList!=null) {
for (String item : groupList) {
if (item.indexOf("@") > -1) {
list.add(StringUtils.substringAfter(item, "@"));
}
}
groupList.addAll(list);
list.clear();
}
Predicate ep = cb.disjunction();
ep = cb.or(ep, cb.isMember(personName, root.get(Document_.authorPersonList)));
if(ListTools.isNotEmpty(unitAllList)){
ep = cb.or(ep, root.get(Document_.authorUnitList).in(unitAllList));
}
if(ListTools.isNotEmpty(groupList)){
ep = cb.or(ep, root.get(Document_.authorGroupList).in(groupList));
}
p = cb.and(p, ep);
}
}
List<String> fields = DocumentWo.copier.getCopyFields();
List<Selection<?>> selections = new ArrayList<>();
......@@ -505,7 +540,7 @@ public class DocumentFactory extends AbstractFactory {
* @return
* @throws Exception
*/
public Long countWithCondition( String personName, QueryFilter queryFilter) throws Exception {
public Long countWithCondition( String personName, QueryFilter queryFilter, Boolean isAuthor) throws Exception {
EntityManager em = this.entityManagerContainer().get( Document.class );
CriteriaBuilder cb = em.getCriteriaBuilder();
EntityManager em1 = this.entityManagerContainer().get( Review.class );
......@@ -515,16 +550,50 @@ public class DocumentFactory extends AbstractFactory {
Predicate p = CriteriaBuilderTools.composePredicateWithQueryFilter( Document_.class, cb, null, root, queryFilter );
if(StringUtils.isNotBlank(personName)){
Subquery<Review> subquery = cq.subquery(Review.class);
Root<Review> root2 = subquery.from(em1.getMetamodel().entity(Review.class));
subquery.select(root2);
Predicate p_permission = cb1.conjunction();
p_permission = cb1.and(p_permission,
cb1.or(cb1.equal( root2.get( Review_.permissionObj), "*"),
cb1.equal( root2.get( Review_.permissionObj ), personName )));
p_permission = cb1.and(p_permission, cb1.equal(root.get(Document_.id), root2.get(Review_.docId)));
subquery.where(p_permission);
p = cb.and(p, cb.exists(subquery));
if(!BooleanUtils.isTrue(isAuthor)) {
Subquery<Review> subquery = cq.subquery(Review.class);
Root<Review> root2 = subquery.from(em1.getMetamodel().entity(Review.class));
subquery.select(root2);
Predicate p_permission = cb1.conjunction();
p_permission = cb1.and(p_permission,
cb1.or(cb1.equal(root2.get(Review_.permissionObj), "*"),
cb1.equal(root2.get(Review_.permissionObj), personName)));
p_permission = cb1.and(p_permission, cb1.equal(root.get(Document_.id), root2.get(Review_.docId)));
subquery.where(p_permission);
p = cb.and(p, cb.exists(subquery));
}else {
List<String> list = new ArrayList<>();
List<String> unitAllList = this.business().organization().unit().listWithPersonSupNested(personName);
if(unitAllList!=null) {
for (String item : unitAllList) {
if (item.indexOf("@") > -1) {
list.add(StringUtils.substringAfter(item, "@"));
}
}
unitAllList.addAll(list);
list.clear();
}
List<String> groupList = this.business().organization().group().listWithPersonReference(
ListTools.toList(personName), true, true, true);
if(groupList!=null) {
for (String item : groupList) {
if (item.indexOf("@") > -1) {
list.add(StringUtils.substringAfter(item, "@"));
}
}
groupList.addAll(list);
list.clear();
}
Predicate ep = cb.disjunction();
ep = cb.or(ep, cb.isMember(personName, root.get(Document_.authorPersonList)));
if(ListTools.isNotEmpty(unitAllList)){
ep = cb.or(ep, root.get(Document_.authorUnitList).in(unitAllList));
}
if(ListTools.isNotEmpty(groupList)){
ep = cb.or(ep, root.get(Document_.authorGroupList).in(groupList));
}
p = cb.and(p, ep);
}
}
return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult();
......
......@@ -2,6 +2,7 @@ package com.x.cms.assemble.control.jaxrs.document;
import com.google.gson.JsonElement;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.http.ActionResult;
......@@ -11,6 +12,7 @@ import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.cms.core.entity.Document;
import com.x.cms.core.express.tools.filter.QueryFilter;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
......@@ -47,7 +49,7 @@ public class ActionQueryListWithFilterPaging extends BaseAction {
}
if( StringUtils.isEmpty( wi.getOrderField() )) {
wi.setOrderField( "createTime" );
wi.setOrderField( "publishTime" );
}
if( StringUtils.isEmpty( wi.getOrderType() )) {
......@@ -84,13 +86,13 @@ public class ActionQueryListWithFilterPaging extends BaseAction {
}
}
if (check) {
if (check && !BooleanUtils.isTrue(wi.getJustData())) {
// 从Review表中查询符合条件的对象总数
try {
if( isManager ) {
personName = null;
}
total = documentQueryService.countWithCondition( personName, queryFilter );
total = documentQueryService.countWithCondition( personName, queryFilter, false);
} catch (Exception e) {
check = false;
Exception exception = new ExceptionDocumentInfoProcess(e, "系统在获取用户可查询到的文档数据条目数量时发生异常。");
......@@ -106,7 +108,7 @@ public class ActionQueryListWithFilterPaging extends BaseAction {
if( isManager ) {
personName = null;
}
searchResultList = documentQueryService.listPagingWithCondition( personName, wi.getOrderField(), wi.getOrderType(), queryFilter, page, size );
searchResultList = documentQueryService.listPagingWithCondition( personName, wi.getOrderField(), wi.getOrderType(), queryFilter, page, size, false);
} catch (Exception e) {
check = false;
Exception exception = new ExceptionDocumentInfoProcess(e, "系统在根据用户可访问的文档ID列表对文档进行分页查询时发生异常。");
......@@ -172,7 +174,16 @@ public class ActionQueryListWithFilterPaging extends BaseAction {
}
public static class Wi extends WrapInDocumentFilter{
@FieldDescribe( "仅返回数据不查询总数,默认false" )
private Boolean justData;
public Boolean getJustData() {
return justData;
}
public void setJustData(Boolean justData) {
this.justData = justData;
}
}
public static class Wo extends WrapOutDocumentList {
......
......@@ -19,6 +19,7 @@ import com.x.cms.core.entity.Review;
import com.x.cms.core.entity.Review_;
import com.x.cms.core.express.tools.CriteriaBuilderTools;
import com.x.cms.core.express.tools.filter.QueryFilter;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import javax.persistence.EntityManager;
......@@ -36,57 +37,51 @@ public class ActionQueryListWithFilterPagingAdmin extends BaseAction {
protected ActionResult<List<Wo>> execute( HttpServletRequest request, Integer page, Integer size, JsonElement jsonElement, EffectivePerson effectivePerson ) throws Exception {
ActionResult<List<Wo>> result = new ActionResult<>();
Long total = 0L;
List<Wo> wos = new ArrayList<>();
Business business = new Business(null);
if(!business.isManager(effectivePerson)){
if (!business.isManager(effectivePerson)) {
result.setCount(0L);
result.setData(wos);
return result;
}
Wi wi = this.convertToWrapIn( jsonElement, Wi.class );
Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
if( StringUtils.isEmpty( wi.getDocumentType() )) {
wi.setDocumentType( "信息" );
if (StringUtils.isEmpty(wi.getDocumentType())) {
wi.setDocumentType("信息");
}
if( StringUtils.isEmpty( wi.getOrderField() )) {
wi.setOrderField( "createTime" );
if (StringUtils.isEmpty(wi.getOrderField())) {
wi.setOrderField("publishTime");
}
if( StringUtils.isEmpty( wi.getOrderType() )) {
wi.setOrderType( "DESC" );
if (StringUtils.isEmpty(wi.getOrderType())) {
wi.setOrderType("DESC");
}
if( ListTools.isEmpty( wi.getStatusList() )) {
if (ListTools.isEmpty(wi.getStatusList())) {
List<String> status = new ArrayList<>();
status.add( "published" );
wi.setStatusList( status );
status.add("published");
wi.setStatusList(status);
}
QueryFilter queryFilter = wi.getQueryFilter();
List<DocumentWo> docWos = new ArrayList<>();
try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
EntityManager em = emc.get(Document.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Document> cq = cb.createQuery(Document.class);
Root<Document> root = cq.from(Document.class);
Predicate p = CriteriaBuilderTools.composePredicateWithQueryFilter(Document_.class, cb, null, root, queryFilter);
if("asc".equalsIgnoreCase(wi.getOrderType())){
docWos = emc.fetchAscPaging(Document.class, DocumentWo.copier, p, page, size, wi.getOrderField());
}else {
docWos = emc.fetchDescPaging(Document.class, DocumentWo.copier, p, page, size, wi.getOrderField());
String personName = wi.getPerson();
if (StringUtils.isNotBlank(wi.getPerson())) {
personName = business.organization().person().get(wi.getPerson());
if (StringUtils.isBlank(personName)) {
personName = wi.getPerson();
}
total = emc.count(Document.class, p);
}
Long total = 0L;
if (!BooleanUtils.isTrue(wi.getJustData())){
total = documentQueryService.countWithCondition(personName, queryFilter, wi.getAuthor());
}
List<Document> searchResultList = documentQueryService.listPagingWithCondition( personName, wi.getOrderField(), wi.getOrderType(), queryFilter, page, size, wi.getAuthor());
Wo wo = null;
for( DocumentWo documentWo : docWos ) {
for( Document document : searchResultList ) {
try {
wo = Wo.copier.copy( documentWo );
wo = Wo.copier.copy( document );
if( wo.getCreatorPerson() != null && !wo.getCreatorPerson().isEmpty() ) {
wo.setCreatorPersonShort( wo.getCreatorPerson().split( "@" )[0]);
}
......@@ -98,7 +93,7 @@ public class ActionQueryListWithFilterPagingAdmin extends BaseAction {
}
if( wi.getNeedData() ) {
//需要组装数据
wo.setData( documentQueryService.getDocumentData( documentWo ) );
wo.setData( documentQueryService.getDocumentData( document ) );
}
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
......@@ -111,35 +106,40 @@ public class ActionQueryListWithFilterPagingAdmin extends BaseAction {
return result;
}
public class DocumentCacheForFilter {
public static class Wi extends WrapInDocumentFilter{
private Long total = 0L;
private List<Wo> documentList = null;
@FieldDescribe( "查询指定用户可阅读的文档" )
private String person;
public Long getTotal() {
return total;
}
@FieldDescribe( "是否查询指定用户可编辑的文档,如果为true则person字段必填,默认为否" )
private Boolean isAuthor;
public void setTotal(Long total) {
this.total = total;
@FieldDescribe( "仅返回数据不查询总数,默认false" )
private Boolean justData;
public String getPerson() {
return person;
}
public List<Wo> getDocumentList() {
return documentList;
public void setPerson(String person) {
this.person = person;
}
public void setDocumentList(List<Wo> documentList) {
this.documentList = documentList;
public Boolean getAuthor() {
return isAuthor;
}
}
public static class Wi extends WrapInDocumentFilter{
public void setAuthor(Boolean author) {
isAuthor = author;
}
}
public Boolean getJustData() {
return justData;
}
public static class DocumentWo extends Document{
static WrapCopier<Document, DocumentWo> copier = WrapCopierFactory.wo(Document.class, DocumentWo.class,
JpaObject.singularAttributeField(Document.class, true, true), null);
public void setJustData(Boolean justData) {
this.justData = justData;
}
}
public static class Wo extends WrapOutDocumentList {
......
......@@ -458,12 +458,12 @@ public class DocumentQueryService {
* @throws Exception
*/
public List<Document> listPagingWithCondition( String personName, String orderField, String orderType, QueryFilter queryFilter, Integer adjustPage,
Integer pageSize ) throws Exception {
Integer pageSize, Boolean isAuthor) throws Exception {
if( pageSize == 0 ) { pageSize = 20; }
//按正常逻辑根据序列进行分页查询
try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
Business business = new Business(emc);
return business.getDocumentFactory().listPagingWithCondition(personName, orderField, orderType, queryFilter, adjustPage, pageSize);
return business.getDocumentFactory().listPagingWithCondition(personName, orderField, orderType, queryFilter, adjustPage, pageSize, isAuthor);
} catch ( Exception e ) {
throw e;
}
......@@ -476,11 +476,11 @@ public class DocumentQueryService {
* @return
* @throws Exception
*/
public Long countWithCondition( String personName, QueryFilter queryFilter) throws Exception {
public Long countWithCondition( String personName, QueryFilter queryFilter, Boolean isAuthor) throws Exception {
//按正常逻辑根据序列进行分页查询
try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
Business business = new Business(emc);
return business.getDocumentFactory().countWithCondition(personName, queryFilter);
return business.getDocumentFactory().countWithCondition(personName, queryFilter, isAuthor);
} catch ( Exception e ) {
throw e;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册