From 36f0ced4b46a1823a15d3e33e664891c92618b78 Mon Sep 17 00:00:00 2001 From: Alexander Alexeev Date: Fri, 18 Nov 2016 01:30:39 +0700 Subject: search service for full text search implementation; search bean configuration --- .../service/search/SphinxSearchServiceImpl.java | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 juick-server/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java (limited to 'juick-server/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java') diff --git a/juick-server/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java b/juick-server/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java new file mode 100644 index 00000000..de0a101f --- /dev/null +++ b/juick-server/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java @@ -0,0 +1,85 @@ +package com.juick.service.search; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.util.Assert; + +import javax.sql.DataSource; +import java.util.Collections; +import java.util.List; + +/** + * Created by aalexeev on 11/18/16. + */ + +/* Note + * Don't use any spring's component annotation (such as @Repository, @Service, @Component, etc). + * This class directly used by spring's search configuration class + */ +public class SphinxSearchServiceImpl implements SearchService { + private static final int DEFAULT_MAX_RESULT = 25; + + private final NamedParameterJdbcTemplate namedParameterSearchJdbcTemplate; + + private int maxResult = DEFAULT_MAX_RESULT; + + + public SphinxSearchServiceImpl(JdbcTemplate searchJdbcTemplate) { + Assert.notNull(searchJdbcTemplate); + this.namedParameterSearchJdbcTemplate = new NamedParameterJdbcTemplate(searchJdbcTemplate); + } + + public SphinxSearchServiceImpl(DataSource searchDataSource) { + Assert.notNull(searchDataSource); + this.namedParameterSearchJdbcTemplate = new NamedParameterJdbcTemplate(searchDataSource); + } + + @Override + public List searchInAllMessages(final String searchString, final int messageIdBefore) { + if (StringUtils.isBlank(searchString)) + return Collections.emptyList(); + + MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource() + .addValue("search", searchString) + .addValue("before", messageIdBefore) + .addValue("limit", maxResult); + + return namedParameterSearchJdbcTemplate.queryForList( + "SELECT id AS message_id FROM messages WHERE MATCH(:search) " + + (messageIdBefore > 0 ? + " AND id < :before " : "") + + " ORDER BY id DESC LIMIT :limit", + sqlParameterSource, + Integer.class); + } + + @Override + public List searchByStringAndUser(final String searchString, final int userId, int messageIdBefore) { + if (StringUtils.isBlank(searchString)) + return Collections.emptyList(); + + MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource() + .addValue("search", searchString) + .addValue("userId", userId) + .addValue("before", messageIdBefore) + .addValue("limit", maxResult); + + return namedParameterSearchJdbcTemplate.queryForList( + "SELECT id AS message_id FROM messages WHERE user_id = :userId AND MATCH(:search) " + + (messageIdBefore > 0 ? + " AND id < :before " : "") + + " ORDER BY id DESC LIMIT :limit", + sqlParameterSource, + Integer.class); + } + + @Override + public void setMaxResult(int maxResult) { + if (maxResult <= 0) + throw new IllegalArgumentException("maxResult value (" + maxResult + ") must be greater then 0"); + + this.maxResult = maxResult; + } +} \ No newline at end of file -- cgit v1.2.3