diff --git a/src/org/redkale/service/DataSourceService.java b/src/org/redkale/service/DataSourceService.java index 60da96310..13ca2419a 100644 --- a/src/org/redkale/service/DataSourceService.java +++ b/src/org/redkale/service/DataSourceService.java @@ -48,6 +48,11 @@ public class DataSourceService implements DataSource, Service, AutoCloseable { return source.delete(clazz, node); } + @Override + public int delete(final Class clazz, final Flipper flipper, FilterNode node) { + return source.delete(clazz, flipper, node); + } + @Override public int update(T... values) { return source.update(values); diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index 71d05b3ec..80818fd94 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -547,17 +547,31 @@ public final class DataDefaultSource implements DataSource, Function int delete(Class clazz, FilterNode node) { final EntityInfo info = loadEntityInfo(clazz); if (info.isVirtualEntity()) { - return delete(null, info, node); + return delete(null, info, null, node); } Connection conn = createWriteSQLConnection(); try { - return delete(conn, info, node); + return delete(conn, info, null, node); } finally { closeSQLConnection(conn); } } - private int delete(final Connection conn, final EntityInfo info, final FilterNode node) { + @Override + public int delete(Class clazz, final Flipper flipper, FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + return delete(null, info, flipper, node); + } + Connection conn = createWriteSQLConnection(); + try { + return delete(conn, info, flipper, node); + } finally { + closeSQLConnection(conn); + } + } + + private int delete(final Connection conn, final EntityInfo info, final Flipper flipper, final FilterNode node) { int c = -1; try { if (!info.isVirtualEntity()) { @@ -574,7 +588,8 @@ public final class DataDefaultSource implements DataSource, Function 0) set.absolute(flipper.getOffset()); - final int limit = flipper == null ? Integer.MAX_VALUE : flipper.getLimit(); + final int limit = flipper == null || flipper.getLimit() < 1 ? Integer.MAX_VALUE : flipper.getLimit(); int i = 0; while (set.next()) { i++; diff --git a/src/org/redkale/source/DataSource.java b/src/org/redkale/source/DataSource.java index bcf9ef34e..51bfe2811 100644 --- a/src/org/redkale/source/DataSource.java +++ b/src/org/redkale/source/DataSource.java @@ -56,6 +56,8 @@ public interface DataSource { public int delete(final Class clazz, final Serializable... ids); public int delete(final Class clazz, final FilterNode node); + + public int delete(final Class clazz, final Flipper flipper, final FilterNode node); //------------------------update--------------------------- /** diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index 26ac5d116..a85b1e77f 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -350,7 +350,8 @@ public final class EntityCache { Stream stream = this.list.stream(); if (filter != null) stream = stream.filter(filter); if (comparator != null) stream = stream.sorted(comparator); - if (flipper != null) stream = stream.skip(flipper.getOffset()).limit(flipper.getLimit()); + if (flipper != null && flipper.getOffset() > 0) stream = stream.skip(flipper.getOffset()); + if (flipper != null && flipper.getLimit() > 0) stream = stream.limit(flipper.getLimit()); final List rs = new ArrayList<>(); if (selects == null) { Consumer action = x -> rs.add(needcopy ? newReproduce.apply(creator.create(), x) : x); @@ -400,9 +401,14 @@ public final class EntityCache { return 1; } - public Serializable[] delete(final FilterNode node) { + public Serializable[] delete(final Flipper flipper, final FilterNode node) { if (node == null || this.list.isEmpty()) return new Serializable[0]; - Object[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(); + final Comparator comparator = createComparator(flipper); + Stream stream = this.list.stream().filter(node.createPredicate(this)); + if (comparator != null) stream = stream.sorted(comparator); + if (flipper != null && flipper.getOffset() > 0) stream = stream.skip(flipper.getOffset()); + if (flipper != null && flipper.getLimit() > 0) stream = stream.limit(flipper.getLimit()); + Object[] rms = stream.toArray(); Serializable[] ids = new Serializable[rms.length]; int i = -1; for (Object o : rms) { @@ -483,7 +489,7 @@ public final class EntityCache { Stream stream = this.list.stream(); final Comparator comparator = createComparator(flipper); if (comparator != null) stream = stream.sorted(comparator); - if (flipper != null) stream = stream.limit(flipper.getLimit()); + if (flipper != null && flipper.getLimit() > 0) stream = stream.limit(flipper.getLimit()); T[] rms = stream.filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len)); for (T rs : rms) { synchronized (rs) {