提交 c513c7ec 编写于 作者: O o2sword

数据中心查询优化2

上级 7b0802e3
......@@ -2,9 +2,9 @@ package com.x.query.assemble.designer.jaxrs;
import javax.servlet.annotation.WebFilter;
import com.x.base.core.project.jaxrs.AnonymousCipherManagerUserJaxrsFilter;
import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
@WebFilter(urlPatterns = "/jaxrs/statement/*", asyncSupported = true)
public class StatementJaxrsFilter extends AnonymousCipherManagerUserJaxrsFilter {
public class StatementJaxrsFilter extends CipherManagerUserJaxrsFilter {
}
......@@ -4,6 +4,7 @@ import java.util.List;
import com.x.query.assemble.surface.factory.*;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import com.x.base.core.container.EntityManagerContainer;
......@@ -203,6 +204,39 @@ public class Business {
return false;
}
public boolean readable(EffectivePerson effectivePerson, Statement statement) throws Exception {
if (null == statement) {
return false;
}
if(BooleanUtils.isTrue(statement.getAnonymousAccessible())){
return true;
}
if (effectivePerson.isManager()) {
return true;
}
if (statement.getExecutePersonList().isEmpty() && statement.getExecuteUnitList().isEmpty()) {
return true;
}
if (CollectionUtils.containsAny(statement.getExecutePersonList(),
organization().identity().listWithPerson(effectivePerson))) {
return true;
}
if (CollectionUtils.containsAny(statement.getExecuteUnitList(),
organization().unit().listWithPersonSupNested(effectivePerson))) {
return true;
}
Query query = this.entityManagerContainer().find(statement.getQuery(), Query.class);
/** 在所属query的管理人员中 */
if (null != query && ListTools.contains(query.getControllerList(), effectivePerson.getDistinguishedName())) {
return true;
}
if (organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager,
OrganizationDefinition.QueryManager)) {
return true;
}
return false;
}
public boolean readable(EffectivePerson effectivePerson, Reveal reveal) throws Exception {
if (null == reveal) {
return false;
......@@ -293,22 +327,26 @@ public class Business {
public boolean executable(EffectivePerson effectivePerson, Statement o) throws Exception {
boolean result = false;
if (null != o) {
if (ListTools.isEmpty(o.getExecutePersonList()) && ListTools.isEmpty(o.getExecuteUnitList())) {
if(BooleanUtils.isTrue(o.getAnonymousAccessible())){
result = true;
}
if (!result) {
if (effectivePerson.isManager()
|| (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager,
OrganizationDefinition.QueryManager))
|| effectivePerson.isPerson(o.getExecutePersonList())) {
}else {
if (ListTools.isEmpty(o.getExecutePersonList()) && ListTools.isEmpty(o.getExecuteUnitList())) {
result = true;
}
if ((!result) && ListTools.isNotEmpty(o.getExecuteUnitList())) {
List<String> units = this.organization().unit()
.listWithPerson(effectivePerson.getDistinguishedName());
if (ListTools.containsAny(units, o.getExecuteUnitList())) {
if (!result) {
if (effectivePerson.isManager()
|| (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager,
OrganizationDefinition.QueryManager))
|| effectivePerson.isPerson(o.getExecutePersonList())) {
result = true;
}
if ((!result) && ListTools.isNotEmpty(o.getExecuteUnitList())) {
List<String> units = this.organization().unit()
.listWithPerson(effectivePerson.getDistinguishedName());
if (ListTools.containsAny(units, o.getExecuteUnitList())) {
result = true;
}
}
}
}
}
......
......@@ -110,7 +110,13 @@ class ActionExecute extends BaseAction {
Object o = compiledScript.eval(scriptContext);
String text = ScriptFactory.asString(o);
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em = business.entityManagerContainer().get(cls);
EntityManager em;
if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
em = business.entityManagerContainer().get(DynamicBaseEntity.class);
}else{
em = business.entityManagerContainer().get(cls);
}
Query query = em.createQuery(text);
for (Parameter<?> p : query.getParameters()) {
if (runtime.hasParameter(p.getName())) {
......
package com.x.query.assemble.surface.jaxrs.statement;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.dynamic.DynamicBaseEntity;
import com.x.base.core.entity.dynamic.DynamicEntity;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.exception.ExceptionEntityNotExist;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.script.AbstractResources;
import com.x.base.core.project.script.ScriptFactory;
import com.x.base.core.project.webservices.WebservicesClient;
import com.x.organization.core.express.Organization;
import com.x.query.assemble.surface.Business;
import com.x.query.assemble.surface.ThisApplication;
import com.x.query.core.entity.schema.Statement;
import com.x.query.core.entity.schema.Table;
import com.x.query.core.express.statement.Runtime;
import org.apache.commons.lang3.StringUtils;
import javax.persistence.EntityManager;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;
import java.util.Objects;
class ActionExecuteV2 extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionExecuteV2.class);
ActionResult<Object> execute(EffectivePerson effectivePerson, String flag, String mode, Integer page, Integer size,
JsonElement jsonElement) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Object> result = new ActionResult<>();
Business business = new Business(emc);
Statement statement = emc.flag(flag, Statement.class);
if (null == statement) {
throw new ExceptionEntityNotExist(flag, Statement.class);
}
if (!business.executable(effectivePerson, statement)) {
throw new ExceptionAccessDenied(effectivePerson, statement);
}
Runtime runtime = this.runtime(effectivePerson, jsonElement, business, page, size);
Object data = null;
Object count = null;
switch (mode){
case Statement.MODE_DATA:
switch (Objects.toString(statement.getFormat(), "")) {
case Statement.FORMAT_SCRIPT:
data = this.script(effectivePerson, business, statement, runtime, mode);
break;
default:
data = this.jpql(effectivePerson, business, statement, runtime, mode);
break;
}
result.setData(data);
break;
case Statement.MODE_COUNT:
switch (Objects.toString(statement.getFormat(), "")) {
case Statement.FORMAT_SCRIPT:
count = this.script(effectivePerson, business, statement, runtime, mode);
break;
default:
count = this.jpql(effectivePerson, business, statement, runtime, mode);
break;
}
result.setData(count);
result.setCount((Long)count);
break;
default:
switch (Objects.toString(statement.getFormat(), "")) {
case Statement.FORMAT_SCRIPT:
data = this.script(effectivePerson, business, statement, runtime, Statement.MODE_DATA);
count = this.script(effectivePerson, business, statement, runtime, Statement.MODE_COUNT);
break;
default:
data = this.jpql(effectivePerson, business, statement, runtime, Statement.MODE_DATA);
count = this.jpql(effectivePerson, business, statement, runtime, Statement.MODE_COUNT);
break;
}
result.setData(data);
result.setCount((Long)count);
}
return result;
}
}
private Object script(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime, String mode)
throws Exception {
Object data = null;
ScriptContext scriptContext = this.scriptContext(effectivePerson, business, runtime);
ScriptFactory.initialServiceScriptText().eval(scriptContext);
String scriptText = statement.getScriptText();
if(Statement.MODE_COUNT.equals(mode)) {
scriptText = statement.getCountScriptText();
}
Object o = ScriptFactory.scriptEngine.eval(ScriptFactory.functionalization(scriptText),
scriptContext);
String text = ScriptFactory.asString(o);
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em;
if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
em = business.entityManagerContainer().get(DynamicBaseEntity.class);
}else{
em = business.entityManagerContainer().get(cls);
}
Query query = em.createQuery(text);
for (Parameter<?> p : query.getParameters()) {
if (runtime.hasParameter(p.getName())) {
query.setParameter(p.getName(), runtime.getParameter(p.getName()));
}
}
if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
if(Statement.MODE_COUNT.equals(mode)) {
data = query.getSingleResult();
}else{
query.setFirstResult((runtime.page - 1) * runtime.size);
query.setMaxResults(runtime.size);
data = query.getResultList();
}
} else {
business.entityManagerContainer().beginTransaction(cls);
data = query.executeUpdate();
business.entityManagerContainer().commit();
}
return data;
}
private Object jpql(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime, String mode)
throws Exception {
Object data = null;
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em;
if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
em = business.entityManagerContainer().get(DynamicBaseEntity.class);
}else{
em = business.entityManagerContainer().get(cls);
}
String jpqlData = statement.getData();
if(Statement.MODE_COUNT.equals(mode)) {
jpqlData = statement.getCountData();
}
Query query = em.createQuery(jpqlData);
for (Parameter<?> p : query.getParameters()) {
if (runtime.hasParameter(p.getName())) {
query.setParameter(p.getName(), runtime.getParameter(p.getName()));
}
}
if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
if(Statement.MODE_COUNT.equals(mode)) {
data = query.getSingleResult();
}else{
query.setFirstResult((runtime.page - 1) * runtime.size);
query.setMaxResults(runtime.size);
data = query.getResultList();
}
} else {
business.entityManagerContainer().beginTransaction(cls);
data = Integer.valueOf(query.executeUpdate());
business.entityManagerContainer().commit();
}
return data;
}
private Class<? extends JpaObject> clazz(Business business, Statement statement) throws Exception {
Class<? extends JpaObject> cls = null;
if (StringUtils.equals(Statement.ENTITYCATEGORY_OFFICIAL, statement.getEntityCategory())
|| StringUtils.equals(Statement.ENTITYCATEGORY_CUSTOM, statement.getEntityCategory())) {
cls = (Class<? extends JpaObject>) Class.forName(statement.getEntityClassName());
} else {
Table table = business.entityManagerContainer().flag(statement.getTable(), Table.class);
if (null == table) {
throw new ExceptionEntityNotExist(statement.getTable(), Table.class);
}
DynamicEntity dynamicEntity = new DynamicEntity(table.getName());
cls = (Class<? extends JpaObject>) Class.forName(dynamicEntity.className());
}
return cls;
}
private ScriptContext scriptContext(EffectivePerson effectivePerson, Business business, Runtime runtime)
throws Exception {
ScriptContext scriptContext = new SimpleScriptContext();
ActionExecute.Resources resources = new ActionExecute.Resources();
resources.setEntityManagerContainer(business.entityManagerContainer());
resources.setContext(ThisApplication.context());
resources.setApplications(ThisApplication.context().applications());
resources.setWebservicesClient(new WebservicesClient());
resources.setOrganization(new Organization(ThisApplication.context()));
Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put(ScriptFactory.BINDING_NAME_RESOURCES, resources);
bindings.put(ScriptFactory.BINDING_NAME_EFFECTIVEPERSON, effectivePerson);
bindings.put(ScriptFactory.BINDING_NAME_PARAMETERS, gson.toJson(runtime.getParameters()));
return scriptContext;
}
public static class Resources extends AbstractResources {
private Organization organization;
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
}
}
\ No newline at end of file
package com.x.query.assemble.surface.jaxrs.statement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.exception.ExceptionEntityNotExist;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.query.assemble.surface.Business;
import com.x.query.core.entity.Query;
import com.x.query.core.entity.schema.Statement;
class ActionGet extends BaseAction {
ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
Statement statement = emc.flag(flag, Statement.class);
if (null == statement) {
throw new ExceptionEntityNotExist(flag, Statement.class);
}
Query query = emc.flag(statement.getQuery(), Query.class);
if (null == query) {
throw new ExceptionEntityNotExist(flag, Query.class);
}
if (!business.readable(effectivePerson, query)) {
throw new ExceptionAccessDenied(effectivePerson, query);
}
if (!business.readable(effectivePerson, statement)) {
throw new ExceptionAccessDenied(effectivePerson, statement);
}
Wo wo = Wo.copier.copy(statement);
result.setData(wo);
return result;
}
}
public static class Wo extends Statement {
private static final long serialVersionUID = -5755898083219447939L;
static WrapCopier<Statement, Wo> copier = WrapCopierFactory.wo(Statement.class, Wo.class, null,
JpaObject.FieldsInvisible);
}
}
package com.x.query.assemble.surface.jaxrs.statement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.exception.ExceptionEntityNotExist;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.query.assemble.surface.Business;
import com.x.query.core.entity.Query;
import com.x.query.core.entity.schema.Statement;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
class ActionListWithQuery extends BaseAction {
ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String queryFlag, Boolean justSelect, Boolean hasView) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<List<Wo>> result = new ActionResult<>();
Business business = new Business(emc);
Query query = emc.flag(queryFlag, Query.class);
if (null == query) {
throw new ExceptionEntityNotExist(queryFlag);
}
if (!business.readable(effectivePerson, query)) {
throw new ExceptionAccessDenied(effectivePerson.getDistinguishedName());
}
List<Wo> wos = new ArrayList<>();
for (String id : emc.idsEqual(Statement.class, Statement.query_FIELDNAME, query.getId())) {
Statement o = business.pick(id, Statement.class);
if (null != o) {
if(BooleanUtils.isTrue(hasView) && StringUtils.isBlank(o.getView())){
continue;
}
if(BooleanUtils.isTrue(justSelect) && !Statement.TYPE_SELECT.equals(o.getType())){
continue;
}
if (business.readable(effectivePerson, o)) {
wos.add(Wo.copier.copy(o));
}
}
}
result.setData(wos);
return result;
}
}
public static class Wo extends Statement {
private static final long serialVersionUID = -5755898083219447939L;
static WrapCopier<Statement, Wo> copier = WrapCopierFactory.wo(Statement.class, Wo.class,
JpaObject.singularAttributeField(Statement.class, true, true), JpaObject.FieldsInvisible);
}
}
package com.x.query.assemble.surface.jaxrs.statement;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.*;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
......@@ -23,6 +19,8 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import java.util.List;
@Path("statement")
@JaxrsDescribe("语句")
public class StatementAction extends StandardJaxrsAction {
......@@ -49,4 +47,63 @@ public class StatementAction extends StandardJaxrsAction {
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "根据查询列示语句对象.", action = ActionListWithQuery.class)
@GET
@Path("list/query/{queryFlag}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void listWithQuery(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("查询标识") @PathParam("queryFlag") String queryFlag,
@JaxrsParameterDescribe("是否只查询select语句") @QueryParam("justSelect") Boolean justSelect,
@JaxrsParameterDescribe("是否只查询含有视图的语句") @QueryParam("hasView") Boolean hasView) {
ActionResult<List<ActionListWithQuery.Wo>> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new ActionListWithQuery().execute(effectivePerson, queryFlag, justSelect, hasView);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "获取语句内容.", action = ActionGet.class)
@GET
@Path("{id}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
ActionResult<ActionGet.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new ActionGet().execute(effectivePerson, id);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "执行语句V2,可以同时执行查询结果及查询总数.", action = ActionExecuteV2.class)
@POST
@Path("{flag}/execute/mode/{mode}page/{page}/size/{size}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void executeV2(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("标识") @PathParam("flag") String flag,
@JaxrsParameterDescribe("执行模式:data|count|all") @PathParam("mode") String mode,
@JaxrsParameterDescribe("页码") @PathParam("page") Integer page,
@JaxrsParameterDescribe("每页数量") @PathParam("size") Integer size, JsonElement jsonElement) {
ActionResult<Object> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new ActionExecuteV2().execute(effectivePerson, flag, mode, page, size, jsonElement);
} catch (Exception e) {
logger.error(e, effectivePerson, request, jsonElement);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
}
\ No newline at end of file
......@@ -229,6 +229,20 @@ public class Statement extends SliceJpaObject {
@CheckPersist(allowEmpty = true)
private String entityCategory;
public static final String testParameters_FIELDNAME = "testParameters";
@FieldDescribe("测试参数(json格式文本).")
@Lob
@Basic(fetch = FetchType.EAGER)
@Column(length = JpaObject.length_4K, name = ColumnNamePrefix + testParameters_FIELDNAME)
@CheckPersist(allowEmpty = true)
private String testParameters;
public static final String anonymousAccessible_FIELDNAME = "anonymousAccessible";
@FieldDescribe("是否允许匿名访问(boolean类型)")
@CheckPersist(allowEmpty = true)
@Column(name = ColumnNamePrefix + anonymousAccessible_FIELDNAME)
private Boolean anonymousAccessible;
public void setEntityCategory(String entityCategory) {
this.entityCategory = entityCategory;
}
......@@ -372,4 +386,20 @@ public class Statement extends SliceJpaObject {
public void setView(String view) {
this.view = view;
}
public String getTestParameters() {
return testParameters;
}
public void setTestParameters(String testParameters) {
this.testParameters = testParameters;
}
public Boolean getAnonymousAccessible() {
return anonymousAccessible;
}
public void setAnonymousAccessible(Boolean anonymousAccessible) {
this.anonymousAccessible = anonymousAccessible;
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册