DataSource增加getNumberMap方法,用于查询多个字段的统计值

This commit is contained in:
Redkale
2017-02-23 19:06:40 +08:00
parent 801e45abce
commit 178226b730
4 changed files with 172 additions and 0 deletions

View File

@@ -133,6 +133,21 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
return source.getNumberResult(entityClass, func, defVal, column, node);
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns) {
return source.getNumberMap(entityClass, columns);
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) {
return source.getNumberMap(entityClass, bean, columns);
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) {
return source.getNumberMap(entityClass, node, columns);
}
@Override
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, FilterFunc func, final String funcColumn) {
return source.queryColumnMap(entityClass, keyColumn, func, funcColumn);

View File

@@ -1141,6 +1141,71 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
return getNumberResult(entityClass, func, defVal, column, FilterNodeBean.createFilterNode(bean));
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns) {
return getNumberMap(entityClass, (FilterNode) null, columns);
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) {
return getNumberMap(entityClass, FilterNodeBean.createFilterNode(bean), columns);
}
@Override
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) {
if (columns == null || columns.length == 0) return new HashMap<>();
final EntityInfo info = loadEntityInfo(entityClass);
final Connection conn = createReadSQLConnection();
final Map map = new HashMap<>();
try {
final EntityCache cache = info.getCache();
if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) {
if (node == null || node.isCacheUseable(this)) {
for (FilterFuncColumn ffc : columns) {
map.put(ffc.col(), cache.getNumberResult(ffc.func, ffc.defvalue, ffc.column, node));
}
return map;
}
}
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis);
StringBuilder sb = new StringBuilder();
for (FilterFuncColumn ffc : columns) {
if (sb.length() > 0) sb.append(", ");
sb.append(ffc.func.getColumn((ffc.column == null || ffc.column.isEmpty() ? "*" : ("a." + ffc.column))));
}
final String sql = "SELECT " + sb + " FROM " + info.getTable(node) + " a"
+ (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(entityClass.getSimpleName() + " single sql=" + sql);
final PreparedStatement prestmt = conn.prepareStatement(sql);
ResultSet set = prestmt.executeQuery();
if (set.next()) {
int index = 0;
for (FilterFuncColumn ffc : columns) {
Object o = set.getObject(++index);
Number rs = ffc.defvalue;
if (o != null) rs = (Number) o;
map.put(ffc.col(), rs);
}
}
set.close();
prestmt.close();
return map;
} catch (SQLException e) {
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) {
for (FilterFuncColumn ffc : columns) {
map.put(ffc.col(), ffc.defvalue);
}
return map;
}
throw new RuntimeException(e);
} finally {
if (conn != null) closeSQLConnection(conn);
}
}
@Override
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) {
final EntityInfo info = loadEntityInfo(entityClass);

View File

@@ -125,6 +125,12 @@ public interface DataSource {
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node);
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns);
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns);
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns);
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, final FilterFunc func, final String funcColumn);
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, final FilterBean bean);

View File

@@ -0,0 +1,86 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.source;
import org.redkale.convert.json.JsonConvert;
/**
* FilterFuncColumn用于getNumberMap获取列表似数据, getNumberResult获取单字段值 getNumberMap获取多字段值
*
* @author zhangjx
*/
public class FilterFuncColumn implements java.io.Serializable {
public static final String COLUMN_NULL = "*";
FilterFunc func;
String column; //为null将使用*代替
Number defvalue;
public FilterFuncColumn() {
}
public static FilterFuncColumn create(final FilterFunc func) {
return new FilterFuncColumn(func);
}
public static FilterFuncColumn create(final FilterFunc func, final String column) {
return new FilterFuncColumn(func, column);
}
public static FilterFuncColumn create(final FilterFunc func, final String column, final Number defvalue) {
return new FilterFuncColumn(func, column, defvalue);
}
String col() {
return column == null || column.isEmpty() ? COLUMN_NULL : column;
}
public FilterFuncColumn(final FilterFunc func) {
this(func, null, null);
}
public FilterFuncColumn(final FilterFunc func, final String column) {
this(func, column, null);
}
public FilterFuncColumn(final FilterFunc func, final String column, final Number defvalue) {
this.func = func;
this.column = column;
this.defvalue = defvalue;
}
public FilterFunc getFunc() {
return func;
}
public void setFunc(FilterFunc func) {
this.func = func;
}
public String getColumn() {
return column;
}
public void setColumn(String column) {
this.column = column;
}
public Number getDefvalue() {
return defvalue;
}
public void setDefvalue(Number defvalue) {
this.defvalue = defvalue;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}