diff --git a/src/com/wentch/redkale/source/DataJDBCSource.java b/src/com/wentch/redkale/source/DataJDBCSource.java index 77f266909..70e7a622a 100644 --- a/src/com/wentch/redkale/source/DataJDBCSource.java +++ b/src/com/wentch/redkale/source/DataJDBCSource.java @@ -878,102 +878,22 @@ public final class DataJDBCSource implements DataSource { } //-----------------------getNumberResult----------------------------- - //-----------------------------MAX----------------------------- @Override - public Number getMaxNumberResult(final Class entityClass, final String column) { - return getMaxNumberResult(entityClass, column, (FilterNode) null); + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column) { + return getNumberResult(entityClass, reckon, column, null, null); } @Override - public Number getMaxNumberResult(final Class entityClass, final String column, FilterBean bean) { - return getNumberResult(ReckonType.MAX, entityClass, column, null, bean); + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column, FilterBean bean) { + return getNumberResult(entityClass, reckon, column, null, bean); } @Override - public Number getMaxNumberResult(final Class entityClass, final String column, FilterNode node) { - return getNumberResult(ReckonType.MAX, entityClass, column, node, null); + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column, FilterNode node) { + return getNumberResult(entityClass, reckon, column, node, null); } - //-----------------------------MIN----------------------------- - @Override - public Number getMinNumberResult(final Class entityClass, final String column) { - return getMinNumberResult(entityClass, column, (FilterNode) null); - } - - @Override - public Number getMinNumberResult(final Class entityClass, final String column, FilterBean bean) { - return getNumberResult(ReckonType.MIN, entityClass, column, null, bean); - } - - @Override - public Number getMinNumberResult(final Class entityClass, final String column, FilterNode node) { - return getNumberResult(ReckonType.MIN, entityClass, column, node, null); - } - - //-----------------------------SUM----------------------------- - @Override - public Number getSumNumberResult(final Class entityClass, final String column) { - return getSumNumberResult(entityClass, column, (FilterNode) null); - } - - @Override - public Number getSumNumberResult(final Class entityClass, final String column, FilterBean bean) { - return getNumberResult(ReckonType.SUM, entityClass, column, null, bean); - } - - @Override - public Number getSumNumberResult(final Class entityClass, final String column, FilterNode node) { - return getNumberResult(ReckonType.SUM, entityClass, column, node, null); - } - - //----------------------------COUNT---------------------------- - @Override - public Number getCountNumberResult(final Class entityClass) { - return getCountNumberResult(entityClass, (FilterNode) null); - } - - @Override - public Number getCountNumberResult(final Class entityClass, FilterBean bean) { - return getNumberResult(ReckonType.COUNT, entityClass, null, null, bean); - } - - @Override - public Number getCountNumberResult(final Class entityClass, FilterNode node) { - return getNumberResult(ReckonType.COUNT, entityClass, null, node, null); - } - - @Override - public Number getCountDistinctNumberResult(final Class entityClass, String column) { - return getCountDistinctNumberResult(entityClass, column, (FilterNode) null); - } - - @Override - public Number getCountDistinctNumberResult(final Class entityClass, String column, FilterBean bean) { - return getNumberResult(ReckonType.DISTINCTCOUNT, entityClass, column, null, bean); - } - - @Override - public Number getCountDistinctNumberResult(final Class entityClass, final String column, FilterNode node) { - return getNumberResult(ReckonType.DISTINCTCOUNT, entityClass, column, node, null); - } - - //-----------------------------AVG----------------------------- - @Override - public Number getAvgNumberResult(final Class entityClass, final String column) { - return getAvgNumberResult(entityClass, column, (FilterNode) null); - } - - @Override - public Number getAvgNumberResult(final Class entityClass, final String column, FilterBean bean) { - return getNumberResult(ReckonType.AVG, entityClass, column, null, bean); - } - - @Override - public Number getAvgNumberResult(final Class entityClass, final String column, FilterNode node) { - return getNumberResult(ReckonType.AVG, entityClass, column, node, null); - } - - private Number getNumberResult(final ReckonType type, final Class entityClass, final String column, FilterNode node, FilterBean bean) { + private Number getNumberResult(final Class entityClass, final Reckon reckon, final String column, FilterNode node, FilterBean bean) { final Connection conn = createReadSQLConnection(); try { final EntityInfo info = loadEntityInfo(entityClass); @@ -982,10 +902,10 @@ public final class DataJDBCSource implements DataSource { if (cache != null && cache.isFullLoaded()) { Predicate filter = node == null ? null : node.createFilterPredicate(info, bean); if (node == null || node.isJoinAllCached()) { - return cache.getNumberResult(type, column == null ? null : info.getAttribute(column), filter); + return cache.getNumberResult(reckon, column == null ? null : info.getAttribute(column), filter); } } - final String sql = "SELECT " + type.getReckonColumn("a." + column) + " FROM " + info.getTable() + " a" + final String sql = "SELECT " + reckon.getColumn("a." + (column == null || column.isEmpty() ? "*" : column)) + " FROM " + info.getTable() + " a" + (node == null ? "" : node.createFilterSQLExpress(info, bean)); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(entityClass.getSimpleName() + " single sql=" + sql); final PreparedStatement prestmt = conn.prepareStatement(sql); @@ -1004,6 +924,54 @@ public final class DataJDBCSource implements DataSource { } } + //-----------------------getMapResult----------------------------- + @Override + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn) { + return getMapResult(entityClass, keyColumn, reckon, reckonColumn, null, null); + } + + @Override + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn, FilterBean bean) { + return getMapResult(entityClass, keyColumn, reckon, reckonColumn, null, bean); + } + + @Override + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn, FilterNode node) { + return getMapResult(entityClass, keyColumn, reckon, reckonColumn, node, null); + } + + private Map getMapResult(final Class entityClass, final String keyColumn, final Reckon reckon, final String reckonColumn, FilterNode node, FilterBean bean) { + final Connection conn = createReadSQLConnection(); + try { + final EntityInfo info = loadEntityInfo(entityClass); + if (node == null && bean != null) node = loadFilterBeanNode(bean.getClass()); + final EntityCache cache = info.getCache(); + if (cache != null && cache.isFullLoaded()) { + Predicate filter = node == null ? null : node.createFilterPredicate(info, bean); + if (node == null || node.isJoinAllCached()) { + return cache.getMapResult(info.getAttribute(keyColumn), reckon, reckonColumn == null ? null : info.getAttribute(reckonColumn), filter); + } + } + final String sqlkey = info.getSQLColumn(keyColumn); + final String sql = "SELECT a." + sqlkey + ", " + reckon.getColumn("a." + (reckonColumn == null || reckonColumn.isEmpty() ? "*" : reckonColumn)) + + " FROM " + info.getTable() + " a" + (node == null ? "" : node.createFilterSQLExpress(info, bean)) + " GROUP BY a." + sqlkey; + if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(entityClass.getSimpleName() + " single sql=" + sql); + final PreparedStatement prestmt = conn.prepareStatement(sql); + Map rs = new LinkedHashMap<>(); + ResultSet set = prestmt.executeQuery(); + while (set.next()) { + rs.put((Serializable) set.getObject(1), (Number) set.getObject(2)); + } + set.close(); + prestmt.close(); + return rs; + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) closeSQLConnection(conn); + } + } + //-----------------------find---------------------------- /** * 根据主键获取对象 diff --git a/src/com/wentch/redkale/source/DataJPASource.java b/src/com/wentch/redkale/source/DataJPASource.java index 43bb7c8fe..27b79318c 100644 --- a/src/com/wentch/redkale/source/DataJPASource.java +++ b/src/com/wentch/redkale/source/DataJPASource.java @@ -29,241 +29,128 @@ final class DataJPASource implements DataSource { private final Logger logger = Logger.getLogger(DataJPASource.class.getSimpleName()); - public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public void updateColumnIncrement(DataConnection conn, Class clazz, Serializable id, String column, long incvalue) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - + @Override public void refreshCache(Class clazz) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public T find(Class clazz, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Number getCountDistinctSingleResult(Class entityClass, String column) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Number getCountDistinctSingleResult(Class entityClass, String column, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Sheet queryColumnSheet(String selectedColumn, Class clazz, Flipper flipper, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Set queryColumnSet(String selectedColumn, Class clazz, String column, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Set queryColumnSet(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public List queryColumnList(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public int[] queryColumnIntSet(String selectedColumn, Class clazz, String column, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public long[] queryColumnLongSet(String selectedColumn, Class clazz, String column, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public int[] queryColumnIntList(String selectedColumn, Class clazz, String column, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public long[] queryColumnLongList(String selectedColumn, Class clazz, String column, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public int[] queryColumnIntSet(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public long[] queryColumnLongSet(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public int[] queryColumnIntList(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public long[] queryColumnLongList(String selectedColumn, Class clazz, String column, FilterExpress express, Serializable key) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public T find(Class clazz, SelectColumn selects, Serializable pk) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - + @Override public void delete(Class clazz, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public void delete(DataConnection conn, Class clazz, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getMaxSingleResult(Class entityClass, String column, FilterNode node) { + @Override + public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getMinSingleResult(Class entityClass, String column, FilterNode node) { + @Override + public void updateColumnIncrement(DataConnection conn, Class clazz, Serializable id, String column, long incvalue) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getSumSingleResult(Class entityClass, String column, FilterNode node) { + @Override + public Number getNumberResult(Class entityClass, Reckon reckon, String column) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getCountSingleResult(Class entityClass, FilterNode node) { + @Override + public Number getNumberResult(Class entityClass, Reckon reckon, String column, FilterBean bean) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getCountDistinctSingleResult(Class entityClass, String column, FilterNode node) { + @Override + public Number getNumberResult(Class entityClass, Reckon reckon, String column, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public Number getAvgSingleResult(Class entityClass, String column, FilterNode node) { + @Override + public T find(Class clazz, SelectColumn selects, Serializable pk) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public T find(Class clazz, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public List queryList(Class clazz, FilterNode node) { + @Override + public T find(Class clazz, FilterBean bean) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - public List queryList(Class clazz, SelectColumn selects, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Sheet querySheet(Class clazz, Flipper flipper, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - public Sheet querySheet(Class clazz, SelectColumn selects, Flipper flipper, FilterNode node) { + @Override + public Set queryColumnSet(String selectedColumn, Class clazz, String column, Serializable key) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public Set queryColumnSet(String selectedColumn, Class clazz, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public Set queryColumnSet(String selectedColumn, Class clazz, FilterBean bean) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public List queryColumnList(String selectedColumn, Class clazz, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override public List queryColumnList(String selectedColumn, Class clazz, FilterBean bean) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override + public List queryList(Class clazz, FilterNode node) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public List queryList(Class clazz, SelectColumn selects, FilterNode node) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Sheet queryColumnSheet(String selectedColumn, Class clazz, Flipper flipper, FilterBean bean) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override public Sheet queryColumnSheet(String selectedColumn, Class clazz, Flipper flipper, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public Number getMaxNumberResult(Class entityClass, String column) { + public Sheet querySheet(Class clazz, Flipper flipper, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public Number getMaxNumberResult(Class entityClass, String column, FilterBean bean) { + public Sheet querySheet(Class clazz, SelectColumn selects, Flipper flipper, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public Number getMaxNumberResult(Class entityClass, String column, FilterNode node) { + public Map getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public Number getMinNumberResult(Class entityClass, String column) { + public Map getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn, FilterBean bean) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public Number getMinNumberResult(Class entityClass, String column, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getMinNumberResult(Class entityClass, String column, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getSumNumberResult(Class entityClass, String column) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getSumNumberResult(Class entityClass, String column, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getSumNumberResult(Class entityClass, String column, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountNumberResult(Class entityClass) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountNumberResult(Class entityClass, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountNumberResult(Class entityClass, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountDistinctNumberResult(Class entityClass, String column) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountDistinctNumberResult(Class entityClass, String column, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getCountDistinctNumberResult(Class entityClass, String column, FilterNode node) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getAvgNumberResult(Class entityClass, String column) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getAvgNumberResult(Class entityClass, String column, FilterBean bean) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Number getAvgNumberResult(Class entityClass, String column, FilterNode node) { + public Map getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn, FilterNode node) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } diff --git a/src/com/wentch/redkale/source/DataSource.java b/src/com/wentch/redkale/source/DataSource.java index 2fb71b5b6..5bf50bc60 100644 --- a/src/com/wentch/redkale/source/DataSource.java +++ b/src/com/wentch/redkale/source/DataSource.java @@ -16,6 +16,16 @@ import java.util.*; @SuppressWarnings("unchecked") public interface DataSource { + public static enum Reckon { + + AVG, COUNT, DISTINCTCOUNT, MAX, MIN, SUM; + + public String getColumn(String col) { + if (this == DISTINCTCOUNT) return "COUNT(DISTINCT " + col + ")"; + return this.name() + "(" + col + ")"; + } + } + /** * 创建读连接 * @@ -87,52 +97,22 @@ public interface DataSource { public void updateColumns(final DataConnection conn, final T value, final String... columns); - public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue); + public void updateColumnIncrement(final Class clazz, Serializable id, String column, long incvalue); public void updateColumnIncrement(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); - //-----------------------getNumberResult----------------------------- - //-----------------------------MAX----------------------------- - public Number getMaxNumberResult(final Class entityClass, final String column); + //-----------------------getXXXXResult----------------------------- + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column); - public Number getMaxNumberResult(final Class entityClass, final String column, FilterBean bean); + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column, FilterBean bean); - public Number getMaxNumberResult(final Class entityClass, final String column, FilterNode node); + public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column, FilterNode node); - //-----------------------------MIN----------------------------- - public Number getMinNumberResult(final Class entityClass, final String column); + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn); - public Number getMinNumberResult(final Class entityClass, final String column, FilterBean bean); + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn, FilterBean bean); - public Number getMinNumberResult(final Class entityClass, final String column, FilterNode node); - - //-----------------------------SUM----------------------------- - public Number getSumNumberResult(final Class entityClass, final String column); - - public Number getSumNumberResult(final Class entityClass, final String column, FilterBean bean); - - public Number getSumNumberResult(final Class entityClass, final String column, FilterNode node); - - //----------------------------COUNT---------------------------- - public Number getCountNumberResult(final Class entityClass); - - public Number getCountNumberResult(final Class entityClass, FilterBean bean); - - public Number getCountNumberResult(final Class entityClass, FilterNode node); - - //----------------------------DISTINCT COUNT---------------------------- - public Number getCountDistinctNumberResult(final Class entityClass, String column); - - public Number getCountDistinctNumberResult(final Class entityClass, String column, FilterBean bean); - - public Number getCountDistinctNumberResult(final Class entityClass, String column, FilterNode node); - - //-----------------------------AVG----------------------------- - public Number getAvgNumberResult(final Class entityClass, final String column); - - public Number getAvgNumberResult(final Class entityClass, final String column, FilterBean bean); - - public Number getAvgNumberResult(final Class entityClass, final String column, FilterNode node); + public Map getMapResult(Class entityClass, final String keyColumn, Reckon reckon, final String reckonColumn, FilterNode node); //-----------------------find---------------------------- /** diff --git a/src/com/wentch/redkale/source/EntityCache.java b/src/com/wentch/redkale/source/EntityCache.java index 96cee18c3..d011f01ec 100644 --- a/src/com/wentch/redkale/source/EntityCache.java +++ b/src/com/wentch/redkale/source/EntityCache.java @@ -5,7 +5,6 @@ */ package com.wentch.redkale.source; -import com.wentch.redkale.util.*; import java.io.*; import java.lang.reflect.Field; import java.util.*; @@ -14,6 +13,10 @@ import java.util.function.*; import java.util.logging.*; import java.util.stream.Stream; import javax.persistence.Transient; +import com.wentch.redkale.util.*; +import com.wentch.redkale.source.DataSource.Reckon; +import static com.wentch.redkale.source.DataSource.Reckon.*; +import java.util.stream.*; /** * @@ -99,10 +102,43 @@ final class EntityCache { return (filter != null) && listStream().filter(filter).findFirst().isPresent(); } - public Number getNumberResult(final ReckonType type, final Attribute attr, 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); - switch (type) { + Collector collector = null; + final Class valtype = reckonAttr.type(); + switch (reckon) { + case AVG: + if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { + collector = (Collector) Collectors.averagingDouble((T t) -> ((Number) reckonAttr.get(t)).doubleValue()); + } else { + collector = (Collector) Collectors.averagingLong((T t) -> ((Number) reckonAttr.get(t)).longValue()); + } + break; + case COUNT: collector = (Collector) Collectors.counting(); + break; + case DISTINCTCOUNT: collector = (Collector) Collectors.counting(); + break; + case MAX: collector = (Collector) Collectors.maxBy(null); + break; + case MIN: collector = (Collector) Collectors.minBy(null); + break; + case SUM: + if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) { + collector = (Collector) Collectors.summingDouble((T t) -> ((Number) reckonAttr.get(t)).doubleValue()); + } else { + collector = (Collector) Collectors.summingLong((T t) -> ((Number) reckonAttr.get(t)).longValue()); + } + break; + } + final Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector)); + return rs; + } + + public Number getNumberResult(final Reckon reckon, final Attribute attr, final Predicate filter) { + Stream stream = listStream(); + if (filter != null) stream = stream.filter(filter); + switch (reckon) { case AVG: if (attr.type() == int.class || attr.type() == Integer.class) { return (int) stream.mapToInt(x -> (Integer) attr.get(x)).average().orElse(0); @@ -310,7 +346,7 @@ final class EntityCache { return this.list.size() > 1024 * 16; } - private Stream listStream() { + protected Stream listStream() { return isParallel() ? this.list.parallelStream() : this.list.stream(); } }