aboutsummaryrefslogtreecommitdiff
path: root/juick-server/src/main/java/com/juick/service/TagServiceImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'juick-server/src/main/java/com/juick/service/TagServiceImpl.java')
-rw-r--r--juick-server/src/main/java/com/juick/service/TagServiceImpl.java150
1 files changed, 91 insertions, 59 deletions
diff --git a/juick-server/src/main/java/com/juick/service/TagServiceImpl.java b/juick-server/src/main/java/com/juick/service/TagServiceImpl.java
index d63159cf..8f420ba9 100644
--- a/juick-server/src/main/java/com/juick/service/TagServiceImpl.java
+++ b/juick-server/src/main/java/com/juick/service/TagServiceImpl.java
@@ -1,9 +1,12 @@
package com.juick.service;
import com.juick.Tag;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringEscapeUtils;
-import org.springframework.dao.EmptyResultDataAccessException;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
@@ -13,7 +16,9 @@ import org.springframework.util.Assert;
import javax.inject.Inject;
import java.sql.PreparedStatement;
import java.sql.Statement;
+import java.sql.Types;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
@@ -41,38 +46,39 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Transactional(readOnly = true)
@Override
public com.juick.Tag getTag(final int tid) {
- try {
- return getJdbcTemplate().queryForObject(
- "SELECT synonym_id,name FROM tags WHERE tag_id=?",
- (rs, num) -> {
- Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2)));
- ret.TID = tid;
- ret.SynonymID = rs.getInt(1);
- return ret;
- },
- tid);
- } catch (EmptyResultDataAccessException e) {
- return null;
- }
+ List<Tag> list = getJdbcTemplate().query(
+ "SELECT synonym_id,name FROM tags WHERE tag_id=?",
+ (rs, num) -> {
+ Tag ret = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(2)));
+ ret.TID = tid;
+ ret.SynonymID = rs.getInt(1);
+ return ret;
+ },
+ tid);
+
+ return list.isEmpty() ?
+ null : list.get(0);
}
@Transactional(readOnly = true)
@Override
public com.juick.Tag getTag(final String tag, final boolean autoCreate) {
- Tag ret = null;
- try {
- ret = getJdbcTemplate().queryForObject(
- "SELECT tag_id,synonym_id,name FROM tags WHERE name=?",
- (rs, rowNum) -> {
- Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3)));
- ret1.TID = rs.getInt(1);
- ret1.SynonymID = rs.getInt(2);
- return ret1;
- },
- StringEscapeUtils.escapeHtml4(tag));
- } catch (EmptyResultDataAccessException e) {
- // tag not found
- }
+ if (StringUtils.isBlank(tag))
+ return null;
+
+ List<Tag> list = getJdbcTemplate().query(
+ "SELECT tag_id, synonym_id, name FROM tags WHERE name = ?",
+ (rs, rowNum) -> {
+ Tag ret1 = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3)));
+ ret1.TID = rs.getInt(1);
+ ret1.SynonymID = rs.getInt(2);
+ return ret1;
+ },
+ StringEscapeUtils.escapeHtml4(tag));
+
+ Tag ret = list.isEmpty() ?
+ null : list.get(0);
+
if (ret == null && autoCreate) {
ret = new com.juick.Tag(tag);
ret.TID = createTag(tag);
@@ -83,14 +89,17 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Override
public List<Tag> getTags(final String[] tags, final boolean autoCreate) {
+ if (ArrayUtils.isEmpty(tags))
+ return Collections.emptyList();
+
List<Tag> ret = new ArrayList<>();
for (String tag : tags) {
if (!tag.isEmpty()) {
Tag t = getTag(tag, autoCreate);
- if (t != null) {
+
+ if (t != null)
ret.add(t);
- }
}
}
@@ -99,26 +108,26 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Transactional(readOnly = true)
@Override
- public boolean getTagNoIndex(final int tag_id) {
- try {
- return getJdbcTemplate().queryForObject(
- "SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tag_id) == 1;
- } catch (EmptyResultDataAccessException e) {
- return false;
- }
+ public boolean getTagNoIndex(final int tagId) {
+ List<Integer> list = getJdbcTemplate().queryForList(
+ "SELECT noindex FROM tags WHERE tag_id=?", Integer.class, tagId);
+
+ return !list.isEmpty() && list.get(0) == 1;
}
@Transactional
@Override
public int createTag(final String name) {
KeyHolder holder = new GeneratedKeyHolder();
- getJdbcTemplate().update(con -> {
- PreparedStatement stmt = con.prepareStatement(
- "INSERT INTO tags(name) VALUES (?)",
- Statement.RETURN_GENERATED_KEYS);
- stmt.setString(1, StringEscapeUtils.escapeHtml4(name));
- return stmt;
- }, holder);
+ getJdbcTemplate().update(
+ con -> {
+ PreparedStatement stmt = con.prepareStatement(
+ "INSERT INTO tags(name) VALUES (?)",
+ Statement.RETURN_GENERATED_KEYS);
+ stmt.setString(1, StringEscapeUtils.escapeHtml4(name));
+ return stmt;
+ },
+ holder);
return holder.getKey().intValue();
}
@@ -135,7 +144,8 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
Tag t = new Tag(StringEscapeUtils.unescapeHtml4(rs.getString(1)));
t.UsageCnt = rs.getInt(2);
return t;
- }, uid);
+ },
+ uid);
}
@Transactional(readOnly = true)
@@ -143,7 +153,7 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
public List<String> getUserBLTags(final int uid) {
return getJdbcTemplate().queryForList(
"SELECT tags.name FROM tags INNER JOIN bl_tags " +
- "ON (bl_tags.user_id=? AND bl_tags.tag_id=tags.tag_id) ORDER BY tags.name",
+ "ON (bl_tags.user_id = ? AND bl_tags.tag_id = tags.tag_id) ORDER BY tags.name",
String.class, uid);
}
@@ -151,22 +161,43 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Override
public List<String> getPopularTags() {
return getJdbcTemplate().queryForList(
- "SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class).stream()
- .map(StringEscapeUtils::unescapeHtml4).collect(Collectors.toList());
+ "SELECT name FROM tags WHERE top=1 ORDER BY name ASC", String.class)
+ .stream()
+ .map(StringEscapeUtils::unescapeHtml4)
+ .collect(Collectors.toList());
}
@Transactional
@Override
- public List<Tag> updateTags(final int mid, final List<Tag> newTags) {
+ public List<Tag> updateTags(final int mid, final Collection<Tag> newTags) {
List<Tag> currentTags = messagesService.getMessageTags(mid);
- newTags.stream().filter(currentTags::contains)
- .forEach(t -> getJdbcTemplate().update(
- "DELETE FROM messages_tags WHERE message_id=? AND tag_id=?",
- mid,
- t.TID));
- newTags.stream().filter(t -> !currentTags.contains(t))
- .forEach(t -> getJdbcTemplate().update(
- "INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", mid, t.TID));
+
+ if (CollectionUtils.isEmpty(newTags))
+ return currentTags;
+
+ List<Integer> ids = new ArrayList<>(newTags.size());
+ List<Object[]> params = new ArrayList<>(newTags.size());
+
+ newTags.stream().forEach(tag -> {
+ if (currentTags.contains(tag))
+ ids.add(tag.TID);
+ else
+ params.add(new Object[]{mid, tag.TID});
+ });
+
+ if (!params.isEmpty())
+ getJdbcTemplate().batchUpdate(
+ "INSERT INTO messages_tags(message_id,tag_id) VALUES (?, ?)",
+ params,
+ new int[]{Types.INTEGER, Types.INTEGER});
+
+ if (!ids.isEmpty())
+ getNamedParameterJdbcTemplate().update(
+ "DELETE FROM messages_tags WHERE message_id = :mid AND tag_id in (:ids)",
+ new MapSqlParameterSource()
+ .addValue("mid", mid)
+ .addValue("ids", ids));
+
return messagesService.getMessageTags(mid);
}
@@ -176,12 +207,13 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
if (tagsPattern.matcher(txt).matches()) {
Matcher tagMatcher = TAG_PATTERN.matcher(txt);
+
List<Tag> tags = new ArrayList<>();
+
// TODO: process readonly, private, friends, public
while (tagMatcher.find()) {
- for (int i = 1; i <= tagMatcher.groupCount(); i++) {
+ for (int i = 1; i <= tagMatcher.groupCount(); i++)
tags.add(getTag(tagMatcher.group(i), true));
- }
}
return tags;
}