From 067eb093912052b678f4e1583785e65c7321e972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Tue, 2 Jun 2015 11:41:36 +0800 Subject: [PATCH] --- .../wentch/redkale/source/DataJDBCSource.java | 2 +- src/com/wentch/redkale/source/DataSource.java | 78 ++----------------- .../wentch/redkale/source/EntityCache.java | 8 +- .../wentch/redkale/source/FilterBeanNode.java | 57 +++++++++++++- src/com/wentch/redkale/source/FilterNode.java | 4 +- 5 files changed, 68 insertions(+), 81 deletions(-) diff --git a/src/com/wentch/redkale/source/DataJDBCSource.java b/src/com/wentch/redkale/source/DataJDBCSource.java index 2f527f78c..ea120c1ca 100644 --- a/src/com/wentch/redkale/source/DataJDBCSource.java +++ b/src/com/wentch/redkale/source/DataJDBCSource.java @@ -417,7 +417,7 @@ public final class DataJDBCSource implements DataSource { for (final Class t : info.distributeTables) { EntityInfo infox = loadEntityInfo(t); stmt = conn.createStatement(); - rs = stmt.executeQuery("SELECT MAX(" + info.getPrimarySQLColumn() + ") FROM " + infox.getTable());// 必须是同一字段名 + rs = stmt.executeQuery("SELECT MAX(" + info.getPrimarySQLColumn() + ") FROM " + infox.getTable()); // 必须是同一字段名 if (rs.next()) { if (primaryType == int.class) { int v = rs.getInt(1) / info.allocationSize; diff --git a/src/com/wentch/redkale/source/DataSource.java b/src/com/wentch/redkale/source/DataSource.java index 538fabc0d..c33919443 100644 --- a/src/com/wentch/redkale/source/DataSource.java +++ b/src/com/wentch/redkale/source/DataSource.java @@ -39,13 +39,6 @@ public interface DataSource { */ public void insert(T... values); - /** - * 新增对象, 必须是Entity对象 - * - * @param - * @param conn - * @param values - */ public void insert(final DataConnection conn, T... values); /** @@ -65,51 +58,14 @@ public interface DataSource { */ public void delete(T... values); - /** - * 删除对象, 必须是Entity对象 - * - * @param - * @param conn - * @param values - */ public void delete(final DataConnection conn, T... values); - /** - * 根据主键值删除对象, 必须是Entity Class - * - * @param - * @param clazz - * @param ids 主键值 - */ public void delete(Class clazz, Serializable... ids); - /** - * 根据主键值删除对象, 必须是Entity Class - * - * @param - * @param conn - * @param clazz - * @param ids - */ public void delete(final DataConnection conn, Class clazz, Serializable... ids); - /** - * 根据FilterNode的值删除对象, 必须是Entity Class - * - * @param - * @param clazz - * @param node - */ public void delete(Class clazz, FilterNode node); - /** - * 根据FilterNode的值删除对象, 必须是Entity Class - * - * @param - * @param conn - * @param clazz - * @param node - */ public void delete(final DataConnection conn, Class clazz, FilterNode node); //------------------------update--------------------------- @@ -123,43 +79,18 @@ public interface DataSource { public void update(final DataConnection conn, T... values); - /** - * 根据主键值更新对象的column对应的值, 必须是Entity Class - * - * @param - * @param clazz - * @param id - * @param column - * @param value - */ public void updateColumn(Class clazz, Serializable id, String column, Serializable value); public void updateColumn(DataConnection conn, Class clazz, Serializable id, String column, Serializable value); - /** - * 根据主键值给对象的column对应的值+incvalue, 必须是Entity Class - * - * @param - * @param clazz - * @param id - * @param column - * @param incvalue - */ - public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue); - - public void updateColumnIncrement(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); - - /** - * 更新对象指定的一些字段, 必须是Entity对象 - * - * @param - * @param value - * @param columns - */ public void updateColumns(final T value, final String... columns); public void updateColumns(final DataConnection conn, final T value, final String... columns); + public void updateColumnIncrement(Class clazz, Serializable id, String column, long incvalue); + + public void updateColumnIncrement(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); + //-----------------------getSingleResult----------------------------- //-----------------------------MAX----------------------------- public Number getMaxSingleResult(final Class entityClass, final String column); @@ -189,6 +120,7 @@ public interface DataSource { public Number getCountSingleResult(final Class entityClass, FilterNode node); + //----------------------------DISTINCT COUNT---------------------------- public Number getCountDistinctSingleResult(final Class entityClass, String column); public Number getCountDistinctSingleResult(final Class entityClass, String column, FilterBean bean); diff --git a/src/com/wentch/redkale/source/EntityCache.java b/src/com/wentch/redkale/source/EntityCache.java index 3c76da9e3..b26dd0efb 100644 --- a/src/com/wentch/redkale/source/EntityCache.java +++ b/src/com/wentch/redkale/source/EntityCache.java @@ -43,7 +43,7 @@ final class EntityCache { private boolean fullloaded; public EntityCache(final Class type, Creator creator, Attribute primary, - Map> attributes) { + Map> attributes) { this.type = type; this.creator = creator; this.primary = primary; @@ -58,7 +58,7 @@ final class EntityCache { } catch (Exception e) { return false; } - }); + }); } public void fullLoad(List all) { @@ -95,6 +95,10 @@ final class EntityCache { return rs.isPresent() ? (needcopy ? reproduce.copy(this.creator.create(), rs.get()) : rs.get()) : null; } + public boolean contains(final Predicate filter) { + return (filter != null) && listStream().filter(filter).findFirst().isPresent(); + } + public Number getSingleResult(final ReckonType type, final Attribute attr, final Predicate filter) { Stream stream = listStream(); if (filter != null) stream = stream.filter(filter); diff --git a/src/com/wentch/redkale/source/FilterBeanNode.java b/src/com/wentch/redkale/source/FilterBeanNode.java index f9e0941d5..1ba7c3db2 100644 --- a/src/com/wentch/redkale/source/FilterBeanNode.java +++ b/src/com/wentch/redkale/source/FilterBeanNode.java @@ -11,7 +11,7 @@ import java.io.Serializable; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; +import java.util.function.*; import java.util.logging.Logger; import javax.persistence.Transient; @@ -89,9 +89,9 @@ final class FilterBeanNode extends FilterNode { } newnode.foreignEntity = secinfo; newnode.tabalis = alias; + newnode.columnAttribute = secinfo.getAttribute(newnode.column); newnode.foreignAttribute = joinCol.column().isEmpty() ? secinfo.getPrimary() : secinfo.getAttribute(joinCol.column()); if (newnode.foreignEntity != null && newnode.foreignAttribute == null) throw new RuntimeException(clazz.getName() + "." + field.getName() + " have illegal FilterJoinColumn " + joinCol); - joinallcached = false; //关联查询暂不支持缓存查询 } } //------------------------------------ @@ -143,6 +143,8 @@ final class FilterBeanNode extends FilterNode { private Attribute foreignAttribute; + private Attribute columnAttribute; + private boolean array; private boolean collection; @@ -197,6 +199,7 @@ final class FilterBeanNode extends FilterNode { newnode.nodes = this.nodes; newnode.foreignEntity = this.foreignEntity; newnode.foreignAttribute = this.foreignAttribute; + newnode.columnAttribute = this.columnAttribute; newnode.array = this.array; newnode.collection = this.collection; newnode.ignoreCase = this.ignoreCase; @@ -214,6 +217,7 @@ final class FilterBeanNode extends FilterNode { this.beanAttribute = beanNode.beanAttribute; this.foreignEntity = beanNode.foreignEntity; this.foreignAttribute = beanNode.foreignAttribute; + this.columnAttribute = beanNode.columnAttribute; this.array = beanNode.array; this.collection = beanNode.collection; this.ignoreCase = beanNode.ignoreCase; @@ -232,9 +236,56 @@ final class FilterBeanNode extends FilterNode { return new StringBuilder(sb.length() + jsql.length()).append(jsql).append(sb); } + @Override + protected Predicate createFilterPredicate(final EntityInfo info, FilterBean bean) { + if (this.foreignEntity == null) return super.createFilterPredicate(info, bean); + final Map foreign = new HashMap<>(); + Predicate result = null; + putForeignPredicate(foreign, bean); + if (this.nodes != null) { + for (FilterNode n : this.nodes) { + FilterBeanNode node = (FilterBeanNode) n; + if (node.foreignEntity == null) { + Predicate f = node.createFilterPredicate(info, bean); + if (f == null) continue; + result = (result == null) ? f : (signand ? result.and(f) : result.or(f)); + } else { + putForeignPredicate(foreign, bean); + } + } + } + final Attribute foreignAttr = this.foreignAttribute; + for (Map.Entry en : foreign.entrySet()) { + Attribute mainIdAttr = info.getPrimary(); + final EntityCache cache = en.getKey().getCache(); + final Predicate p = en.getValue(); + Predicate f = (T t) -> { + Serializable key = mainIdAttr.get(t); + Predicate k = (e) -> key.equals(foreignAttr.get(e)); + return cache.contains(k.and(p)); + }; + result = (result == null) ? f : (signand ? result.and(f) : result.or(f)); + } + return result; + } + + private void putForeignPredicate(final Map foreign, FilterBean bean) { + final Serializable val = getValue(bean); + Predicate filter = (val == null && express != ISNULL && express != ISNOTNULL) ? ((t) -> signand) : super.createFilterPredicate(this.columnAttribute, val); + if (filter == null) return; + Predicate p = foreign.get(this.foreignEntity); + if (p == null) { + foreign.put(foreignEntity, filter); + } else if (signand) { + p.and(filter); + } else { + p.or(filter); + } + } + @Override protected boolean isJoinAllCached() { - return joinallcached; //暂时没实现 + return joinallcached; } @Override diff --git a/src/com/wentch/redkale/source/FilterNode.java b/src/com/wentch/redkale/source/FilterNode.java index a5c89fdcd..b7018e3e4 100644 --- a/src/com/wentch/redkale/source/FilterNode.java +++ b/src/com/wentch/redkale/source/FilterNode.java @@ -201,7 +201,7 @@ public class FilterNode { return sb; } - protected final Predicate createFilterPredicate(final EntityInfo info, FilterBean bean) { + protected Predicate createFilterPredicate(final EntityInfo info, FilterBean bean) { if (info == null) return null; final Serializable val = getValue(bean); if (val == null && express != ISNULL && express != ISNOTNULL) return null; @@ -215,7 +215,7 @@ public class FilterNode { return filter; } - private Predicate createFilterPredicate(final Attribute attr, final Serializable val) { + protected final Predicate createFilterPredicate(final Attribute attr, final Serializable val) { if (attr == null) return null; switch (express) { case EQUAL: return (T t) -> val.equals(attr.get(t));