Subversion Repositories SmartDukaan

Rev

Rev 35369 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
22346 amit.gupta 1
package com.spice.profitmandi.common.solr;
2
 
30080 amit.gupta 3
import com.spice.profitmandi.common.enumuration.SchemeType;
4
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
5
import com.spice.profitmandi.common.web.client.RestClient;
25380 amit.gupta 6
import org.apache.commons.lang3.StringUtils;
7
import org.apache.http.conn.HttpHostConnectException;
28221 amit.gupta 8
import org.apache.logging.log4j.LogManager;
9
import org.apache.logging.log4j.Logger;
25380 amit.gupta 10
import org.json.JSONArray;
11
import org.json.JSONObject;
27030 amit.gupta 12
import org.springframework.beans.factory.annotation.Autowired;
26736 amit.gupta 13
import org.springframework.beans.factory.annotation.Value;
25380 amit.gupta 14
import org.springframework.stereotype.Service;
15
 
30080 amit.gupta 16
import java.util.*;
31712 amit.gupta 17
import java.util.stream.Collectors;
25380 amit.gupta 18
 
25386 amit.gupta 19
@Service("solrServiceCommon")
22346 amit.gupta 20
public class SolrService {
28221 amit.gupta 21
 
22
	private static final Logger logger = LogManager.getLogger(SolrService.class);
23
 
26736 amit.gupta 24
	@Value("${new.solr.url}")
25
	private String solrUrl;
28221 amit.gupta 26
 
27030 amit.gupta 27
	@Autowired
28
	private RestClient restClient;
28221 amit.gupta 29
 
31330 tejbeer 30
	public String getContent(String queryTerm, List<Integer> categoryIds, List<String> brands, int limit,
31
			boolean activeOnly) throws Exception {
32
 
33
		JSONArray docs = this.getContentDocs(queryTerm, categoryIds, brands, limit, activeOnly);
34
		return docs.toString();
35
	}
36
 
37
	public JSONArray getContentDocs(String queryTerm, List<Integer> categoryIds, List<String> brands, int limit,
38
			boolean activeOnly) throws Exception {
22346 amit.gupta 39
		Map<String, String> params = new HashMap<>();
25380 amit.gupta 40
		List<String> mandatoryQ = new ArrayList<>();
41
		if (queryTerm != null && !queryTerm.equals("null")) {
28221 amit.gupta 42
			mandatoryQ.add(String.format("+(%s)", "*" + queryTerm + "*"));
25380 amit.gupta 43
		} else {
44
			queryTerm = null;
45
		}
27325 amit.gupta 46
		params.put("q", StringUtils.join(mandatoryQ, " "));
30267 amit.gupta 47
		if (categoryIds != null && categoryIds.size() > 0) {
30262 amit.gupta 48
			params.put("q", params.get("q") + " +filter(categoryId_i:(" + StringUtils.join(categoryIds, " ") + "))");
27601 amit.gupta 49
		}
28221 amit.gupta 50
		if (brands.size() > 0) {
31714 amit.gupta 51
			brands = brands.stream().map(x -> x.replaceAll(" ", "\\\\ ")).collect(Collectors.toList());
27601 amit.gupta 52
			params.put("q", params.get("q") + " AND brand_ss:(" + StringUtils.join(brands, " ") + ")");
53
		}
30080 amit.gupta 54
		if (activeOnly) {
55
			params.put("q", params.get("q") + " AND active_b:true");
56
		}
25380 amit.gupta 57
		params.put("fl", "*");
58
		if (queryTerm == null) {
59
			params.put("sort", "create_s desc");
60
		}
22346 amit.gupta 61
		params.put("start", String.valueOf(0));
28221 amit.gupta 62
		if (limit == 0) {
27603 amit.gupta 63
			params.put("fl", "catalogId_i, title_s");
64
			params.put("rows", String.valueOf(5000));
65
		} else {
28653 amit.gupta 66
			params.put("rows", String.valueOf(limit));
27603 amit.gupta 67
		}
22346 amit.gupta 68
		params.put("wt", "json");
25380 amit.gupta 69
		String response = null;
22346 amit.gupta 70
		try {
27030 amit.gupta 71
			response = restClient.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
25380 amit.gupta 72
		} catch (HttpHostConnectException e) {
73
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
22346 amit.gupta 74
		}
25380 amit.gupta 75
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
76
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
31330 tejbeer 77
		return docs;
22346 amit.gupta 78
	}
25380 amit.gupta 79
 
36923 ranu 80
	/**
81
	 * Same query as {@link #getContentDocs} but also surfaces Solr's
82
	 * <code>response.numFound</code> so callers can show "showing X of Y" totals.
83
	 * Returns a small wrapper with the docs array (still capped by {@code limit})
84
	 * and the unlimited match total.
85
	 */
86
	public ContentSearchResult getContentWithTotal(String queryTerm, List<Integer> categoryIds, List<String> brands,
87
			int limit, boolean activeOnly) throws Exception {
88
		Map<String, String> params = new HashMap<>();
89
		List<String> mandatoryQ = new ArrayList<>();
90
		if (queryTerm != null && !queryTerm.equals("null")) {
91
			mandatoryQ.add(String.format("+(%s)", "*" + queryTerm + "*"));
92
		} else {
93
			queryTerm = null;
94
		}
95
		params.put("q", StringUtils.join(mandatoryQ, " "));
96
		if (categoryIds != null && categoryIds.size() > 0) {
97
			params.put("q", params.get("q") + " +filter(categoryId_i:(" + StringUtils.join(categoryIds, " ") + "))");
98
		}
99
		if (brands.size() > 0) {
100
			brands = brands.stream().map(x -> x.replaceAll(" ", "\\\\ ")).collect(Collectors.toList());
101
			params.put("q", params.get("q") + " AND brand_ss:(" + StringUtils.join(brands, " ") + ")");
102
		}
103
		if (activeOnly) {
104
			params.put("q", params.get("q") + " AND active_b:true");
105
		}
106
		params.put("fl", "*");
107
		if (queryTerm == null) {
108
			params.put("sort", "create_s desc");
109
		}
110
		params.put("start", String.valueOf(0));
111
		if (limit == 0) {
112
			params.put("fl", "catalogId_i, title_s");
113
			params.put("rows", String.valueOf(5000));
114
		} else {
115
			params.put("rows", String.valueOf(limit));
116
		}
117
		params.put("wt", "json");
118
		String response;
119
		try {
120
			response = restClient.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
121
		} catch (HttpHostConnectException e) {
122
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
123
		}
124
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
125
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
126
		long numFound = solrResponseJSONObj.optLong("numFound", docs.length());
127
		return new ContentSearchResult(docs, numFound);
128
	}
129
 
130
	/** Wrapper for {@link #getContentWithTotal}. */
131
	public static class ContentSearchResult {
132
		private final JSONArray docs;
133
		private final long totalCount;
134
 
135
		public ContentSearchResult(JSONArray docs, long totalCount) {
136
			this.docs = docs;
137
			this.totalCount = totalCount;
138
		}
139
 
140
		public JSONArray getDocs() { return docs; }
141
		public long getTotalCount() { return totalCount; }
142
	}
143
 
26606 amit.gupta 144
	public Map<Integer, JSONObject> getContentByCatalogIds(List<Integer> catalogIds) throws Exception {
145
		Map<Integer, JSONObject> documentMap = new HashMap<>();
146
		Map<String, String> params = new HashMap<>();
147
		params.put("q", "catalogId_i:" + StringUtils.join(catalogIds, " "));
148
		params.put("fl", "*");
149
		params.put("start", String.valueOf(0));
28221 amit.gupta 150
		params.put("rows", String.valueOf(100));
26606 amit.gupta 151
		params.put("wt", "json");
152
		String response = null;
153
		try {
27030 amit.gupta 154
			response = restClient.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
26606 amit.gupta 155
		} catch (HttpHostConnectException e) {
156
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
157
		}
158
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
159
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
160
		for (int i = 0; i < docs.length(); i++) {
161
			JSONObject doc = docs.getJSONObject(i);
162
			documentMap.put(doc.getInt("catalogId_i"), doc);
163
		}
164
		return documentMap;
165
	}
28221 amit.gupta 166
 
28653 amit.gupta 167
	// This method is the used to pull docs based on search and shall be used
28221 amit.gupta 168
	// interchangably for both the things
33573 amit.gupta 169
	public JSONArray getSolrDocs(String queryTerm, String categoryId, int offset, int limit, String sort,
35369 ranu 170
			String brand, int subCategoryId, boolean hotDeal, boolean group, boolean eol_filter) throws Throwable {
27030 amit.gupta 171
		List<String> parentFilter = new ArrayList<>();
172
		parentFilter.add("categoryId_i:" + categoryId);
31596 amit.gupta 173
		parentFilter.add("show_default_b:true");
27030 amit.gupta 174
		List<String> childFilter = new ArrayList<>();
175
		childFilter.add("itemId_i:*");
176
 
177
		Map<String, String> params = new HashMap<>();
178
		if (queryTerm == null || queryTerm.equals("null")) {
179
			queryTerm = "";
180
		} else {
181
			queryTerm = "(" + queryTerm + ")";
182
		}
183
		if (hotDeal) {
184
			childFilter.add("hot_deal_b:true");
185
		} else {
186
			childFilter.add("active_b:true");
187
		}
188
		if (subCategoryId != 0) {
189
			parentFilter.add("subCategoryId_i:" + subCategoryId);
190
		}
35369 ranu 191
 
192
		if(eol_filter){
193
			parentFilter.add("eol_no_stock_b:false");
194
		}
27030 amit.gupta 195
		if (StringUtils.isNotBlank(brand)) {
27105 amit.gupta 196
			parentFilter.add("brand_ss:" + "\\\"" + brand + "\\\"");
27030 amit.gupta 197
		}
198
		if (queryTerm == "") {
28221 amit.gupta 199
			params.put("sort", (sort == "" ? "" : sort + ", ") + "create_s desc");
27030 amit.gupta 200
		} else {
201
			parentFilter.addAll(Arrays.asList(queryTerm.split(" ")));
202
		}
203
		String parentFilterString = "\"" + String.join(" AND ", parentFilter) + "\"";
204
		String childFilterString = String.join(" AND ", childFilter);
205
		params.put("q", String.format("{!parent which=%s}%s", parentFilterString, childFilterString));
206
		params.put("fl",
207
				String.format("*, [child parentFilter=id:catalog* childFilter=%s]", "\"" + childFilterString + "\""));
208
		params.put("start", String.valueOf(offset));
209
		params.put("rows", String.valueOf(limit));
210
		params.put("wt", "json");
34023 vikas.jang 211
 
212
		String groupByField = null;
213
 
214
		if (group) {
215
			groupByField = "superCatalog_s";
216
			params.put("group", String.valueOf(group));
217
			params.put("group.field", groupByField);
218
			params.put("group.limit", "1");
219
			if (!sort.isEmpty()) {
220
				params.put("group.sort", sort);
221
			}
222
		}
223
logger.info("groupByField {}", groupByField);
27030 amit.gupta 224
		String response = null;
34023 vikas.jang 225
 
27030 amit.gupta 226
		try {
227
			response = restClient.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
228
		} catch (HttpHostConnectException e) {
229
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
230
		}
28221 amit.gupta 231
 
34023 vikas.jang 232
		/*JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
233
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");*/
234
 
235
		JSONObject solrResponseJSONObj = new JSONObject(response);
236
		JSONArray docs;
237
 
238
		if (group) {
239
			logger.info("Reached in if condition {}",groupByField);
240
			JSONObject grouped = solrResponseJSONObj.getJSONObject("grouped");
241
			JSONArray groups = grouped.getJSONObject(groupByField).getJSONArray("groups");
242
 
243
			docs = new JSONArray();
244
			for (int i = 0; i < groups.length(); i++) {
245
				JSONObject groupObj = groups.getJSONObject(i);
246
				JSONArray groupDocs = groupObj.getJSONObject("doclist").getJSONArray("docs");
247
				for (int j = 0; j < groupDocs.length(); j++) {
248
					docs.put(groupDocs.getJSONObject(j));
249
				}
250
			}
251
		} else {
252
			logger.info("Reached in else condition {}",groupByField);
253
			docs = solrResponseJSONObj.getJSONObject("response").getJSONArray("docs");
254
		}
34187 vikas.jang 255
 
34186 vikas.jang 256
		logger.info("Reached at end {}",docs);
34023 vikas.jang 257
 
27030 amit.gupta 258
		return docs;
259
	}
260
 
22346 amit.gupta 261
}