diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 6fa2c00d4..56f1a07d2 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -14,6 +14,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.function.*; import java.util.logging.*; +import java.util.stream.Stream; import javax.annotation.Resource; import org.redkale.service.*; import static org.redkale.source.DataSources.*; @@ -61,7 +62,7 @@ public abstract class DataSqlSource extends AbstractService implement if (t != null) logger.log(Level.SEVERE, "CompletableFuture complete error", (Throwable) t); }; - protected final BiFunction fullloader = (s, t) -> querySheet(false, false, t, null, null, (FilterNode) null).list(true); + protected final BiFunction fullloader = (s, t) -> ((Sheet) querySheet(false, false, t, null, null, (FilterNode) null).join()).list(true); @SuppressWarnings({"OverridableMethodCallInConstructor", "LeakingThisInConstructor"}) public DataSqlSource(String unitName, URL persistxml, Properties readprop, Properties writeprop) { @@ -116,9 +117,12 @@ 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); - //查询单条记录的单个字段 + //判断记录是否存在 protected abstract CompletableFuture existsDB(final EntityInfo info, final String sql, final boolean onlypk); + //查询一页数据 + protected abstract CompletableFuture> querySheetDB(final EntityInfo info, final boolean needtotal, final SelectColumn selects, final Flipper flipper, final FilterNode node); + @Override protected ExecutorService getExecutor() { return executor; @@ -741,7 +745,529 @@ public abstract class DataSqlSource extends AbstractService implement 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) { - return null; + //-----------------------list set---------------------------- + @Override + public HashSet queryColumnSet(final String selectedColumn, Class clazz, String column, Serializable key) { + return new LinkedHashSet<>(queryColumnList(selectedColumn, clazz, null, FilterNode.create(column, key))); + } + + @Override + public CompletableFuture> queryColumnSetAsync(final String selectedColumn, Class clazz, String column, Serializable key) { + return queryColumnListAsync(selectedColumn, clazz, null, FilterNode.create(column, key)).thenApply((list) -> new LinkedHashSet(list)); + } + + @Override + public HashSet queryColumnSet(final String selectedColumn, final Class clazz, final FilterBean bean) { + return new LinkedHashSet<>(queryColumnList(selectedColumn, clazz, null, FilterNodeBean.createFilterNode(bean))); + } + + @Override + public CompletableFuture> queryColumnSetAsync(final String selectedColumn, final Class clazz, final FilterBean bean) { + return queryColumnListAsync(selectedColumn, clazz, null, FilterNodeBean.createFilterNode(bean)).thenApply((list) -> new LinkedHashSet(list)); + } + + @Override + public HashSet queryColumnSet(String selectedColumn, Class clazz, FilterNode node) { + return new LinkedHashSet<>(queryColumnList(selectedColumn, clazz, null, node)); + } + + @Override + public CompletableFuture> queryColumnSetAsync(final String selectedColumn, final Class clazz, final FilterNode node) { + return queryColumnListAsync(selectedColumn, clazz, null, node).thenApply((list) -> new LinkedHashSet(list)); + } + + @Override + public List queryColumnList(final String selectedColumn, final Class clazz, final String column, final Serializable key) { + return queryColumnList(selectedColumn, clazz, null, FilterNode.create(column, key)); + } + + @Override + public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final String column, final Serializable key) { + return queryColumnListAsync(selectedColumn, clazz, null, FilterNode.create(column, key)); + } + + @Override + public List queryColumnList(final String selectedColumn, final Class clazz, final FilterBean bean) { + return queryColumnList(selectedColumn, clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final FilterBean bean) { + return queryColumnListAsync(selectedColumn, clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryColumnList(final String selectedColumn, final Class clazz, final FilterNode node) { + return queryColumnList(selectedColumn, clazz, null, node); + } + + @Override + public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final FilterNode node) { + return queryColumnListAsync(selectedColumn, clazz, null, node); + } + + @Override + public List queryColumnList(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterBean bean) { + return queryColumnList(selectedColumn, clazz, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterBean bean) { + return queryColumnListAsync(selectedColumn, clazz, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryColumnList(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterNode node) { + final List list = queryList(clazz, SelectColumn.createIncludes(selectedColumn), flipper, node); + final List rs = new ArrayList<>(); + if (list.isEmpty()) return rs; + final EntityInfo info = loadEntityInfo(clazz); + final Attribute selected = (Attribute) info.getAttribute(selectedColumn); + for (T t : list) { + rs.add(selected.get(t)); + } + return rs; + } + + @Override + public CompletableFuture> queryColumnListAsync(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterNode node) { + return queryListAsync(clazz, SelectColumn.createIncludes(selectedColumn), flipper, node).thenApply((List list) -> { + final List rs = new ArrayList<>(); + if (list.isEmpty()) return rs; + final EntityInfo info = loadEntityInfo(clazz); + final Attribute selected = (Attribute) info.getAttribute(selectedColumn); + for (T t : list) { + rs.add(selected.get(t)); + } + return rs; + }); + } + + /** + * 根据指定参数查询对象某个字段的集合 + *

