Просмотр исходного кода

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

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

See merge request o2oa/o2oa!1889
o2null 5 лет назад
Родитель
Сommit
2eedce6625

+ 4 - 58
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/input/ActionCover.java

@@ -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;

+ 15 - 2
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/input/ActionCreate.java

@@ -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);
 		}

+ 56 - 0
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/input/BaseAction.java

@@ -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);
+	}
+
 }

+ 37 - 1
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/query/ActionDelete.java

@@ -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 {
 	}
 }

+ 38 - 0
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/table/ActionBuild.java

@@ -0,0 +1,38 @@
+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 {
+
+	}
+
+}

+ 21 - 2
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/table/ActionBuildAll.java

@@ -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);
 

+ 19 - 2
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/table/TableAction.java

@@ -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}")