From 3c457dad2a3b8effd105d068d9d9f61082fcbba7 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Tue, 10 Jan 2017 16:42:41 +0800 Subject: [PATCH] --- .../redkale/service/DataSourceService.java | 30 +++++++ src/org/redkale/source/DataDefaultSource.java | 80 +++++++++++++++++++ src/org/redkale/source/DataSource.java | 12 +++ src/org/redkale/source/EntityCache.java | 29 +++++++ 4 files changed, 151 insertions(+) diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index 322f344f5..60da96310 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -168,6 +168,36 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { return source.find(clazz, selects, node); } + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable pk) { + return source.findColumn(clazz, column, pk); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final FilterBean bean) { + return source.findColumn(clazz, column, bean); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final FilterNode node) { + return source.findColumn(clazz, column, node); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final Serializable pk) { + return source.findColumn(clazz, column, defValue, pk); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterBean bean) { + return source.findColumn(clazz, column, defValue, bean); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterNode node) { + return source.findColumn(clazz, column, defValue, node); + } + @Override public boolean exists(final Class clazz, final Serializable pk) { return source.exists(clazz, pk); diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index d2facab23..13261c5ba 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -1319,6 +1319,86 @@ public final class DataDefaultSource implements DataSource, Function Serializable findColumn(final Class clazz, final String column, final Serializable pk) { + return findColumn(clazz, column, null, pk); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final FilterBean bean) { + return findColumn(clazz, column, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final FilterNode node) { + return findColumn(clazz, column, null, node); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final Serializable pk) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null) { + Serializable val = cache.findColumn(column, defValue, pk); + if (cache.isFullLoaded() || val != null) return val; + } + + final Connection conn = createReadSQLConnection(); + try { + final String sql = "SELECT " + info.getSQLColumn(null, column) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); + if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql); + final PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + final ResultSet set = ps.executeQuery(); + Serializable val = defValue; + if (set.next()) val = (Serializable) set.getObject(1); + set.close(); + ps.close(); + return val == null ? defValue : val; + } catch (SQLException sex) { + if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + sex.getSQLState() + ';')) return defValue; + throw new RuntimeException(sex); + } catch (Exception ex) { + throw new RuntimeException(ex); + } finally { + closeSQLConnection(conn); + } + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterBean bean) { + return findColumn(clazz, column, defValue, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null && cache.isFullLoaded() && (node == null || node.isCacheUseable(this))) return cache.findColumn(column, defValue, node); + + final Connection conn = createReadSQLConnection(); + try { + 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); + final String sql = "SELECT " + info.getSQLColumn("a", column) + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql); + final PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + final ResultSet set = ps.executeQuery(); + Serializable val = defValue; + if (set.next()) val = (Serializable) set.getObject(1); + set.close(); + ps.close(); + return val == null ? defValue : val; + } catch (SQLException se) { + if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + se.getSQLState() + ';')) return defValue; + throw new RuntimeException(se); + } catch (Exception ex) { + throw new RuntimeException(ex); + } finally { + closeSQLConnection(conn); + } + } + @Override public boolean exists(Class clazz, Serializable pk) { final EntityInfo info = loadEntityInfo(clazz); diff --git a/src/org/redkale/source/DataSource.java b/src/org/redkale/source/DataSource.java index 009c368ef..bcf9ef34e 100644 --- a/src/org/redkale/source/DataSource.java +++ b/src/org/redkale/source/DataSource.java @@ -126,6 +126,18 @@ public interface DataSource { public T find(final Class clazz, final SelectColumn selects, final FilterNode node); + public Serializable findColumn(final Class clazz, final String column, final Serializable pk); + + public Serializable findColumn(final Class clazz, final String column, final FilterBean bean); + + public Serializable findColumn(final Class clazz, final String column, final FilterNode node); + + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final Serializable pk); + + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterBean bean); + + public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final FilterNode node); + public boolean exists(final Class clazz, final Serializable pk); public boolean exists(final Class clazz, final FilterBean bean); diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index 57cd1ec76..26ac5d116 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -138,6 +138,35 @@ public final class EntityCache { return t; } + public Serializable findColumn(final String column, final Serializable defValue, final Serializable id) { + if (id == null) return defValue; + T rs = map.get(id); + if (rs == null) return defValue; + for (Attribute attr : this.info.attributes) { + if (column.equals(attr.field())) { + Serializable val = (Serializable) attr.get(rs); + return val == null ? defValue : val; + } + } + return defValue; + } + + public Serializable findColumn(final String column, final Serializable defValue, FilterNode node) { + final Predicate filter = node == null ? null : node.createPredicate(this); + Stream stream = this.list.stream(); + if (filter != null) stream = stream.filter(filter); + Optional opt = stream.findFirst(); + if (!opt.isPresent()) return defValue; + T rs = opt.get(); + for (Attribute attr : this.info.attributes) { + if (column.equals(attr.field())) { + Serializable val = (Serializable) attr.get(rs); + return val == null ? defValue : val; + } + } + return defValue; + } + public boolean exists(Serializable id) { if (id == null) return false; final Class atype = this.primary.type();