From a5c11b51199111bf8240d5776e00c669534a7d46 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Fri, 4 May 2018 10:26:44 +0800 Subject: [PATCH] --- src/org/redkale/source/DataSqlSource.java | 272 +++++++++++++++++++--- 1 file changed, 245 insertions(+), 27 deletions(-) diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index c67491109..6fa2c00d4 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -110,6 +110,15 @@ public abstract class DataSqlSource extends AbstractService implement //创建连接池 protected abstract PoolSource createPoolSource(DataSource source, String rwtype, Properties prop); + //查询单条记录 + protected abstract CompletableFuture findDB(final EntityInfo info, final String sql, final boolean onlypk, final SelectColumn selects); + + //查询单条记录的单个字段 + protected abstract CompletableFuture findColumnDB(final EntityInfo info, final String sql, final boolean onlypk, final String column, final Serializable defValue); + + //查询单条记录的单个字段 + protected abstract CompletableFuture existsDB(final EntityInfo info, final String sql, final boolean onlypk); + @Override protected ExecutorService getExecutor() { return executor; @@ -481,15 +490,7 @@ public abstract class DataSqlSource extends AbstractService implement T rs = cache.find(selects, pk); if (cache.isFullLoaded() || rs != null) return rs; } - if (info.isVirtualEntity()) { - return find(null, info, selects, pk).join(); - } else { - if (isAysnc()) { - return readPool.pollAsync().thenCompose(conn -> find(conn, info, selects, pk)).join(); - } else { - return find(readPool.poll(), info, selects, pk).join(); - } - } + return find(info, selects, pk).join(); } @Override @@ -500,27 +501,244 @@ public abstract class DataSqlSource extends AbstractService implement T rs = cache.find(selects, pk); if (cache.isFullLoaded() || rs != null) return CompletableFuture.completedFuture(rs); } - if (info.isVirtualEntity()) { - if (isAysnc()) { - return find(null, info, selects, pk); - } else { - return CompletableFuture.supplyAsync(() -> find(null, info, selects, pk).join(), getExecutor()); - } - } else { - if (isAysnc()) { - return readPool.pollAsync().thenCompose(conn -> find(conn, info, selects, pk)); - } else { - return CompletableFuture.supplyAsync(() -> find(readPool.poll(), info, selects, pk).join(), getExecutor()); - } - } + if (isAysnc()) return find(info, selects, pk); + return CompletableFuture.supplyAsync(() -> find(info, selects, pk).join(), getExecutor()); } - protected CompletableFuture find(final DBChannel conn, final EntityInfo info, final SelectColumn selects, Serializable pk) { - final SelectColumn sels = selects; - final String sql = "SELECT " + info.getQueryColumns(null, sels) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); + protected CompletableFuture find(final EntityInfo info, final SelectColumn selects, Serializable pk) { + final String sql = "SELECT " + info.getQueryColumns(null, selects) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " find sql=" + sql); - //待实现 - return null; + return findDB(info, sql, true, selects); + } + + @Override + public T find(final Class clazz, final String column, final Serializable key) { + return find(clazz, null, FilterNode.create(column, key)); + } + + @Override + public CompletableFuture findAsync(final Class clazz, final String column, final Serializable key) { + return findAsync(clazz, null, FilterNode.create(column, key)); + } + + @Override + public T find(final Class clazz, final FilterBean bean) { + return find(clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture findAsync(final Class clazz, final FilterBean bean) { + return findAsync(clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public T find(final Class clazz, final FilterNode node) { + return find(clazz, null, node); + } + + @Override + public CompletableFuture findAsync(final Class clazz, final FilterNode node) { + return findAsync(clazz, null, node); + } + + @Override + public T find(final Class clazz, final SelectColumn selects, final FilterBean bean) { + return find(clazz, selects, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture findAsync(final Class clazz, final SelectColumn selects, final FilterBean bean) { + return findAsync(clazz, selects, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public T find(final Class clazz, final SelectColumn selects, 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.find(selects, node); + return find(info, selects, node).join(); + } + + @Override + public CompletableFuture findAsync(final Class clazz, final SelectColumn selects, final FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null && cache.isFullLoaded() && (node == null || node.isCacheUseable(this))) { + return CompletableFuture.completedFuture(cache.find(selects, node)); + } + if (isAysnc()) return find(info, selects, node); + return CompletableFuture.supplyAsync(() -> find(info, selects, node).join(), getExecutor()); + } + + protected CompletableFuture find(final EntityInfo info, final SelectColumn selects, final FilterNode node) { + 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.getQueryColumns("a", selects) + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " find sql=" + sql); + return findDB(info, sql, false, selects); + } + + @Override + public Serializable findColumn(final Class clazz, final String column, final Serializable pk) { + return findColumn(clazz, column, null, pk); + } + + @Override + public CompletableFuture findColumnAsync(final Class clazz, final String column, final Serializable pk) { + return findColumnAsync(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 CompletableFuture findColumnAsync(final Class clazz, final String column, final FilterBean bean) { + return findColumnAsync(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 CompletableFuture findColumnAsync(final Class clazz, final String column, final FilterNode node) { + return findColumnAsync(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; + } + return findColumn(info, column, defValue, pk).join(); + } + + @Override + public CompletableFuture findColumnAsync(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 CompletableFuture.completedFuture(val); + } + if (isAysnc()) return findColumn(info, column, defValue, pk); + return CompletableFuture.supplyAsync(() -> findColumn(info, column, defValue, pk).join(), getExecutor()); + } + + protected CompletableFuture findColumn(final EntityInfo info, String column, final Serializable defValue, final Serializable pk) { + final String sql = "SELECT " + info.getSQLColumn(null, column) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); + if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " find sql=" + sql); + return findColumnDB(info, sql, true, column, defValue); + } + + @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) { + Serializable val = cache.findColumn(column, defValue, node); + if (cache.isFullLoaded() || val != null) return val; + } + return findColumn(info, column, defValue, node).join(); + } + + @Override + public CompletableFuture findColumnAsync(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) { + Serializable val = cache.findColumn(column, defValue, node); + if (cache.isFullLoaded() || val != null) return CompletableFuture.completedFuture(val); + } + if (isAysnc()) return findColumn(info, column, defValue, node); + return CompletableFuture.supplyAsync(() -> findColumn(info, column, defValue, node).join(), getExecutor()); + } + + protected CompletableFuture findColumn(final EntityInfo info, String column, final Serializable defValue, final FilterNode node) { + 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 (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " find sql=" + sql); + return findColumnDB(info, sql, false, column, defValue); + } + + @Override + public boolean exists(Class clazz, Serializable pk) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null) { + boolean rs = cache.exists(pk); + if (rs || cache.isFullLoaded()) return rs; + } + return exists(info, pk).join(); + } + + @Override + public CompletableFuture existsAsync(final Class clazz, final Serializable pk) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null) { + boolean rs = cache.exists(pk); + if (rs || cache.isFullLoaded()) return CompletableFuture.completedFuture(rs); + } + if (isAysnc()) return exists(info, pk); + return CompletableFuture.supplyAsync(() -> exists(info, pk).join(), getExecutor()); + } + + protected CompletableFuture exists(final EntityInfo info, Serializable pk) { + final String sql = "SELECT COUNT(*) FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk); + if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " exists sql=" + sql); + return existsDB(info, sql, true); + } + + @Override + public boolean exists(final Class clazz, final FilterBean bean) { + return exists(clazz, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture existsAsync(final Class clazz, final FilterBean bean) { + return existsAsync(clazz, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public boolean exists(final Class clazz, final FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null) { + boolean rs = cache.exists(node); + if (rs || cache.isFullLoaded()) return rs; + } + return exists(info, node).join(); + } + + @Override + public CompletableFuture existsAsync(final Class clazz, final FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache != null) { + boolean rs = cache.exists(node); + if (rs || cache.isFullLoaded()) return CompletableFuture.completedFuture(rs); + } + if (isAysnc()) return exists(info, node); + return CompletableFuture.supplyAsync(() -> exists(info, node).join(), getExecutor()); + } + + protected CompletableFuture exists(final EntityInfo info, FilterNode node) { + 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 COUNT(" + info.getPrimarySQLColumn("a") + ") FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " exists sql=" + sql); + return existsDB(info, sql, false); } protected Sheet querySheet(final boolean readcache, final boolean needtotal, final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) {