+ * @param Entity类的泛型 + * @param 字段值的类型 + * @param selectedColumn 字段名 + * @param clazz Entity类 + * @param flipper 翻页对象 + * @param bean 过滤Bean + * + * @return 字段集合 + */ + @Override + public Sheet queryColumnSheet(final String selectedColumn, Class clazz, final Flipper flipper, final FilterBean bean) { + return queryColumnSheet(selectedColumn, clazz, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryColumnSheetAsync(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterBean bean) { + return queryColumnSheetAsync(selectedColumn, clazz, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Sheet queryColumnSheet(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterNode node) { + Sheet sheet = querySheet(clazz, SelectColumn.createIncludes(selectedColumn), flipper, node); + final Sheet rs = new Sheet<>(); + if (sheet.isEmpty()) return rs; + rs.setTotal(sheet.getTotal()); + final EntityInfo info = loadEntityInfo(clazz); + final Attribute selected = (Attribute) info.getAttribute(selectedColumn); + final List list = new ArrayList<>(); + for (T t : sheet.getRows()) { + list.add(selected.get(t)); + } + rs.setRows(list); + return rs; + } + + @Override + public CompletableFuture> queryColumnSheetAsync(final String selectedColumn, final Class clazz, final Flipper flipper, final FilterNode node) { + return querySheetAsync(clazz, SelectColumn.createIncludes(selectedColumn), flipper, node).thenApply((Sheet sheet) -> { + final Sheet rs = new Sheet<>(); + if (sheet.isEmpty()) return rs; + rs.setTotal(sheet.getTotal()); + final EntityInfo info = loadEntityInfo(clazz); + final Attribute selected = (Attribute) info.getAttribute(selectedColumn); + final List list = new ArrayList<>(); + for (T t : sheet.getRows()) { + list.add(selected.get(t)); + } + rs.setRows(list); + return rs; + }); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param keyStream 主键Stream + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final Stream keyStream) { + return queryMap(clazz, null, keyStream); + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final Stream keyStream) { + return queryMapAsync(clazz, null, keyStream); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param bean FilterBean + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final FilterBean bean) { + return queryMap(clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final FilterBean bean) { + return queryMapAsync(clazz, null, FilterNodeBean.createFilterNode(bean)); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param node FilterNode + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final FilterNode node) { + return queryMap(clazz, null, node); + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final FilterNode node) { + return queryMapAsync(clazz, null, node); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param selects 指定字段 + * @param keyStream 主键Stream + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final SelectColumn selects, final Stream keyStream) { + if (keyStream == null) return new LinkedHashMap<>(); + final EntityInfo info = loadEntityInfo(clazz); + final ArrayList ids = new ArrayList<>(); + keyStream.forEach(k -> ids.add(k)); + final Attribute primary = info.primary; + List rs = queryList(clazz, FilterNode.create(primary.field(), ids)); + Map map = new LinkedHashMap<>(); + if (rs.isEmpty()) return new LinkedHashMap<>(); + for (T item : rs) { + map.put((K) primary.get(item), item); + } + return map; + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final SelectColumn selects, final Stream keyStream) { + if (keyStream == null) return CompletableFuture.completedFuture(new LinkedHashMap<>()); + final EntityInfo info = loadEntityInfo(clazz); + final ArrayList ids = new ArrayList<>(); + keyStream.forEach(k -> ids.add(k)); + final Attribute primary = info.primary; + return queryListAsync(clazz, FilterNode.create(primary.field(), ids)).thenApply((List rs) -> { + Map map = new LinkedHashMap<>(); + if (rs.isEmpty()) return new LinkedHashMap<>(); + for (T item : rs) { + map.put((K) primary.get(item), item); + } + return map; + }); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param selects 指定字段 + * @param bean FilterBean + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final SelectColumn selects, final FilterBean bean) { + return queryMap(clazz, selects, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final SelectColumn selects, final FilterBean bean) { + return queryMapAsync(clazz, selects, FilterNodeBean.createFilterNode(bean)); + } + + /** + * 查询符合过滤条件记录的Map集合, 主键值为key
+ * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit}
+ * + * @param 主键泛型 + * @param Entity泛型 + * @param clazz Entity类 + * @param selects 指定字段 + * @param node FilterNode + * + * @return Entity的集合 + */ + @Override + public Map queryMap(final Class clazz, final SelectColumn selects, final FilterNode node) { + List rs = queryList(clazz, selects, node); + final EntityInfo info = loadEntityInfo(clazz); + final Attribute primary = info.primary; + Map map = new LinkedHashMap<>(); + if (rs.isEmpty()) return new LinkedHashMap<>(); + for (T item : rs) { + map.put((K) primary.get(item), item); + } + return map; + } + + @Override + public CompletableFuture> queryMapAsync(final Class clazz, final SelectColumn selects, final FilterNode node) { + return queryListAsync(clazz, selects, node).thenApply((List rs) -> { + final EntityInfo info = loadEntityInfo(clazz); + final Attribute primary = info.primary; + Map map = new LinkedHashMap<>(); + if (rs.isEmpty()) return new LinkedHashMap<>(); + for (T item : rs) { + map.put((K) primary.get(item), item); + } + return map; + }); + } + + /** + * 根据指定字段值查询对象集合 + * + * @param Entity类的泛型 + * @param clazz Entity类 + * @param column 过滤字段名 + * @param key 过滤字段值 + * + * @return Entity对象的集合 + */ + @Override + public List queryList(final Class clazz, final String column, final Serializable key) { + return queryList(clazz, (SelectColumn) null, null, FilterNode.create(column, key)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final String column, final Serializable key) { + return queryListAsync(clazz, (SelectColumn) null, null, FilterNode.create(column, key)); + } + + /** + * 根据过滤对象FilterBean查询对象集合 + * + * @param Entity类的泛型 + * @param clazz Entity类 + * @param bean 过滤Bean + * + * @return Entity对象集合 + */ + @Override + public List queryList(final Class clazz, final FilterBean bean) { + return queryList(clazz, (SelectColumn) null, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final FilterBean bean) { + return queryListAsync(clazz, (SelectColumn) null, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryList(final Class clazz, final FilterNode node) { + return queryList(clazz, (SelectColumn) null, null, node); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final FilterNode node) { + return queryListAsync(clazz, (SelectColumn) null, null, node); + } + + /** + * 根据过滤对象FilterBean查询对象集合, 对象只填充或排除SelectField指定的字段 + * + * @param Entity类的泛型 + * @param clazz Entity类 + * @param selects 收集的字段 + * @param bean 过滤Bean + * + * @return Entity对象的集合 + */ + @Override + public List queryList(final Class clazz, final SelectColumn selects, final FilterBean bean) { + return queryList(clazz, selects, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, SelectColumn selects, final FilterBean bean) { + return queryListAsync(clazz, selects, null, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryList(final Class clazz, final SelectColumn selects, final FilterNode node) { + return queryList(clazz, selects, null, node); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, SelectColumn selects, final FilterNode node) { + return queryListAsync(clazz, selects, null, node); + } + + @Override + public List queryList(final Class clazz, final Flipper flipper, final String column, final Serializable key) { + return queryList(clazz, null, flipper, FilterNode.create(column, key)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final Flipper flipper, final String column, final Serializable key) { + return queryListAsync(clazz, null, flipper, FilterNode.create(column, key)); + } + + @Override + public List queryList(final Class clazz, final Flipper flipper, final FilterBean bean) { + return queryList(clazz, null, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final Flipper flipper, final FilterBean bean) { + return queryListAsync(clazz, null, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryList(final Class clazz, final Flipper flipper, final FilterNode node) { + return queryList(clazz, null, flipper, node); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final Flipper flipper, final FilterNode node) { + return queryListAsync(clazz, null, flipper, node); + } + + @Override + public List queryList(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterBean bean) { + return queryList(clazz, selects, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterBean bean) { + return queryListAsync(clazz, selects, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public List queryList(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) { + return querySheet(true, false, clazz, selects, flipper, node).join().list(true); + } + + @Override + public CompletableFuture> queryListAsync(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) { + return querySheet(true, false, clazz, selects, flipper, node).thenApply((rs) -> rs.list(true)); + } + + //-----------------------sheet---------------------------- + /** + * 根据过滤对象FilterBean和翻页对象Flipper查询一页的数据 + * + * @param Entity类的泛型 + * @param clazz Entity类 + * @param flipper 翻页对象 + * @param bean 过滤Bean + * + * @return Entity对象的集合 + */ + @Override + public Sheet querySheet(final Class clazz, final Flipper flipper, final FilterBean bean) { + return querySheet(clazz, null, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> querySheetAsync(final Class clazz, final Flipper flipper, final FilterBean bean) { + return querySheetAsync(clazz, null, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Sheet querySheet(final Class clazz, final Flipper flipper, final FilterNode node) { + return querySheet(clazz, null, flipper, node); + } + + @Override + public CompletableFuture> querySheetAsync(final Class clazz, final Flipper flipper, final FilterNode node) { + return querySheetAsync(clazz, null, flipper, node); + } + + /** + * 根据过滤对象FilterBean和翻页对象Flipper查询一页的数据, 对象只填充或排除SelectField指定的字段 + * + * @param Entity类的泛型 + * @param clazz Entity类 + * @param selects 收集的字段集合 + * @param flipper 翻页对象 + * @param bean 过滤Bean + * + * @return Entity对象的集合 + */ + @Override + public Sheet querySheet(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterBean bean) { + return querySheet(clazz, selects, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public CompletableFuture> querySheetAsync(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterBean bean) { + return querySheetAsync(clazz, selects, flipper, FilterNodeBean.createFilterNode(bean)); + } + + @Override + public Sheet querySheet(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) { + return querySheet(true, true, clazz, selects, flipper, node).join(); + } + + @Override + public CompletableFuture> querySheetAsync(final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) { + if (isAysnc()) return querySheet(true, true, clazz, selects, flipper, node); + return CompletableFuture.supplyAsync(() -> querySheet(true, true, clazz, selects, flipper, node).join(), getExecutor()); + } + + protected CompletableFuture> querySheet(final boolean readcache, final boolean needtotal, final Class clazz, final SelectColumn selects, final Flipper flipper, final FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (readcache && cache != null && cache.isFullLoaded()) { + if (node == null || node.isCacheUseable(this)) { + if (info.isLoggable(logger, Level.FINEST)) logger.finest(clazz.getSimpleName() + " cache query predicate = " + (node == null ? null : node.createPredicate(cache))); + return CompletableFuture.completedFuture(cache.querySheet(needtotal, selects, flipper, node)); + } + } + return querySheetDB(info, needtotal, selects, flipper, node); } }