From 95c00610f62a32a58b90c0e5aaac581ddd5c53f5 Mon Sep 17 00:00:00 2001 From: llllon Date: Fri, 5 Sep 2025 15:57:11 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=8F=96=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PurchaseDataSyncServiceImpl.class | Bin 28307 -> 28742 bytes .../compileJava/previous-compilation-data.bin | Bin 9392464 -> 9392464 bytes .../impl/ProductionDataSyncServiceImpl.java | 116 ++++++++++-------- .../impl/PurchaseDataSyncServiceImpl.java | 116 ++++++++++-------- .../service/impl/SaleDataSyncServiceImpl.java | 15 +-- 5 files changed, 140 insertions(+), 107 deletions(-) diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.class index 1e148c39bd2835a62c8903b27c19c00bc6419cbf..5e9f87fcd27110598051fbe865eb5d8d01d8c776 100644 GIT binary patch delta 13134 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 z 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 H(l7o8nHdd& diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin index a242596fbfa71538b1089a3048a3c107d4099455..33249546aa9eb70ffa0d79def92cc2fe7f916a0c 100644 GIT binary patch delta 712 zcmWl|Uo6xC0Kjo4T>8UL{>yP!{*>bo(&=3O^iSkZ7g5gNI{)QF<@`DM;YXK-HZQ-m znMbDb&~6^IR!<&mHk-AXtrmJ|z2L!vt*_7aS)EyOTjjVYe6fBL|9wp>(0tlIoYfeN z6Yn;)-3!0|cE|_2Dy{YV*iUt>At&8rG=&8PhX^I(#XI_nxZDpbUh^vdsYy{*NV4Ln zE058Q?oL_ZA&v?@jep$twkOwIe=Pr=$T+l1I){f-=TI6p1f|R8P=z@lR{7EFIVf+v zmu!~f^yCSiz>AEb zma&YZj`2)jA}={@mZT}YkiFj9Y1b`!Z>bXJT!zb*CG~U?lbOQHOyw2onZ~O$Fr7wT zV+J#s#cW>Z4c_D}-ewN(Fqe6}%X}8FkVU*l6YsN_C49hAmhmAUv7BaBu##1*W({lk zm``Y79qZY^MmDjTEo|jew$aLVK4S+v`J6BKl3ld1n?3AhAMNbtD-KZPAcr_ii6b24 PYdZLbV@~z-+k}Pxng=4b delta 712 zcmZY2Uog`F0KoB^e@Qk!Ma`zQl=4F(liC`gGNVZI-NJ8pMgelP0W zxib&k9(L!hH}5>xdG_e`P&p4>U(X&s&!3&|KVo(;?-BlPuKI#<|Bxt_D= ?") + .append(" AND ") + .append(timeField).append(" < ?") + .append(" ORDER BY ").append(timeField); + //.append(" BETWEEN ? AND ? ORDER BY " + timeField + ""); if (jezd != null && !jezd.isEmpty()) { conditionBuilder.append(", " + jezd + " "); } @@ -354,8 +358,12 @@ public class ProductionDataSyncServiceImpl implements DataSyncService { } } else if (timeField != null && !timeField.isEmpty()) { // 没有分区字段,但时间字段存在,使用时间范围条件 - conditionBuilder.append(timeField) - .append(" BETWEEN ? AND ? ORDER BY " + timeField + ""); + /*conditionBuilder.append(timeField) + .append(" BETWEEN ? AND ? ORDER BY " + timeField + "");*/ + conditionBuilder.append(timeField).append(" >= ?") + .append(" AND ") + .append(timeField).append(" < ?") + .append(" ORDER BY ").append(timeField); if (jezd != null && !jezd.isEmpty()) { conditionBuilder.append(", " + jezd + " "); } @@ -455,61 +463,73 @@ public class ProductionDataSyncServiceImpl implements DataSyncService { } /** - * 将时间范围拆分为多个区间,确保区间连续且不重叠 - * @param startDate 开始时间(yyyy-MM-dd格式,时间部分为00:00:00) - * @param endDate 结束时间(yyyy-MM-dd格式,时间部分为00:00:00) - * @param daysInterval 间隔天数 - * @return 时间区间列表,每个区间的结束时间调整为23:59:59以确保覆盖完整日期 + * 将时间范围拆分为多个区间,确保区间连续(下一个区间的开始时间 = 上一个区间的结束时间)且无重叠 + * 所有日期均强制转换为 yyyy-MM-dd 格式(时间部分固定为 00:00:00) + * @param startDate 开始时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00) + * @param endDate 结束时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00) + * @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08) + * @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式 */ - private static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { - List ranges = new ArrayList<>(); + public static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { + // 1. 入参合法性校验:避免无效区间或负间隔 + if (startDate == null || endDate == null) { + throw new IllegalArgumentException("开始时间和结束时间不可为 null"); + } + if (daysInterval < 1) { + throw new IllegalArgumentException("间隔天数必须大于等于 1"); + } + // 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00) Calendar calendar = Calendar.getInstance(); + setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响) calendar.setTime(startDate); + Date currentStart = calendar.getTime(); - // 调整结束时间以包含完整日期 Calendar endCal = Calendar.getInstance(); + setTimeToStartOfDay(endCal); endCal.setTime(endDate); - endCal.set(Calendar.HOUR_OF_DAY, 23); - endCal.set(Calendar.MINUTE, 59); - endCal.set(Calendar.SECOND, 59); - endCal.set(Calendar.MILLISECOND, 999); - Date adjustedEndDate = endCal.getTime(); - - while (calendar.getTime().before(adjustedEndDate)) { - // 区间开始时间(当前日期的00:00:00) - Date rangeStart = calendar.getTime(); - - // 增加间隔天数-1天,然后设置为23:59:59作为区间结束时间 - calendar.add(Calendar.DAY_OF_MONTH, daysInterval - 1); - calendar.set(Calendar.HOUR_OF_DAY, 23); - calendar.set(Calendar.MINUTE, 59); - calendar.set(Calendar.SECOND, 59); - calendar.set(Calendar.MILLISECOND, 999); - - Date rangeEnd = calendar.getTime(); - - // 如果区间结束时间超过最终结束时间,使用最终结束时间 - if (rangeEnd.after(adjustedEndDate)) { - rangeEnd = adjustedEndDate; + Date finalEnd = endCal.getTime(); + // 额外校验:开始时间不能晚于结束时间 + if (currentStart.after(finalEnd)) { + throw new IllegalArgumentException("开始时间不能晚于结束时间"); + } + List ranges = new ArrayList<>(); + // 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束” + while (true) { + // 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08) + calendar.add(Calendar.DAY_OF_MONTH, daysInterval); + setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00 + Date currentEnd = calendar.getTime(); + // 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd + if (currentEnd.after(finalEnd)) { + currentEnd = finalEnd; } - - ranges.add(new Date[]{rangeStart, rangeEnd}); - - // 准备下一个区间的开始时间:当前区间结束时间的下一天00:00:00 - calendar.add(Calendar.MILLISECOND, 1); // 加1毫秒到下一天 - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - - // 如果已经达到或超过结束时间,则退出循环 - if (calendar.getTime().after(adjustedEndDate)) { + // 添加当前区间 [currentStart, currentEnd] + ranges.add(new Date[]{currentStart, currentEnd}); + // 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分 + if (currentEnd.equals(finalEnd)) { break; } + // 准备下一个区间的开始时间:当前结束时间(满足“连续”要求) + currentStart = currentEnd; } + return ranges; } + /** + * 工具方法:将 Calendar 的时间部分强制设置为当天 00:00:00(截断时分秒毫秒) + * @param calendar 待处理的 Calendar 实例(非 null) + */ + private static void setTimeToStartOfDay(Calendar calendar) { + if (calendar == null) { + throw new IllegalArgumentException("Calendar 实例不可为 null"); + } + calendar.set(Calendar.HOUR_OF_DAY, 0); // 24小时制,0 表示凌晨 0 点 + calendar.set(Calendar.MINUTE, 0); // 分钟设为 0 + calendar.set(Calendar.SECOND, 0); // 秒设为 0 + calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为 0 + } + /** * 字段映射转换 * @param source 源数据记录 diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.java index 457bc08..5ff7595 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/PurchaseDataSyncServiceImpl.java @@ -233,6 +233,7 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService { boolean hasMore; RDSAPI rdsapi = null; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd"); try { rdsapi = SDK.getCCAPI().getRDSAPI(ccId); DBUtils.SUPPLY supply = rdsapi.getSupply(); @@ -260,8 +261,8 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService { for (int i = 0; i < timeRanges.size(); i++) { Date[] range = timeRanges.get(i); - String startDate = simpleDateFormat.format(range[0]); - String endDate = simpleDateFormat.format(range[1]); + String startDate = simpleDateFormat2.format(range[0]); + String endDate = simpleDateFormat2.format(range[1]); LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate); if ("ORACLE".equalsIgnoreCase(DBname)) { @@ -374,8 +375,11 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService { // 如果时间字段存在,添加时间范围条件 if (timeField != null && !timeField.isEmpty()) { conditionBuilder.append(" AND ") - .append(timeField) - .append(" BETWEEN ? AND ? ORDER BY " + timeField + ""); + .append(timeField).append(" >= ?") + .append(" AND ") + .append(timeField).append(" < ?") + .append(" ORDER BY ").append(timeField); + //.append(" BETWEEN ? AND ? ORDER BY " + timeField + ""); if (jezd != null && !jezd.isEmpty()) { conditionBuilder.append(", " + jezd + " "); } @@ -383,8 +387,12 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService { } } else if (timeField != null && !timeField.isEmpty()) { // 没有分区字段,但时间字段存在,使用时间范围条件 - conditionBuilder.append(timeField) - .append(" BETWEEN ? AND ? ORDER BY " + timeField + ""); + /*conditionBuilder.append(timeField) + .append(" BETWEEN ? AND ? ORDER BY " + timeField + "");*/ + conditionBuilder.append(timeField).append(" >= ?") + .append(" AND ") + .append(timeField).append(" < ?") + .append(" ORDER BY ").append(timeField); if (jezd != null && !jezd.isEmpty()) { conditionBuilder.append(", " + jezd + " "); } @@ -437,61 +445,73 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService { } /** - * 将时间范围拆分为多个区间,确保区间连续且不重叠 - * @param startDate 开始时间(yyyy-MM-dd格式,时间部分为00:00:00) - * @param endDate 结束时间(yyyy-MM-dd格式,时间部分为00:00:00) - * @param daysInterval 间隔天数 - * @return 时间区间列表,每个区间的结束时间调整为23:59:59以确保覆盖完整日期 + * 将时间范围拆分为多个区间,确保区间连续(下一个区间的开始时间 = 上一个区间的结束时间)且无重叠 + * 所有日期均强制转换为 yyyy-MM-dd 格式(时间部分固定为 00:00:00) + * @param startDate 开始时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00) + * @param endDate 结束时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00) + * @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08) + * @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式 */ - private static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { - List ranges = new ArrayList<>(); + public static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { + // 1. 入参合法性校验:避免无效区间或负间隔 + if (startDate == null || endDate == null) { + throw new IllegalArgumentException("开始时间和结束时间不可为 null"); + } + if (daysInterval < 1) { + throw new IllegalArgumentException("间隔天数必须大于等于 1"); + } + // 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00) Calendar calendar = Calendar.getInstance(); + setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响) calendar.setTime(startDate); + Date currentStart = calendar.getTime(); - // 调整结束时间以包含完整日期 Calendar endCal = Calendar.getInstance(); + setTimeToStartOfDay(endCal); endCal.setTime(endDate); - endCal.set(Calendar.HOUR_OF_DAY, 23); - endCal.set(Calendar.MINUTE, 59); - endCal.set(Calendar.SECOND, 59); - endCal.set(Calendar.MILLISECOND, 999); - Date adjustedEndDate = endCal.getTime(); - - while (calendar.getTime().before(adjustedEndDate)) { - // 区间开始时间(当前日期的00:00:00) - Date rangeStart = calendar.getTime(); - - // 增加间隔天数-1天,然后设置为23:59:59作为区间结束时间 - calendar.add(Calendar.DAY_OF_MONTH, daysInterval - 1); - calendar.set(Calendar.HOUR_OF_DAY, 23); - calendar.set(Calendar.MINUTE, 59); - calendar.set(Calendar.SECOND, 59); - calendar.set(Calendar.MILLISECOND, 999); - - Date rangeEnd = calendar.getTime(); - - // 如果区间结束时间超过最终结束时间,使用最终结束时间 - if (rangeEnd.after(adjustedEndDate)) { - rangeEnd = adjustedEndDate; + Date finalEnd = endCal.getTime(); + // 额外校验:开始时间不能晚于结束时间 + if (currentStart.after(finalEnd)) { + throw new IllegalArgumentException("开始时间不能晚于结束时间"); + } + List ranges = new ArrayList<>(); + // 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束” + while (true) { + // 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08) + calendar.add(Calendar.DAY_OF_MONTH, daysInterval); + setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00 + Date currentEnd = calendar.getTime(); + // 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd + if (currentEnd.after(finalEnd)) { + currentEnd = finalEnd; } - - ranges.add(new Date[]{rangeStart, rangeEnd}); - - // 准备下一个区间的开始时间:当前区间结束时间的下一天00:00:00 - calendar.add(Calendar.MILLISECOND, 1); // 加1毫秒到下一天 - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - - // 如果已经达到或超过结束时间,则退出循环 - if (calendar.getTime().after(adjustedEndDate)) { + // 添加当前区间 [currentStart, currentEnd] + ranges.add(new Date[]{currentStart, currentEnd}); + // 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分 + if (currentEnd.equals(finalEnd)) { break; } + // 准备下一个区间的开始时间:当前结束时间(满足“连续”要求) + currentStart = currentEnd; } + return ranges; } + /** + * 工具方法:将 Calendar 的时间部分强制设置为当天 00:00:00(截断时分秒毫秒) + * @param calendar 待处理的 Calendar 实例(非 null) + */ + private static void setTimeToStartOfDay(Calendar calendar) { + if (calendar == null) { + throw new IllegalArgumentException("Calendar 实例不可为 null"); + } + calendar.set(Calendar.HOUR_OF_DAY, 0); // 24小时制,0 表示凌晨 0 点 + calendar.set(Calendar.MINUTE, 0); // 分钟设为 0 + calendar.set(Calendar.SECOND, 0); // 秒设为 0 + calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为 0 + } + /** * 处理并插入数据到目标表 * @param sourceData 源数据列表 diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java index ccd2b9d..23f041e 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java @@ -178,6 +178,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService { boolean hasMore; RDSAPI rdsapi = null; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd"); try { rdsapi = SDK.getCCAPI().getRDSAPI(ccId); DBUtils.SUPPLY supply = rdsapi.getSupply(); @@ -204,8 +205,8 @@ public class SaleDataSyncServiceImpl implements DataSyncService { for (int i = 0; i < timeRanges.size(); i++) { Date[] range = timeRanges.get(i); - String startDate = simpleDateFormat.format(range[0]); - String endDate = simpleDateFormat.format(range[1]); + String startDate = simpleDateFormat2.format(range[0]); + String endDate = simpleDateFormat2.format(range[1]); LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate); if ("ORACLE".equalsIgnoreCase(DBname)) { @@ -449,7 +450,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService { * @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08) * @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式 */ - private static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { + public static List splitTimeRange(Date startDate, Date endDate, int daysInterval) { // 1. 入参合法性校验:避免无效区间或负间隔 if (startDate == null || endDate == null) { throw new IllegalArgumentException("开始时间和结束时间不可为 null"); @@ -457,7 +458,6 @@ public class SaleDataSyncServiceImpl implements DataSyncService { if (daysInterval < 1) { throw new IllegalArgumentException("间隔天数必须大于等于 1"); } - // 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00) Calendar calendar = Calendar.getInstance(); setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响) @@ -468,34 +468,27 @@ public class SaleDataSyncServiceImpl implements DataSyncService { setTimeToStartOfDay(endCal); endCal.setTime(endDate); Date finalEnd = endCal.getTime(); - // 额外校验:开始时间不能晚于结束时间 if (currentStart.after(finalEnd)) { throw new IllegalArgumentException("开始时间不能晚于结束时间"); } - List ranges = new ArrayList<>(); - // 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束” while (true) { // 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08) calendar.add(Calendar.DAY_OF_MONTH, daysInterval); setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00 Date currentEnd = calendar.getTime(); - // 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd if (currentEnd.after(finalEnd)) { currentEnd = finalEnd; } - // 添加当前区间 [currentStart, currentEnd] ranges.add(new Date[]{currentStart, currentEnd}); - // 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分 if (currentEnd.equals(finalEnd)) { break; } - // 准备下一个区间的开始时间:当前结束时间(满足“连续”要求) currentStart = currentEnd; }