diff --git a/src/com/wentch/redkale/source/EntityCache.java b/src/com/wentch/redkale/source/EntityCache.java index d011f01ec..c167169ad 100644 --- a/src/com/wentch/redkale/source/EntityCache.java +++ b/src/com/wentch/redkale/source/EntityCache.java @@ -22,7 +22,7 @@ import java.util.stream.*; * * @author zhangjx */ -final class EntityCache { +public final class EntityCache { private static final Logger logger = Logger.getLogger(EntityCache.class.getName()); @@ -102,7 +102,7 @@ final class EntityCache { return (filter != null) && listStream().filter(filter).findFirst().isPresent(); } - public Map getMapResult(final Attribute keyAttr, final Reckon reckon, final Attribute reckonAttr, final Predicate filter) { + public Map getMapResult(final Attribute keyAttr, final Reckon reckon, final Attribute reckonAttr, final Predicate filter) { Stream stream = listStream(); if (filter != null) stream = stream.filter(filter); Collector collector = null; @@ -117,11 +117,13 @@ final class EntityCache { break; case COUNT: collector = (Collector) Collectors.counting(); break; - case DISTINCTCOUNT: collector = (Collector) Collectors.counting(); + case DISTINCTCOUNT: + collector = (Collector) Collectors.mapping((t) -> reckonAttr.get(t), Collectors.toSet()); break; - case MAX: collector = (Collector) Collectors.maxBy(null); - break; - case MIN: collector = (Collector) Collectors.minBy(null); + case MAX: + case MIN: + Comparator comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) reckonAttr.get(o1)).compareTo(reckonAttr.get(o2)); + collector = (Collector) ((reckon == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp)); break; case SUM: if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { @@ -131,7 +133,18 @@ final class EntityCache { } break; } - final Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector)); + Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector)); + if (reckon == MAX || reckon == MIN) { + Map rs2 = new LinkedHashMap(); + rs.forEach((x, y) -> { + if (((Optional) y).isPresent()) rs2.put(x, reckonAttr.get((T) ((Optional) y).get())); + }); + rs = rs2; + } else if (reckon == DISTINCTCOUNT) { + Map rs2 = new LinkedHashMap(); + rs.forEach((x, y) -> rs2.put(x, ((Set) y).size())); + rs = rs2; + } return rs; } @@ -346,7 +359,7 @@ final class EntityCache { return this.list.size() > 1024 * 16; } - protected Stream listStream() { + private Stream listStream() { return isParallel() ? this.list.parallelStream() : this.list.stream(); } }