提交 2eedce66 编写于 作者: O o2null

Merge branch 'feature/自建表编译优化' into 'wrdp'

[数据中心]自建表编译优化,支持集群同时编译

See merge request o2oa/o2oa!1889
......@@ -128,10 +128,10 @@ class ActionCover extends BaseAction {
}
if (StringUtils.isNotEmpty(obj.getAlias())) {
obj.setAlias(
this.idleAliasWithQuery(business, query.getId(), obj.getAlias(), Table.class, obj.getId()));
this.idleAliasWithQuery(business, null, obj.getAlias(), Table.class, obj.getId()));
}
if (StringUtils.isNotEmpty(obj.getName())) {
obj.setName(this.idleNameWithQuery(business, query.getId(), obj.getName(), Table.class, obj.getId()));
obj.setName(this.idleNameWithQuery(business, null, obj.getName(), Table.class, obj.getId()));
}
obj.setQuery(query.getId());
}
......@@ -145,10 +145,10 @@ class ActionCover extends BaseAction {
}
if (StringUtils.isNotEmpty(obj.getAlias())) {
obj.setAlias(
this.idleAliasWithQuery(business, query.getId(), obj.getAlias(), Statement.class, obj.getId()));
this.idleAliasWithQuery(business, null, obj.getAlias(), Statement.class, obj.getId()));
}
if (StringUtils.isNotEmpty(obj.getName())) {
obj.setName(this.idleNameWithQuery(business, query.getId(), obj.getName(), Statement.class, obj.getId()));
obj.setName(this.idleNameWithQuery(business, null, obj.getName(), Statement.class, obj.getId()));
}
obj.setQuery(query.getId());
}
......@@ -165,8 +165,6 @@ class ActionCover extends BaseAction {
if(!wi.getTableList().isEmpty()){
CacheManager.notify(Table.class);
CacheManager.notify(Statement.class);
business.buildAllTable();
}else if(!wi.getStatementList().isEmpty()){
CacheManager.notify(Statement.class);
}
......@@ -183,58 +181,6 @@ class ActionCover extends BaseAction {
return query;
}
private <T extends JpaObject> String idleNameWithQuery(Business business, String queryId, String name, Class<T> cls,
String excludeId) throws Exception {
if (StringUtils.isEmpty(name)) {
return "";
}
List<String> list = new ArrayList<>();
list.add(name);
for (int i = 1; i < 99; i++) {
list.add(name + String.format("%02d", i));
}
list.add(StringTools.uniqueToken());
EntityManager em = business.entityManagerContainer().get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<T> root = cq.from(cls);
Predicate p = root.get("name").in(list);
p = cb.and(p, cb.equal(root.get("query"), queryId));
if (StringUtils.isNotEmpty(excludeId)) {
p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId));
}
cq.select(root.get("name")).where(p);
List<String> os = em.createQuery(cq).getResultList();
list = ListUtils.subtract(list, os);
return list.get(0);
}
private <T extends JpaObject> String idleAliasWithQuery(Business business, String queryId, String alias,
Class<T> cls, String excludeId) throws Exception {
if (StringUtils.isEmpty(alias)) {
return "";
}
List<String> list = new ArrayList<>();
list.add(alias);
for (int i = 1; i < 99; i++) {
list.add(alias + String.format("%02d", i));
}
list.add(StringTools.uniqueToken());
EntityManager em = business.entityManagerContainer().get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<T> root = cq.from(cls);
Predicate p = root.get("alias").in(list);
p = cb.and(p, cb.equal(root.get("query"), queryId));
if (StringUtils.isNotEmpty(excludeId)) {
p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId));
}
cq.select(root.get("alias")).where(p);
List<String> os = em.createQuery(cq).getResultList();
list = ListUtils.subtract(list, os);
return list.get(0);
}
public static class Wi extends WrapQuery {
private static final long serialVersionUID = -4612391443319365035L;
......
......@@ -22,6 +22,7 @@ import com.x.query.core.entity.View;
import com.x.query.core.entity.schema.Statement;
import com.x.query.core.entity.schema.Table;
import com.x.query.core.entity.wrap.*;
import org.apache.commons.lang3.StringUtils;
class ActionCreate extends BaseAction {
......@@ -79,6 +80,13 @@ class ActionCreate extends BaseAction {
}
obj = WrapTable.inCopier.copy(_o);
obj.setQuery(query.getId());
if (StringUtils.isNotEmpty(obj.getAlias())) {
obj.setAlias(
this.idleAliasWithQuery(business, null, obj.getAlias(), Table.class, obj.getId()));
}
if (StringUtils.isNotEmpty(obj.getName())) {
obj.setName(this.idleNameWithQuery(business, null, obj.getName(), Table.class, obj.getId()));
}
persistObjects.add(obj);
}
for (WrapStatement _o : wi.getStatementList()) {
......@@ -88,6 +96,13 @@ class ActionCreate extends BaseAction {
}
obj = WrapStatement.inCopier.copy(_o);
obj.setQuery(query.getId());
if (StringUtils.isNotEmpty(obj.getAlias())) {
obj.setAlias(
this.idleAliasWithQuery(business, null, obj.getAlias(), Statement.class, obj.getId()));
}
if (StringUtils.isNotEmpty(obj.getName())) {
obj.setName(this.idleNameWithQuery(business, null, obj.getName(), Statement.class, obj.getId()));
}
persistObjects.add(obj);
}
for (WrapReveal _o : wi.getRevealList()) {
......@@ -112,8 +127,6 @@ class ActionCreate extends BaseAction {
if(!wi.getTableList().isEmpty()){
CacheManager.notify(Table.class);
CacheManager.notify(Statement.class);
business.buildAllTable();
}else if(!wi.getStatementList().isEmpty()){
CacheManager.notify(Statement.class);
}
......
......@@ -95,4 +95,60 @@ abstract class BaseAction extends StandardJaxrsAction {
return list.get(0);
}
protected <T extends JpaObject> String idleNameWithQuery(Business business, String queryId, String name, Class<T> cls,
String excludeId) throws Exception {
if (StringUtils.isEmpty(name)) {
return "";
}
List<String> list = new ArrayList<>();
list.add(name);
for (int i = 1; i < 99; i++) {
list.add(name + String.format("%02d", i));
}
list.add(StringTools.uniqueToken());
EntityManager em = business.entityManagerContainer().get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<T> root = cq.from(cls);
Predicate p = root.get("name").in(list);
if (StringUtils.isNotEmpty(queryId)) {
p = cb.and(p, cb.equal(root.get("query"), queryId));
}
if (StringUtils.isNotEmpty(excludeId)) {
p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId));
}
cq.select(root.get("name")).where(p);
List<String> os = em.createQuery(cq).getResultList();
list = ListUtils.subtract(list, os);
return list.get(0);
}
protected <T extends JpaObject> String idleAliasWithQuery(Business business, String queryId, String alias,
Class<T> cls, String excludeId) throws Exception {
if (StringUtils.isEmpty(alias)) {
return "";
}
List<String> list = new ArrayList<>();
list.add(alias);
for (int i = 1; i < 99; i++) {
list.add(alias + String.format("%02d", i));
}
list.add(StringTools.uniqueToken());
EntityManager em = business.entityManagerContainer().get(cls);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<T> root = cq.from(cls);
Predicate p = root.get("alias").in(list);
if (StringUtils.isNotEmpty(queryId)) {
p = cb.and(p, cb.equal(root.get("query"), queryId));
}
if (StringUtils.isNotEmpty(excludeId)) {
p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId));
}
cq.select(root.get("alias")).where(p);
List<String> os = em.createQuery(cq).getResultList();
list = ListUtils.subtract(list, os);
return list.get(0);
}
}
\ No newline at end of file
......@@ -25,13 +25,17 @@ import com.x.query.core.entity.Stat;
import com.x.query.core.entity.Stat_;
import com.x.query.core.entity.View;
import com.x.query.core.entity.View_;
import com.x.query.core.entity.schema.Statement;
import com.x.query.core.entity.schema.Statement_;
import com.x.query.core.entity.schema.Table;
import com.x.query.core.entity.schema.Table_;
class ActionDelete extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionDelete.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
logger.debug(effectivePerson, "flag:{}.", flag);
logger.print( "{} delete query flag:{}.",effectivePerson.getDistinguishedName(), flag);
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
......@@ -58,6 +62,16 @@ class ActionDelete extends BaseAction {
emc.remove(_o, CheckRemoveType.all);
}
emc.commit();
emc.beginTransaction(Statement.class);
for (Statement _o : this.listStatement(business, query)) {
emc.remove(_o, CheckRemoveType.all);
}
emc.commit();
emc.beginTransaction(Table.class);
for (Table _o : this.listTable(business, query)) {
emc.remove(_o, CheckRemoveType.all);
}
emc.commit();
emc.beginTransaction(Query.class);
emc.remove(query, CheckRemoveType.all);
emc.commit();
......@@ -65,6 +79,8 @@ class ActionDelete extends BaseAction {
CacheManager.notify(Stat.class);
CacheManager.notify(Reveal.class);
CacheManager.notify(Query.class);
CacheManager.notify(Table.class);
CacheManager.notify(Statement.class);
Wo wo = new Wo();
wo.setId(query.getId());
result.setData(wo);
......@@ -102,6 +118,26 @@ class ActionDelete extends BaseAction {
return os;
}
private List<Table> listTable(Business business, Query query) throws Exception {
EntityManager em = business.entityManagerContainer().get(Table.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Table> cq = cb.createQuery(Table.class);
Root<Table> root = cq.from(Table.class);
Predicate p = cb.equal(root.get(Table_.query), query.getId());
List<Table> os = em.createQuery(cq.select(root).where(p)).getResultList();
return os;
}
private List<Statement> listStatement(Business business, Query query) throws Exception {
EntityManager em = business.entityManagerContainer().get(Statement.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Statement> cq = cb.createQuery(Statement.class);
Root<Statement> root = cq.from(Statement.class);
Predicate p = cb.equal(root.get(Statement_.query), query.getId());
List<Statement> os = em.createQuery(cq.select(root).where(p)).getResultList();
return os;
}
public static class Wo extends WoId {
}
}
package com.x.query.assemble.designer.jaxrs.table;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WrapBoolean;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.query.assemble.designer.Business;
class ActionBuild extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionBuild.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Wo wo = new Wo();
Business business = new Business(emc);
if (!business.controllable(effectivePerson)) {
throw new ExceptionAccessDenied(effectivePerson);
}
wo.setValue(business.buildAllTable());
logger.print("build table complete!");
result.setData(wo);
return result;
}
}
public static class Wo extends WrapBoolean {
}
}
\ No newline at end of file
......@@ -2,13 +2,21 @@ package com.x.query.assemble.designer.jaxrs.table;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.project.Application;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WrapBoolean;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.x_query_assemble_designer;
import com.x.query.assemble.designer.Business;
import com.x.query.assemble.designer.ThisApplication;
import java.util.Date;
import java.util.List;
class ActionBuildAll extends BaseAction {
......@@ -22,8 +30,19 @@ class ActionBuildAll extends BaseAction {
if (!business.controllable(effectivePerson)) {
throw new ExceptionAccessDenied(effectivePerson);
}
wo.setValue(business.buildAllTable());
List<Application> apps = ThisApplication.context().applications().get(x_query_assemble_designer.class);
if (ListTools.isNotEmpty(apps)) {
apps.stream().forEach(o -> {
String url = o.getUrlJaxrsRoot() + "table/build?tt="+new Date().getTime();
logger.print("{} do dispatch build table request to : {}", effectivePerson.getDistinguishedName(), url);
try {
CipherConnectionAction.get(effectivePerson.getDebugger(), url);
} catch (Exception e) {
e.printStackTrace();
}
});
}
wo.setValue(true);
result.setData(wo);
......
......@@ -53,12 +53,12 @@ public class TableAction extends StandardJaxrsAction {
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "编译表对象生成实体类进行数据库建表,执行后需要重新启动.", action = ActionBuildAll.class)
@JaxrsMethodDescribe(value = "编译表对象生成实体类进行数据库建表,执行后需要重新启动,支持集群环境.", action = ActionBuildAll.class)
@GET
@Path("build/all")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void buildAll(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
public synchronized void buildAll(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
ActionResult<ActionBuildAll.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
......@@ -70,6 +70,23 @@ public class TableAction extends StandardJaxrsAction {
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "编译表对象生成实体类进行数据库建表,执行后需要重新启动,仅对当前服务器.", action = ActionBuild.class)
@GET
@Path("build")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void build(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
ActionResult<ActionBuild.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new ActionBuild().execute(effectivePerson);
} 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("{flag}")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册