From fb3dd6049da106ede3c909e818cc2889f10d621b Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 2 May 2018 20:28:03 +0800 Subject: [PATCH] --- src/org/redkale/source/DataSqlSource.java | 153 +++++++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 58d10b619..957c06b84 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -8,6 +8,7 @@ package org.redkale.source; import java.io.Serializable; import java.net.URL; import java.nio.ByteBuffer; +import java.sql.SQLException; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; @@ -276,7 +277,88 @@ public abstract class DataSqlSource extends AbstractService implement @Override public int delete(T... values) { if (values.length == 0) return -1; - return -1; + if (values.length > 1) { //检查对象是否都是同一个Entity类 + Class clazz = null; + for (T val : values) { + if (clazz == null) { + clazz = val.getClass(); + continue; + } + if (clazz != val.getClass()) { + throw new RuntimeException("DataSource.delete must the same Class Entity, but diff is " + clazz + " and " + val.getClass()); + } + } + } + final Class clazz = (Class) values[0].getClass(); + final EntityInfo info = loadEntityInfo(clazz); + final Attribute primary = info.getPrimary(); + Serializable[] ids = new Serializable[values.length]; + int i = 0; + for (final T value : values) { + ids[i++] = (Serializable) primary.get(value); + } + return delete(clazz, ids); + } + + @Override + public CompletableFuture deleteAsync(final T... values) { + if (values.length == 0) return CompletableFuture.completedFuture(-1); + if (values.length > 1) { //检查对象是否都是同一个Entity类 + Class clazz = null; + CompletableFuture future = new CompletableFuture<>(); + for (T val : values) { + if (clazz == null) { + clazz = val.getClass(); + continue; + } + if (clazz != val.getClass()) { + future.completeExceptionally(new SQLException("DataSource.delete must the same Class Entity, but diff is " + clazz + " and " + val.getClass())); + return future; + } + } + } + final Class clazz = (Class) values[0].getClass(); + final EntityInfo info = loadEntityInfo(clazz); + final Attribute primary = info.getPrimary(); + Serializable[] ids = new Serializable[values.length]; + int i = 0; + for (final T value : values) { + ids[i++] = (Serializable) primary.get(value); + } + return deleteAsync(clazz, ids); + } + + @Override + public int delete(Class clazz, Serializable... ids) { + if (ids.length == 0) return -1; + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + return delete(null, info, ids).join(); + } else { + if (isAysnc()) { + return writePool.pollAsync().thenCompose(conn -> delete(conn, info, ids)).join(); + } else { + return delete(writePool.poll(), info, ids).join(); + } + } + } + + @Override + public CompletableFuture deleteAsync(final Class clazz, final Serializable... ids) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + if (isAysnc()) { + return delete(null, info, ids); + } else { + return CompletableFuture.supplyAsync(() -> delete(null, info, ids).join(), getExecutor()); + } + } else { + if (isAysnc()) { + return writePool.pollAsync().thenCompose(conn -> delete(conn, info, ids)); + } else { + return CompletableFuture.supplyAsync(() -> delete(writePool.poll(), info, ids).join(), getExecutor()); + } + } } protected CompletableFuture delete(final DBChannel conn, final EntityInfo info, Serializable... keys) { @@ -300,6 +382,75 @@ public abstract class DataSqlSource extends AbstractService implement return CompletableFuture.completedFuture(-1); } + @Override + public int delete(Class clazz, FilterNode node) { + return delete(clazz, (Flipper) null, node); + } + + @Override + public CompletableFuture deleteAsync(final Class clazz, final FilterNode node) { + return deleteAsync(clazz, (Flipper) null, 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).join(); + } else { + if (isAysnc()) { + return writePool.pollAsync().thenCompose(conn -> delete(conn, info, flipper, node)).join(); + } else { + return delete(writePool.poll(), info, flipper, node).join(); + } + } + } + + @Override + public CompletableFuture deleteAsync(final Class clazz, final Flipper flipper, FilterNode node) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + if (isAysnc()) { + return delete(null, info, flipper, node); + } else { + return CompletableFuture.supplyAsync(() -> delete(null, info, flipper, node).join(), getExecutor()); + } + } else { + if (isAysnc()) { + return writePool.pollAsync().thenCompose(conn -> delete(conn, info, flipper, node)); + } else { + return CompletableFuture.supplyAsync(() -> delete(writePool.poll(), info, flipper, node).join(), getExecutor()); + } + } + } + + protected CompletableFuture delete(final DBChannel conn, final EntityInfo info, final Flipper flipper, FilterNode node) { + if (info.isVirtualEntity()) { + return CompletableFuture.completedFuture(-1); + } + //待实现 + if (isAysnc()) { //异步模式 + + } else { + + } + return CompletableFuture.completedFuture(-1); + } + + @Override + public int deleteCache(Class clazz, Serializable... ids) { + if (ids.length == 0) return 0; + final EntityInfo info = loadEntityInfo(clazz); + final EntityCache cache = info.getCache(); + if (cache == null) return -1; + int c = 0; + for (Serializable id : ids) { + c += cache.delete(id); + } + return c; + } + //----------------------------- update ----------------------------- + //----------------------------- find ----------------------------- /** * 根据主键获取对象