فهرست منبع

自建表支持数组查询和展现

o2sword 4 سال پیش
والد
کامیت
a0908373be

+ 10 - 8
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/FilterEntry.java

@@ -49,6 +49,8 @@ public class FilterEntry extends GsonPropertyObject {
 
 	public static final String DEFINE_UNITALLLIST = "@unitAllList";
 
+	public static final String WILDCARD = "*";
+
 	/** 用于customFilterEntry */
 	public String title;
 
@@ -137,31 +139,31 @@ public class FilterEntry extends GsonPropertyObject {
 			p = cb.and(p, cb.equal(root.get(Item_.path0), paths[0]));
 		}
 
-		if ((paths.length > 1) && StringUtils.isNotEmpty(paths[1])) {
+		if ((paths.length > 1) && StringUtils.isNotEmpty(paths[1]) && !WILDCARD.equals(paths[1])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path1), paths[1]));
 		}
 
-		if ((paths.length > 2) && StringUtils.isNotEmpty(paths[2])) {
+		if ((paths.length > 2) && StringUtils.isNotEmpty(paths[2]) && !WILDCARD.equals(paths[2])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path2), paths[2]));
 		}
 
-		if ((paths.length > 3) && StringUtils.isNotEmpty(paths[3])) {
+		if ((paths.length > 3) && StringUtils.isNotEmpty(paths[3]) && !WILDCARD.equals(paths[3])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path3), paths[3]));
 		}
 
-		if ((paths.length > 4) && StringUtils.isNotEmpty(paths[4])) {
+		if ((paths.length > 4) && StringUtils.isNotEmpty(paths[4]) && !WILDCARD.equals(paths[4])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path4), paths[4]));
 		}
 
-		if ((paths.length > 5) && StringUtils.isNotEmpty(paths[5])) {
+		if ((paths.length > 5) && StringUtils.isNotEmpty(paths[5]) && !WILDCARD.equals(paths[5])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path5), paths[5]));
 		}
 
-		if ((paths.length > 6) && StringUtils.isNotEmpty(paths[6])) {
+		if ((paths.length > 6) && StringUtils.isNotEmpty(paths[6]) && !WILDCARD.equals(paths[6])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path6), paths[6]));
 		}
 
-		if ((paths.length > 7) && StringUtils.isNotEmpty(paths[7])) {
+		if ((paths.length > 7) && StringUtils.isNotEmpty(paths[7]) && !WILDCARD.equals(paths[7])) {
 			p = cb.and(p, cb.equal(root.get(Item_.path7), paths[7]));
 		}
 
@@ -993,4 +995,4 @@ public class FilterEntry extends GsonPropertyObject {
 		return p;
 	}
 
-}
+}

+ 42 - 17
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/Plan.java

@@ -1,11 +1,7 @@
 package com.x.query.core.express.plan;
 
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
@@ -13,10 +9,7 @@ import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Tuple;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
+import javax.persistence.criteria.*;
 import javax.script.ScriptEngine;
 import javax.script.ScriptException;
 
@@ -89,7 +82,7 @@ public abstract class Plan extends GsonPropertyObject {
 
 	/**
 	 * !!这个类最后要输出.不能gson scriptEngine对象
-	 * 
+	 *
 	 */
 	private transient ScriptEngine scriptEngine;
 
@@ -456,43 +449,72 @@ public abstract class Plan extends GsonPropertyObject {
 			Root<Item> root = cq.from(Item.class);
 			Predicate p = cb.isMember(root.get(Item_.bundle), cb.literal(bundles));
 			String[] paths = StringUtils.split(selectEntry.path, ".");
+			List<Order> orderList = new ArrayList<>();
 			if ((paths.length > 0) && StringUtils.isNotEmpty(paths[0])) {
 				p = cb.and(p, cb.equal(root.get(Item_.path0), paths[0]));
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path0)), cb.equal(root.get(Item_.path0), "")));
 			}
 			if ((paths.length > 1) && StringUtils.isNotEmpty(paths[1])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path1), paths[1]));
