From e2a49eaab7daf0b06615f815ac624ea1194b1527 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 29 Jul 2019 11:40:33 +0800 Subject: [PATCH] --- src/org/redkale/source/DataSqlSource.java | 7 +-- src/org/redkale/source/EntityCache.java | 57 ++++++++++++----------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 2c7795df9..5339ea8fe 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -1504,13 +1504,14 @@ public abstract class DataSqlSource extends AbstractService implement } protected CompletableFuture> queryColumnMapCompose(final EntityInfo info, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) { - final String sqlkey = info.getSQLColumn(null, keyColumn); + final String keySqlColumn = info.getSQLColumn(null, keyColumn); final Map joinTabalis = node == null ? null : node.getJoinTabalis(); final Set haset = new HashSet<>(); final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); - final String sql = "SELECT a." + sqlkey + ", " + func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : info.getSQLColumn("a", funcColumn))) - + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + sqlkey; + final String funcSqlColumn = func == null ? info.getSQLColumn("a", funcColumn) : func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : info.getSQLColumn("a", funcColumn))); + final String sql = "SELECT a." + keySqlColumn + ", " + funcSqlColumn + + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + keySqlColumn; if (info.isLoggable(logger, Level.FINEST, sql)) logger.finest(info.getType().getSimpleName() + " querycolumnmap sql=" + sql); return queryColumnMapDB(info, sql, keyColumn); } diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index 06a320433..6d6acdc04 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -265,34 +265,37 @@ public final class EntityCache { if (filter != null) stream = stream.filter(filter); Collector collector = null; final Class valtype = funcAttr == null ? null : funcAttr.type(); - switch (func) { - case AVG: - if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { - collector = (Collector) Collectors.averagingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue()); - } else { - collector = (Collector) Collectors.averagingLong((T t) -> ((Number) funcAttr.get(t)).longValue()); - } - break; - case COUNT: - collector = (Collector) Collectors.counting(); - break; - case DISTINCTCOUNT: - collector = (Collector) Collectors.mapping((t) -> funcAttr.get(t), Collectors.toSet()); - break; - case MAX: - case MIN: - Comparator comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) funcAttr.get(o1)).compareTo(funcAttr.get(o2)); - collector = (Collector) ((func == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp)); - break; - case SUM: - if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { - collector = (Collector) Collectors.summingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue()); - } else { - collector = (Collector) Collectors.summingLong((T t) -> ((Number) funcAttr.get(t)).longValue()); - } - break; + if (func != null) { + switch (func) { + case AVG: + if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { + collector = (Collector) Collectors.averagingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue()); + } else { + collector = (Collector) Collectors.averagingLong((T t) -> ((Number) funcAttr.get(t)).longValue()); + } + break; + case COUNT: + collector = (Collector) Collectors.counting(); + break; + case DISTINCTCOUNT: + collector = (Collector) Collectors.mapping((t) -> funcAttr.get(t), Collectors.toSet()); + break; + case MAX: + case MIN: + Comparator comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) funcAttr.get(o1)).compareTo(funcAttr.get(o2)); + collector = (Collector) ((func == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp)); + break; + case SUM: + if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { + collector = (Collector) Collectors.summingDouble((T t) -> ((Number) funcAttr.get(t)).doubleValue()); + } else { + collector = (Collector) Collectors.summingLong((T t) -> ((Number) funcAttr.get(t)).longValue()); + } + break; + } } - Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector)); + Map rs = collector == null ? stream.collect(Collectors.toMap(t -> keyAttr.get(t), t -> funcAttr.get(t), (key1, key2) -> key2)) + : stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector)); if (func == MAX || func == MIN) { Map rs2 = new LinkedHashMap(); rs.forEach((x, y) -> {