From b792e7feb2b1d1c240fc7af242b2d1cc1be23ec8 Mon Sep 17 00:00:00 2001 From: hy001 Date: Tue, 21 Apr 2026 22:15:20 +0800 Subject: [PATCH] fix(other): hide down-shelved lucky gifts --- .../game/luckygift/LuckyGiftDataQryCmd.java | 14 ++-- .../LuckyGiftMultipleRuleQryCmd.java | 14 ++-- .../app/command/gift/LuckyGiftGiveCmdExe.java | 15 ++-- .../luckygift/LuckyGiftDataQryCmdTest.java | 44 ++++++++++ ...ameLuckyGiftStandardConfigServiceImpl.java | 30 +++---- ...uckyGiftProbabilityDetailsServiceImpl.java | 49 ++++++----- .../impl/LuckyGiftProbabilityServiceImpl.java | 81 +++++++++++-------- .../rds/service/gift/GiftConfigService.java | 12 +-- .../gift/impl/GiftConfigServiceImpl.java | 43 ++++++---- .../GameLuckyGiftConfigClientServiceImpl.java | 18 +++-- 10 files changed, 206 insertions(+), 114 deletions(-) create mode 100644 rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmdTest.java diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmd.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmd.java index 2da895a..c378a60 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmd.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmd.java @@ -34,12 +34,14 @@ public class LuckyGiftDataQryCmd { private final LuckyGiftProbabilityService luckyGiftProbabilityService; private final LuckyGiftProbabilityDetailsService luckyGiftProbabilityDetailsService; - public GameLuckyGiftDataCO execute(GameLuckyGiftCmd cmd) { - - GiftConfigDTO giftConfigCache = giftCacheService.getById(cmd.getGiftId()); - if (Objects.isNull(giftConfigCache) || Objects.isNull(giftConfigCache.getStandardId())) { - return null; - } + public GameLuckyGiftDataCO execute(GameLuckyGiftCmd cmd) { + + GiftConfigDTO giftConfigCache = giftCacheService.getById(cmd.getGiftId()); + if (Objects.isNull(giftConfigCache) + || Boolean.TRUE.equals(giftConfigCache.getDel()) + || Objects.isNull(giftConfigCache.getStandardId())) { + return null; + } LuckyGiftProbability giftProbability = getOneByStandardIdByQuantity(cmd, giftConfigCache); if (Objects.isNull(giftProbability)) { diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftMultipleRuleQryCmd.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftMultipleRuleQryCmd.java index 192844e..1546368 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftMultipleRuleQryCmd.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftMultipleRuleQryCmd.java @@ -82,12 +82,14 @@ public class LuckyGiftMultipleRuleQryCmd { luckyGiftCounts.stream().map(GameLuckyGiftCount::getUserId).collect(Collectors.toSet()))); } - private List listMaxMultiple(Long giftId) { - - GiftConfigDTO configCache = giftCacheService.getById(giftId); - if (Objects.isNull(configCache)) { - return Lists.newArrayList(); - } + private List listMaxMultiple(Long giftId) { + + GiftConfigDTO configCache = giftCacheService.getById(giftId); + if (Objects.isNull(configCache) + || Boolean.TRUE.equals(configCache.getDel()) + || Objects.isNull(configCache.getStandardId())) { + return Lists.newArrayList(); + } List giftProbabilities = listProbabilityByStandardId(configCache); if (CollectionUtils.isEmpty(giftProbabilities)) { diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/gift/LuckyGiftGiveCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/gift/LuckyGiftGiveCmdExe.java index b52523c..ba70323 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/gift/LuckyGiftGiveCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/gift/LuckyGiftGiveCmdExe.java @@ -54,13 +54,14 @@ public class LuckyGiftGiveCmdExe { ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, cmd.getRoomId()); - GiftConfigDTO giftConfig = giftCacheService.getById(cmd.getGiftId()); - - ResponseAssert.notNull(GiftErrorCode.GIFT_NOT_FOUND, giftConfig); - - // 判断版本号从而保证使用幸运礼物必须升级版本 - ResponseAssert.isTrue(CommonErrorCode.NOT_ACCEPT_REQUEST, - Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.LUCKY_GIFT.name()) || + GiftConfigDTO giftConfig = giftCacheService.getById(cmd.getGiftId()); + + ResponseAssert.notNull(GiftErrorCode.GIFT_NOT_FOUND, giftConfig); + ResponseAssert.isFalse(GiftErrorCode.GIFT_NOT_FOUND, Boolean.TRUE.equals(giftConfig.getDel())); + + // 判断版本号从而保证使用幸运礼物必须升级版本 + ResponseAssert.isTrue(CommonErrorCode.NOT_ACCEPT_REQUEST, + Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.LUCKY_GIFT.name()) || Objects.equals(giftConfig.getGiftTab(), GiftTabEnum.MAGIC.name())); // 过滤赠送人非法值 diff --git a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmdTest.java b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmdTest.java new file mode 100644 index 0000000..465d219 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/game/luckygift/LuckyGiftDataQryCmdTest.java @@ -0,0 +1,44 @@ +package com.red.circle.other.app.command.game.luckygift; + +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.red.circle.other.app.common.gift.GameLuckyGiftCommon; +import com.red.circle.other.app.dto.cmd.game.GameLuckyGiftCmd; +import com.red.circle.other.infra.database.cache.service.other.GameLuckyGiftCacheService; +import com.red.circle.other.infra.database.cache.service.other.GiftCacheService; +import com.red.circle.other.infra.database.rds.service.game.LuckyGiftProbabilityDetailsService; +import com.red.circle.other.infra.database.rds.service.game.LuckyGiftProbabilityService; +import com.red.circle.other.inner.model.dto.material.GiftConfigDTO; +import org.junit.jupiter.api.Test; + +class LuckyGiftDataQryCmdTest { + + @Test + void execute_shouldReturnNullWhenGiftIsDownShelved() { + GiftCacheService giftCacheService = mock(GiftCacheService.class); + GameLuckyGiftCommon gameLuckyGiftCommon = mock(GameLuckyGiftCommon.class); + GameLuckyGiftCacheService gameLuckyGiftCacheService = mock(GameLuckyGiftCacheService.class); + LuckyGiftProbabilityService luckyGiftProbabilityService = mock(LuckyGiftProbabilityService.class); + LuckyGiftProbabilityDetailsService luckyGiftProbabilityDetailsService = mock( + LuckyGiftProbabilityDetailsService.class); + LuckyGiftDataQryCmd qryCmd = new LuckyGiftDataQryCmd( + giftCacheService, + gameLuckyGiftCommon, + gameLuckyGiftCacheService, + luckyGiftProbabilityService, + luckyGiftProbabilityDetailsService + ); + + when(giftCacheService.getById(11L)).thenReturn(new GiftConfigDTO() + .setId(11L) + .setDel(Boolean.TRUE) + .setStandardId(99L)); + + GameLuckyGiftCmd cmd = new GameLuckyGiftCmd(); + cmd.setGiftId(11L); + + assertNull(qryCmd.execute(cmd)); + } +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/GameLuckyGiftStandardConfigServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/GameLuckyGiftStandardConfigServiceImpl.java index 99d9afb..859ab8c 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/GameLuckyGiftStandardConfigServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/GameLuckyGiftStandardConfigServiceImpl.java @@ -24,24 +24,26 @@ public class GameLuckyGiftStandardConfigServiceImpl extends GameLuckyGiftStandardConfigService { @Override - public List getLuckyGiftStandard(String sysOrigin) { - return query() - .eq(GameLuckyGiftStandardConfig::getSysOrigin, sysOrigin) - .last(PageConstant.formatLimit(500)) - .list(); - } + public List getLuckyGiftStandard(String sysOrigin) { + return query() + .eq(GameLuckyGiftStandardConfig::getSysOrigin, sysOrigin) + .eq(GameLuckyGiftStandardConfig::getDel, Boolean.FALSE) + .last(PageConstant.formatLimit(500)) + .list(); + } @Override public PageResult getStandardConfig( GameLuckGiftStandardConfigQryCmd query) { - return query() - .eq(StringUtils.isNotBlank(query.getSysOrigin()), GameLuckyGiftStandardConfig::getSysOrigin, - query.getSysOrigin()) - .like(StringUtils.isNotBlank(query.getRemarks()), GameLuckyGiftStandardConfig::getRemarks, - query.getRemarks()) - .orderByDesc(GameLuckyGiftStandardConfig::getCreateTime) - .page(query.getPageQuery()); - } + return query() + .eq(StringUtils.isNotBlank(query.getSysOrigin()), GameLuckyGiftStandardConfig::getSysOrigin, + query.getSysOrigin()) + .like(StringUtils.isNotBlank(query.getRemarks()), GameLuckyGiftStandardConfig::getRemarks, + query.getRemarks()) + .eq(GameLuckyGiftStandardConfig::getDel, Boolean.FALSE) + .orderByDesc(GameLuckyGiftStandardConfig::getCreateTime) + .page(query.getPageQuery()); + } @Override public void deleteStandardConfig(Long id, Long userId) { diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityDetailsServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityDetailsServiceImpl.java index 0b818dc..8fe088d 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityDetailsServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityDetailsServiceImpl.java @@ -60,13 +60,14 @@ public class LuckyGiftProbabilityDetailsServiceImpl extends } @Override - public List listByProbabilityId(Long probabilityId) { - - return query() - .eq(LuckyGiftProbabilityDetails::getProbabilityId, probabilityId) - .last(PageConstant.formatLimit(50)) - .list(); - } + public List listByProbabilityId(Long probabilityId) { + + return query() + .eq(LuckyGiftProbabilityDetails::getProbabilityId, probabilityId) + .eq(LuckyGiftProbabilityDetails::getDel, Boolean.FALSE) + .last(PageConstant.formatLimit(50)) + .list(); + } @Override public void deleteByProbabilityIds(Set probabilityIds) { @@ -74,22 +75,28 @@ public class LuckyGiftProbabilityDetailsServiceImpl extends } @Override - public Map> getLuckyGiftProbabilityDetails( - String sysOrigin) { - return Optional.ofNullable( - query().eq(LuckyGiftProbabilityDetails::getSysOrigin, sysOrigin).list()) - .map(probabilityDetails -> - probabilityDetails.stream().collect( - Collectors.groupingBy(LuckyGiftProbabilityDetails::getProbabilityId))) - .orElse(Maps.newHashMap()); - } + public Map> getLuckyGiftProbabilityDetails( + String sysOrigin) { + return Optional.ofNullable( + query() + .eq(LuckyGiftProbabilityDetails::getSysOrigin, sysOrigin) + .eq(LuckyGiftProbabilityDetails::getDel, Boolean.FALSE) + .list()) + .map(probabilityDetails -> + probabilityDetails.stream().collect( + Collectors.groupingBy(LuckyGiftProbabilityDetails::getProbabilityId))) + .orElse(Maps.newHashMap()); + } @Override - public List getDetailByProbabilityId(Long probabilityId) { - return Optional.ofNullable( - query().eq(LuckyGiftProbabilityDetails::getProbabilityId, probabilityId).list()).orElse( - Lists.newArrayList()); - } + public List getDetailByProbabilityId(Long probabilityId) { + return Optional.ofNullable( + query() + .eq(LuckyGiftProbabilityDetails::getProbabilityId, probabilityId) + .eq(LuckyGiftProbabilityDetails::getDel, Boolean.FALSE) + .list()).orElse( + Lists.newArrayList()); + } @Override public void add(Long probabilityId, diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityServiceImpl.java index c31ca41..1f473eb 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/game/impl/LuckyGiftProbabilityServiceImpl.java @@ -29,37 +29,47 @@ public class LuckyGiftProbabilityServiceImpl extends LuckyGiftProbabilityService { @Override - public List listByStandardId(Long standardId) { - - return query() - .eq(LuckyGiftProbability::getStandardId, standardId) - .last(PageConstant.formatLimit(5)) - .list(); - } + public List listByStandardId(Long standardId) { + + return query() + .eq(LuckyGiftProbability::getStandardId, standardId) + .eq(LuckyGiftProbability::getDel, Boolean.FALSE) + .last(PageConstant.formatLimit(5)) + .list(); + } @Override public LuckyGiftProbability getOneByStandardIdByQuantity(Long standardId, Integer quantity) { - return query() - .eq(LuckyGiftProbability::getGiftQuantity, quantity) - .eq(LuckyGiftProbability::getStandardId, standardId) - .last(PageConstant.LIMIT_ONE) - .getOne(); - } + return query() + .eq(LuckyGiftProbability::getGiftQuantity, quantity) + .eq(LuckyGiftProbability::getStandardId, standardId) + .eq(LuckyGiftProbability::getDel, Boolean.FALSE) + .last(PageConstant.LIMIT_ONE) + .getOne(); + } + + @Override + public Map> getLuckyGiftProbabilityMap(Set standardIds) { + if (Objects.isNull(standardIds) || standardIds.isEmpty()) { + return Maps.newHashMap(); + } + return Optional.ofNullable(query() + .in(LuckyGiftProbability::getStandardId, standardIds) + .eq(LuckyGiftProbability::getDel, Boolean.FALSE) + .list()) + .map(probabilityList -> probabilityList.stream() + .collect(Collectors.groupingBy(LuckyGiftProbability::getStandardId))) + .orElse(Maps.newHashMap()); + } @Override - public Map> getLuckyGiftProbabilityMap(Set standardIds) { - return Optional.ofNullable(query().in(LuckyGiftProbability::getStandardId, standardIds).list()) - .map(probabilityList -> probabilityList.stream() - .collect(Collectors.groupingBy(LuckyGiftProbability::getStandardId))) - .orElse(Maps.newHashMap()); - } - - @Override - public List getLuckyGiftProbabilityByStandardId(Long id) { - return query() - .eq(Objects.nonNull(id), LuckyGiftProbability::getStandardId, id).list(); - } + public List getLuckyGiftProbabilityByStandardId(Long id) { + return query() + .eq(Objects.nonNull(id), LuckyGiftProbability::getStandardId, id) + .eq(LuckyGiftProbability::getDel, Boolean.FALSE) + .list(); + } @Override public Boolean deleteByStandardId(Long id) { @@ -69,13 +79,14 @@ public class LuckyGiftProbabilityServiceImpl extends @Override public List getLuckyGiftProbabilityConfig( GameLuckGiftProbabilityConfigQryCmd query) { - return query().eq( - StringUtils.isNotBlank(query.getSysOrigin()), LuckyGiftProbability::getSysOrigin, - query.getSysOrigin()) - .eq(Objects.nonNull(query.getStandardId()), LuckyGiftProbability::getStandardId, - query.getStandardId()) - .orderByAsc(LuckyGiftProbability::getSort) - .list(); - } - -} + return query().eq( + StringUtils.isNotBlank(query.getSysOrigin()), LuckyGiftProbability::getSysOrigin, + query.getSysOrigin()) + .eq(Objects.nonNull(query.getStandardId()), LuckyGiftProbability::getStandardId, + query.getStandardId()) + .eq(LuckyGiftProbability::getDel, Boolean.FALSE) + .orderByAsc(LuckyGiftProbability::getSort) + .list(); + } + +} diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/GiftConfigService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/GiftConfigService.java index 6ec574d..c7a4142 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/GiftConfigService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/GiftConfigService.java @@ -134,11 +134,13 @@ public interface GiftConfigService extends BaseService { List list(String sysOrigin); - List getLuckyGiftByStandardId(Long id, String name); - - /** - * 获取平台表白礼物. - * + List getLuckyGiftByStandardId(Long id, String name); + + Set listEffectiveLuckyGiftStandardIds(String sysOrigin); + + /** + * 获取平台表白礼物. + * * @param sysOrigin 平台 * @return list */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/impl/GiftConfigServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/impl/GiftConfigServiceImpl.java index 08ec14f..efde03d 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/impl/GiftConfigServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/gift/impl/GiftConfigServiceImpl.java @@ -276,20 +276,35 @@ public class GiftConfigServiceImpl extends BaseServiceImpl getLuckyGiftByStandardId(Long standardId, String giftTab) { - return Optional.ofNullable(query() - .eq(GiftConfig::getGiftTab, giftTab) - .eq(GiftConfig::getStandardId, standardId) - .eq(GiftConfig::getDel, Boolean.FALSE) - .last(PageConstant.MAX_LIMIT) - .list()) - .orElse(Lists.newArrayList()); - } - - @Override - public List listConfessionGifts(String sysOrigin) { - return query() - .eq(GiftConfig::getSysOrigin, sysOrigin) + public List getLuckyGiftByStandardId(Long standardId, String giftTab) { + return Optional.ofNullable(query() + .eq(GiftConfig::getGiftTab, giftTab) + .eq(GiftConfig::getStandardId, standardId) + .eq(GiftConfig::getDel, Boolean.FALSE) + .last(PageConstant.MAX_LIMIT) + .list()) + .orElse(Lists.newArrayList()); + } + + @Override + public Set listEffectiveLuckyGiftStandardIds(String sysOrigin) { + return Optional.ofNullable(query() + .eq(GiftConfig::getSysOrigin, sysOrigin) + .eq(GiftConfig::getGiftTab, GiftTabEnum.LUCKY_GIFT) + .eq(GiftConfig::getDel, Boolean.FALSE) + .isNotNull(GiftConfig::getStandardId) + .list()) + .map(gifts -> gifts.stream() + .map(GiftConfig::getStandardId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())) + .orElse(CollectionUtils.newHashSet()); + } + + @Override + public List listConfessionGifts(String sysOrigin) { + return query() + .eq(GiftConfig::getSysOrigin, sysOrigin) .eq(GiftConfig::getDel, Boolean.FALSE) .eq(GiftConfig::getExplanationGift, Boolean.TRUE) .orderByDesc(GiftConfig::getSort) diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/game/impl/GameLuckyGiftConfigClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/game/impl/GameLuckyGiftConfigClientServiceImpl.java index 68f10eb..10c1a87 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/game/impl/GameLuckyGiftConfigClientServiceImpl.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/game/impl/GameLuckyGiftConfigClientServiceImpl.java @@ -81,12 +81,18 @@ public class GameLuckyGiftConfigClientServiceImpl implements GameLuckyGiftConfig } @Override - public List listProbability(String sysOrigin) { - List luckyGiftStandards = gameLuckyGiftStandardConfigService.getLuckyGiftStandard( - sysOrigin); - if (CollectionUtils.isEmpty(luckyGiftStandards)) { - return Lists.newArrayList(); - } + public List listProbability(String sysOrigin) { + Set activeStandardIds = giftConfigService.listEffectiveLuckyGiftStandardIds(sysOrigin); + if (CollectionUtils.isEmpty(activeStandardIds)) { + return Lists.newArrayList(); + } + List luckyGiftStandards = gameLuckyGiftStandardConfigService.getLuckyGiftStandard( + sysOrigin).stream() + .filter(luckyGiftStandard -> activeStandardIds.contains(luckyGiftStandard.getId())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(luckyGiftStandards)) { + return Lists.newArrayList(); + } Map> probabilityMap = luckyGiftProbabilityService.getLuckyGiftProbabilityMap( luckyGiftStandards.stream().map(GameLuckyGiftStandardConfig::getId).collect( Collectors.toSet()));