From 178226b730949ba1f6f368c0578781c870ccf020 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 23 Feb 2017 19:06:40 +0800 Subject: [PATCH] =?UTF-8?q?DataSource=E5=A2=9E=E5=8A=A0getNumberMap?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=AD=97=E6=AE=B5=E7=9A=84=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/service/DataSourceService.java | 15 ++++ src/org/redkale/source/DataDefaultSource.java | 65 ++++++++++++++ src/org/redkale/source/DataSource.java | 6 ++ src/org/redkale/source/FilterFuncColumn.java | 86 +++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 src/org/redkale/source/FilterFuncColumn.java diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index 6a16ffed3..fbd92f654 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -133,6 +133,21 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { return source.getNumberResult(entityClass, func, defVal, column, node); } + @Override + public Map getNumberMap(final Class entityClass, final FilterFuncColumn... columns) { + return source.getNumberMap(entityClass, columns); + } + + @Override + public Map getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) { + return source.getNumberMap(entityClass, bean, columns); + } + + @Override + public Map getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) { + return source.getNumberMap(entityClass, node, columns); + } + @Override public Map queryColumnMap(final Class entityClass, final String keyColumn, FilterFunc func, final String funcColumn) { return source.queryColumnMap(entityClass, keyColumn, func, funcColumn); diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index ff0f802fa..404959de1 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -1141,6 +1141,71 @@ public final class DataDefaultSource implements DataSource, Function Map getNumberMap(final Class entityClass, final FilterFuncColumn... columns) { + return getNumberMap(entityClass, (FilterNode) null, columns); + } + + @Override + public Map getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) { + return getNumberMap(entityClass, FilterNodeBean.createFilterNode(bean), columns); + } + + @Override + public Map 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 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); diff --git a/src/org/redkale/source/DataSource.java b/src/org/redkale/source/DataSource.java index c25436bee..2cd0711ab 100644 --- a/src/org/redkale/source/DataSource.java +++ b/src/org/redkale/source/DataSource.java @@ -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 Map getNumberMap(final Class entityClass, final FilterFuncColumn... columns); + + public Map getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns); + + public Map getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns); + public Map queryColumnMap(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn); public Map queryColumnMap(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, final FilterBean bean); diff --git a/src/org/redkale/source/FilterFuncColumn.java b/src/org/redkale/source/FilterFuncColumn.java new file mode 100644 index 000000000..27e76d4d5 --- /dev/null +++ b/src/org/redkale/source/FilterFuncColumn.java @@ -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); + } +}