From 81cf165ade519e7c6ffee18ff2355cb9e42490d9 Mon Sep 17 00:00:00 2001 From: Maxim Valyanskiy Date: Sat, 17 Aug 2024 00:06:03 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=BE=D0=BB=D0=B2=D0=B8?= =?UTF-8?q?=D0=BC=20=D1=81=D0=B8=D0=BD=D0=B8=D0=BD=D0=B8=D0=BC=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/org/linux/user/UserTagDao.java | 20 +++++++------------ .../scala/ru/org/linux/tag/TagService.scala | 8 ++++---- .../ru/org/linux/user/UserTagService.scala | 16 +++++++-------- .../linux/user/UserTagDaoIntegrationTest.java | 10 +++++----- .../ru/org/linux/user/UserTagServiceTest.java | 15 +++++++------- 5 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/main/java/ru/org/linux/user/UserTagDao.java b/src/main/java/ru/org/linux/user/UserTagDao.java index 221c31ef30..85d11a2914 100644 --- a/src/main/java/ru/org/linux/user/UserTagDao.java +++ b/src/main/java/ru/org/linux/user/UserTagDao.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2022 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -20,14 +20,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; -import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository @@ -111,12 +108,9 @@ public ImmutableList getTags(int userId, boolean isFavorite) { "user_tags.user_id=:user_id AND tags_values.id=user_tags.tag_id AND user_tags.is_favorite=:is_favorite " + "ORDER BY value", parameters, - new RowCallbackHandler() { - @Override - public void processRow(ResultSet rs) throws SQLException { - tags.add(rs.getString("value")); - } - } + rs -> { + tags.add(rs.getString("value")); + } ); return tags.build(); @@ -129,7 +123,7 @@ public void processRow(ResultSet rs) throws SQLException { * @param tags список фаворитных тегов * @return список ID пользователей */ - public List getUserIdListByTags(int userId, List tags) { + public List getUserIdListByTags(int userId, List tags) { if (tags.isEmpty()) { return ImmutableList.of(); } @@ -139,12 +133,12 @@ public List getUserIdListByTags(int userId, List tags) { parameters.addValue("user_id", userId); return jdbcTemplate.queryForList( - "select distinct user_id from user_tags where tag_id in (select id from tags_values where value in ( :values )) " + "select distinct user_id from user_tags where tag_id in (:values) " + "AND is_favorite = true " + "AND user_id not in (" + "select userid from ignore_list where ignored=:user_id union " + "select :user_id union " + - "select user_id from user_tags where tag_id in (select id from tags_values where value in ( :values )) and is_favorite = false)", + "select user_id from user_tags where tag_id in (:values) and is_favorite = false)", parameters, Integer.class ); diff --git a/src/main/scala/ru/org/linux/tag/TagService.scala b/src/main/scala/ru/org/linux/tag/TagService.scala index e2046a9084..216cd8d96e 100644 --- a/src/main/scala/ru/org/linux/tag/TagService.scala +++ b/src/main/scala/ru/org/linux/tag/TagService.scala @@ -1,5 +1,5 @@ /* - * Copyright 1998-2023 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -59,15 +59,15 @@ class TagService(tagDao: TagDao, elastic: ElasticClient, actorSystem: ActorSyste def getTagIdOpt(tag: String): Option[Int] = tagDao.getTagId(tag) + def getTagIdOptWithSynonym(tag: String): Option[Int] = tagDao.getTagId(tag).orElse(tagDao.getTagSynonymId(tag)) + /** * Получение идентификационного номера тега по названию, либо создание нового тега. * * @param tagName название тега * @return идентификационный номер тега */ - def getOrCreateTag(tagName: String): Int = { - tagDao.getTagId(tagName).orElse(tagDao.getTagSynonymId(tagName)).getOrElse(tagDao.createTag(tagName)) - } + def getOrCreateTag(tagName: String): Int = getTagIdOptWithSynonym(tagName).getOrElse(tagDao.createTag(tagName)) def getTagInfo(tag: String, skipZero: Boolean): Option[TagInfo] = { if (TagName.isGoodTag(tag)) { diff --git a/src/main/scala/ru/org/linux/user/UserTagService.scala b/src/main/scala/ru/org/linux/user/UserTagService.scala index 43f446928f..0b589c202e 100644 --- a/src/main/scala/ru/org/linux/user/UserTagService.scala +++ b/src/main/scala/ru/org/linux/user/UserTagService.scala @@ -1,5 +1,5 @@ /* - * Copyright 1998-2022 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,7 +19,7 @@ import org.springframework.stereotype.Service import org.springframework.validation.{Errors, MapBindingResult} import ru.org.linux.tag.{TagName, TagNotFoundException, TagService} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* @Service class UserTagService(userTagDao: UserTagDao, tagService: TagService) { @@ -113,7 +113,9 @@ class UserTagService(userTagDao: UserTagDao, tagService: TagService) { * @return список ID пользователей */ def getUserIdListByTags(userid: Int, tags: java.util.List[String]): java.util.List[Integer] = { - userTagDao.getUserIdListByTags(userid, tags) + val tagIds = tags.asScala.flatMap(tagService.getTagIdOptWithSynonym).distinct + + userTagDao.getUserIdListByTags(userid, tagIds.map(Integer.valueOf).asJava) } /** @@ -123,9 +125,7 @@ class UserTagService(userTagDao: UserTagDao, tagService: TagService) { * @param tagName название тега * @return true если у пользователя есть тег */ - def hasFavoriteTag(user: User, tagName: String): Boolean = { - favoritesGet(user).contains(tagName) - } + def hasFavoriteTag(user: User, tagName: String): Boolean = favoritesGet(user).contains(tagName) /** * Проверяет, есть ли указанный игнорируемый тег у пользователя. @@ -139,7 +139,7 @@ class UserTagService(userTagDao: UserTagDao, tagService: TagService) { } /** - * Добавление нескольких тегов из строки. разделённых запятой. + * Добавление нескольких тегов из строки, разделённых запятой. * * @param user объект пользователя * @param tagsStr строка, содержащая разделённые запятой теги @@ -173,7 +173,7 @@ class UserTagService(userTagDao: UserTagDao, tagService: TagService) { def countIgnore(id: Int): Int = userTagDao.countIgnore(id) /** - * преобразование ошибок в массив строк. + * Преобразование ошибок в массив строк. * * @param errors объект ошибок * @return массив строк, содержащий описания ошибок diff --git a/src/test/java/ru/org/linux/user/UserTagDaoIntegrationTest.java b/src/test/java/ru/org/linux/user/UserTagDaoIntegrationTest.java index 159f225b7b..1f96457dd0 100644 --- a/src/test/java/ru/org/linux/user/UserTagDaoIntegrationTest.java +++ b/src/test/java/ru/org/linux/user/UserTagDaoIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2016 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -234,18 +234,18 @@ public void getTest() { public void getUserIdListByTagsTest() { prepareUserTags(); List userIdList; - List tags = new ArrayList<>(); - tags.add("UserTagDaoIntegrationTest_tag1"); + List tags = new ArrayList<>(); + tags.add(tag1Id); userIdList = userTagDao.getUserIdListByTags(user1Id, tags); assertEquals("Wrong count of user ID's.", 1, userIdList.size()); - tags.add("UserTagDaoIntegrationTest_tag2"); + tags.add(tag2Id); userIdList = userTagDao.getUserIdListByTags(user1Id, tags); assertEquals("Wrong count of user ID's.", 1, userIdList.size()); tags.clear(); userTagDao.deleteTag(user1Id, tag5Id, true); - tags.add("UserTagDaoIntegrationTest_tag5"); + tags.add(tag5Id); userIdList = userTagDao.getUserIdListByTags(user1Id, tags); assertEquals("Wrong count of user ID's.", 1, userIdList.size()); } diff --git a/src/test/java/ru/org/linux/user/UserTagServiceTest.java b/src/test/java/ru/org/linux/user/UserTagServiceTest.java index 9cb7268d42..2236df6d1f 100644 --- a/src/test/java/ru/org/linux/user/UserTagServiceTest.java +++ b/src/test/java/ru/org/linux/user/UserTagServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2023 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -58,6 +58,7 @@ public void resetMockObjects() throws Exception { reset(userTagDao); reset(tagService); when(tagService.getTagId(eq("tag1"), anyBoolean())).thenReturn(2); + when(tagService.getTagIdOptWithSynonym(eq("tag1"))).thenReturn(Option.apply(2)); user = getUser(1); } @@ -73,7 +74,7 @@ private User getUser(int id) { @Test public void favoriteAddTest() throws TagNotFoundException { - when(tagDao.getTagId("tag1", false)).thenReturn(Option.apply((Object) 2)); + when(tagDao.getTagId("tag1", false)).thenReturn(Option.apply(2)); userTagService.favoriteAdd(user, "tag1"); verify(userTagDao).addTag(eq(1), eq(2), eq(true)); } @@ -105,7 +106,7 @@ public void favoritesGetTest() { List actual = userTagService.favoritesGet(user); Assert.assertEquals(etalon.size(), actual.size()); - Assert.assertEquals(etalon.get(0), actual.get(0)); + Assert.assertEquals(etalon.getFirst(), actual.getFirst()); } @Test @@ -117,20 +118,20 @@ public void ignoresGetTest() { List actual = userTagService.ignoresGet(user); Assert.assertEquals(etalon.size(), actual.size()); - Assert.assertEquals(etalon.get(0), actual.get(0)); + Assert.assertEquals(etalon.getFirst(), actual.getFirst()); } @Test public void getUserIdListByTagsTest() { List etalon = new ArrayList<>(); - etalon.add(123); List tags = new ArrayList<>(); + etalon.add(123); tags.add("tag1"); - when(userTagDao.getUserIdListByTags(1, tags)).thenReturn(etalon); + when(userTagDao.getUserIdListByTags(1, List.of(2))).thenReturn(etalon); List actual = userTagService.getUserIdListByTags(user.getId(), tags); Assert.assertEquals(etalon.size(), actual.size()); - Assert.assertEquals(etalon.get(0), actual.get(0)); + Assert.assertEquals(etalon.getFirst(), actual.getFirst()); } @Test