+				if(!FilterEntry.WILDCARD.equals(paths[1])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path1), paths[1]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path1)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path1)), cb.equal(root.get(Item_.path1), "")));
 			}
 			if ((paths.length > 2) && StringUtils.isNotEmpty(paths[2])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path2), paths[2]));
+				if(!FilterEntry.WILDCARD.equals(paths[2])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path2), paths[2]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path2)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path2)), cb.equal(root.get(Item_.path2), "")));
 			}
 			if ((paths.length > 3) && StringUtils.isNotEmpty(paths[3])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path3), paths[3]));
+				if(!FilterEntry.WILDCARD.equals(paths[3])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path3), paths[3]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path3)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path3)), cb.equal(root.get(Item_.path3), "")));
 			}
 			if ((paths.length > 4) && StringUtils.isNotEmpty(paths[4])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path4), paths[4]));
+				if(!FilterEntry.WILDCARD.equals(paths[4])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path4), paths[4]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path4)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path4)), cb.equal(root.get(Item_.path4), "")));
 			}
 			if ((paths.length > 5) && StringUtils.isNotEmpty(paths[5])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path5), paths[5]));
+				if(!FilterEntry.WILDCARD.equals(paths[5])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path5), paths[5]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path5)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path5)), cb.equal(root.get(Item_.path5), "")));
 			}
 			if ((paths.length > 6) && StringUtils.isNotEmpty(paths[6])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path6), paths[6]));
+				if(!FilterEntry.WILDCARD.equals(paths[6])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path6), paths[6]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path6)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path6)), cb.equal(root.get(Item_.path6), "")));
 			}
 			if ((paths.length > 7) && StringUtils.isNotEmpty(paths[7])) {
-				p = cb.and(p, cb.equal(root.get(Item_.path7), paths[7]));
+				if(!FilterEntry.WILDCARD.equals(paths[7])) {
+					p = cb.and(p, cb.equal(root.get(Item_.path7), paths[7]));
+				}else{
+					orderList.add(cb.asc(root.get(Item_.path7)));
+				}
 			} else {
 				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path7)), cb.equal(root.get(Item_.path7), "")));
 			}
@@ -500,6 +522,9 @@ public abstract class Plan extends GsonPropertyObject {
 					root.get(Item_.itemStringValueType), root.get(Item_.stringShortValue),
 					root.get(Item_.stringLongValue), root.get(Item_.dateValue), root.get(Item_.timeValue),
 					root.get(Item_.dateTimeValue), root.get(Item_.booleanValue), root.get(Item_.numberValue)).where(p);
+			if(!orderList.isEmpty()){
+				cq.orderBy(orderList);
+			}
 			List<Tuple> list = em.createQuery(cq).getResultList();
 			Row row = null;
 			for (Tuple o : list) {

+ 14 - 2
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/Row.java

@@ -3,6 +3,7 @@ package com.x.query.core.express.plan;
 import java.util.Objects;
 import java.util.TreeMap;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 
 import com.x.base.core.project.gson.GsonPropertyObject;
@@ -23,7 +24,18 @@ public class Row extends GsonPropertyObject {
 	}
 
 	public void put(String key, Object value) {
-		this.data.put(key, value);
+		Object o = this.data.get(key);
+		if(o!=null){
+			String s = String.valueOf(o);
+			if(StringUtils.isNotEmpty(s)){
+				s = s + "," + value;
+				this.data.put(key, s);
+			}else{
+				this.data.put(key, value);
+			}
+		}else {
+			this.data.put(key, value);
+		}
 	}
 
 	/** 统计计算时用于转换值,不可转换的值默认为0 */
@@ -37,4 +49,4 @@ public class Row extends GsonPropertyObject {
 		}
 	}
 
-}
+}