aboutsummaryrefslogtreecommitdiff
path: root/juick-server-jdbc/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'juick-server-jdbc/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java')
-rw-r--r--juick-server-jdbc/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/juick-server-jdbc/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java b/juick-server-jdbc/src/main/java/com/juick/service/search/SphinxSearchServiceImpl.java
new file mode 100644
index 00000000..aa903545
--- /dev/null
+++ b/juick-server-jdbc/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, "JdbcTemplate must be initialized");
+ this.namedParameterSearchJdbcTemplate = new NamedParameterJdbcTemplate(searchJdbcTemplate);
+ }
+
+ public SphinxSearchServiceImpl(DataSource searchDataSource) {
+ Assert.notNull(searchDataSource, "DataSource must be initialized");
+ this.namedParameterSearchJdbcTemplate = new NamedParameterJdbcTemplate(searchDataSource);
+ }
+
+ @Override
+ public List<Integer> 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 " : StringUtils.EMPTY) +
+ " ORDER BY id DESC LIMIT :limit",
+ sqlParameterSource,
+ Integer.class);
+ }
+
+ @Override
+ public List<Integer> 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 " : StringUtils.EMPTY) +
+ " 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