diff options
author | Alexander Alexeev | 2016-11-17 23:45:13 +0700 |
---|---|---|
committer | Vitaly Takmazov | 2016-11-23 13:02:55 +0300 |
commit | 19709fa2ade17433b9a76ad4459e1e09d27b88bf (patch) | |
tree | 188ba9d24f4fc5bdf7707c57d61cd9c7212b45cf /juick-server/src/main/java/com/juick/service/TagServiceImpl.java | |
parent | 78a1a68e5555648a07588873b08d59a094391709 (diff) |
repository improvenments: using Collection in params, forse using exists in some query, force using Lists as query result
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.java | 150 |
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; } |