diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 56f1a07d2..a2237ddc9 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -117,6 +117,15 @@ public abstract class DataSqlSource extends AbstractService implement //查询单条记录的单个字段 protected abstract CompletableFuture findColumnDB(final EntityInfo info, final String sql, final boolean onlypk, final String column, final Serializable defValue); + //查询Number数据 + protected abstract CompletableFuture getNumberResultDB(final EntityInfo info, final String sql, final Number defVal, final String column); + + //查询Number Map数据 + protected abstract CompletableFuture> getNumberMapDB(final EntityInfo info, final String sql, final FilterFuncColumn... columns); + + //查询Map数据 + protected abstract CompletableFuture> queryColumnMapDB(final EntityInfo info, final String sql, final String keyColumn); + //判断记录是否存在 protected abstract CompletableFuture existsDB(final EntityInfo info, final String sql, final boolean onlypk); @@ -128,6 +137,10 @@ public abstract class DataSqlSource extends AbstractService implement return executor; } + @Override + public void init(AnyValue config) { + } + @Override public void destroy(AnyValue config) { if (this.executor != null) this.executor.shutdownNow(); @@ -464,7 +477,228 @@ public abstract class DataSqlSource extends AbstractService implement } return c; } - //----------------------------- update ----------------------------- + + //---------------------------- update ---------------------------- + //------------------------- getNumberMap ------------------------- + @Override + public Map getNumberMap(final Class entityClass, final FilterFuncColumn... columns) { + return getNumberMap(entityClass, (FilterNode) null, columns); + } + + @Override + public CompletableFuture> getNumberMapAsync(final Class entityClass, final FilterFuncColumn... columns) { + return getNumberMapAsync(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 CompletableFuture> getNumberMapAsync(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) { + return getNumberMapAsync(entityClass, FilterNodeBean.createFilterNode(bean), columns); + } + + @Override + public Map getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + final Map map = new HashMap<>(); + if (node == null || node.isCacheUseable(this)) { + for (FilterFuncColumn ffc : columns) { + for (String col : ffc.cols()) { + map.put(ffc.col(col), cache.getNumberResult(ffc.func, ffc.defvalue, col, node)); + } + } + return map; + } + } + return (Map) getNumberMap(info, node, columns).join(); + } + + @Override + public CompletableFuture> getNumberMapAsync(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + final Map map = new HashMap<>(); + if (node == null || node.isCacheUseable(this)) { + for (FilterFuncColumn ffc : columns) { + for (String col : ffc.cols()) { + map.put(ffc.col(col), cache.getNumberResult(ffc.func, ffc.defvalue, col, node)); + } + } + return CompletableFuture.completedFuture(map); + } + } + if (isAysnc()) return getNumberMap(info, node, columns); + return CompletableFuture.supplyAsync(() -> (Map) getNumberMap(info, node, columns).join(), getExecutor()); + } + + protected CompletableFuture> getNumberMap(final EntityInfo info, final FilterNode node, final FilterFuncColumn... columns) { + final Map joinTabalis = node == null ? null : node.getJoinTabalis(); + final Set haset = new HashSet<>(); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info); + final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); + StringBuilder sb = new StringBuilder(); + for (FilterFuncColumn ffc : columns) { + for (String col : ffc.cols()) { + if (sb.length() > 0) sb.append(", "); + sb.append(ffc.func.getColumn((col == null || col.isEmpty() ? "*" : info.getSQLColumn("a", col)))); + } + } + final String sql = "SELECT " + sb + " 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() + " getnumbermap sql=" + sql); + return getNumberMapDB(info, sql, columns); + } + + //------------------------ getNumberResult ----------------------- + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final String column) { + return getNumberResult(entityClass, func, null, column, (FilterNode) null); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final String column) { + return getNumberResultAsync(entityClass, func, null, column, (FilterNode) null); + } + + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final String column, FilterBean bean) { + return getNumberResult(entityClass, func, null, column, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final String column, final FilterBean bean) { + return getNumberResultAsync(entityClass, func, null, column, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final String column, final FilterNode node) { + return getNumberResult(entityClass, func, null, column, node); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final String column, final FilterNode node) { + return getNumberResultAsync(entityClass, func, null, column, node); + } + + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column) { + return getNumberResult(entityClass, func, defVal, column, (FilterNode) null); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final Number defVal, final String column) { + return getNumberResultAsync(entityClass, func, defVal, column, (FilterNode) null); + } + + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, FilterBean bean) { + return getNumberResult(entityClass, func, defVal, column, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final Number defVal, final String column, FilterBean bean) { + return getNumberResultAsync(entityClass, func, defVal, column, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + if (node == null || node.isCacheUseable(this)) { + return cache.getNumberResult(func, defVal, column, node); + } + } + return getNumberResult(info, entityClass, func, defVal, column, node).join(); + } + + @Override + public CompletableFuture getNumberResultAsync(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + if (node == null || node.isCacheUseable(this)) { + return CompletableFuture.completedFuture(cache.getNumberResult(func, defVal, column, node)); + } + } + if (isAysnc()) return getNumberResult(info, entityClass, func, defVal, column, node); + return CompletableFuture.supplyAsync(() -> getNumberResult(info, entityClass, func, defVal, column, node).join(), getExecutor()); + } + + protected CompletableFuture getNumberResult(final EntityInfo info, final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) { + final Map joinTabalis = node == null ? null : node.getJoinTabalis(); + final Set haset = new HashSet<>(); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info); + final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); + final String sql = "SELECT " + func.getColumn((column == null || column.isEmpty() ? "*" : 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(entityClass.getSimpleName() + " getnumberresult sql=" + sql); + return getNumberResultDB(info, sql, defVal, column); + } + + //------------------------ queryColumnMap ------------------------ + @Override + public Map queryColumnMap(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn) { + return queryColumnMap(entityClass, keyColumn, func, funcColumn, (FilterNode) null); + } + + @Override + public CompletableFuture> queryColumnMapAsync(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn) { + return queryColumnMapAsync(entityClass, keyColumn, func, funcColumn, (FilterNode) null); + } + + @Override + public Map queryColumnMap(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, final FilterBean bean) { + return queryColumnMap(entityClass, keyColumn, func, funcColumn, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryColumnMapAsync(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, final FilterBean bean) { + return queryColumnMapAsync(entityClass, keyColumn, func, funcColumn, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Map queryColumnMap(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + if (node == null || node.isCacheUseable(this)) { + return cache.queryColumnMap(keyColumn, func, funcColumn, node); + } + } + return (Map) queryColumnMap(info, keyColumn, func, funcColumn, node).join(); + } + + @Override + public CompletableFuture> queryColumnMapAsync(final Class entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) { + final EntityInfo info = loadEntityInfo(entityClass); + final EntityCache cache = info.getCache(); + if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) { + if (node == null || node.isCacheUseable(this)) { + return CompletableFuture.completedFuture(cache.queryColumnMap(keyColumn, func, funcColumn, node)); + } + } + if (isAysnc()) return queryColumnMap(info, keyColumn, func, funcColumn, node); + return CompletableFuture.supplyAsync(() -> (Map) queryColumnMap(info, keyColumn, func, funcColumn, node).join(), getExecutor()); + } + + protected CompletableFuture> queryColumnMap(final EntityInfo info, final String keyColumn, final FilterFunc func, final String funcColumn, FilterNode node) { + final String sqlkey = info.getSQLColumn(null, keyColumn); + final Map joinTabalis = node == null ? null : node.getJoinTabalis(); + final Set haset = new HashSet<>(); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info); + final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); + final String sql = "SELECT a." + sqlkey + ", " + func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : info.getSQLColumn("a", funcColumn))) + + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + sqlkey; + if (info.isLoggable(logger, Level.FINEST)) logger.finest(info.getType().getSimpleName() + " querycolumnmap sql=" + sql); + return queryColumnMapDB(info, sql, keyColumn); + } //----------------------------- find ----------------------------- /** @@ -613,6 +847,16 @@ public abstract class DataSqlSource extends AbstractService implement return findColumnAsync(clazz, column, null, node); } + @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 CompletableFuture findColumnAsync(final Class clazz, final String column, final Serializable defValue, final FilterBean bean) { + return findColumnAsync(clazz, column, defValue, FilterNodeBean.createFilterNode(bean)); + } + @Override public Serializable findColumn(final Class clazz, final String column, final Serializable defValue, final Serializable pk) { final EntityInfo info = loadEntityInfo(clazz); @@ -674,6 +918,7 @@ public abstract class DataSqlSource extends AbstractService implement return findColumnDB(info, sql, false, column, defValue); } + //---------------------------- exists ---------------------------- @Override public boolean exists(Class clazz, Serializable pk) { final EntityInfo info = loadEntityInfo(clazz); @@ -1087,6 +1332,16 @@ public abstract class DataSqlSource extends AbstractService implement return queryListAsync(clazz, (SelectColumn) null, null, FilterNode.create(column, key)); } + @Override + public List queryList(final Class clazz) { + return queryList(clazz, (SelectColumn) null, null, (FilterNode) null); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz) { + return queryListAsync(clazz, (SelectColumn) null, null, (FilterNode) null); + } + /** * 根据过滤对象FilterBean查询对象集合 *