Project

General

Profile

1
/**
2
 *
3
 */
4
package gr.uoa.di.web.utils.search;
5

    
6
import eu.dnetlib.api.data.PublisherService;
7
import eu.dnetlib.api.data.PublisherServiceException;
8
import eu.dnetlib.api.data.SearchService;
9
import eu.dnetlib.api.data.SearchServiceException;
10
import eu.dnetlib.domain.EPR;
11
import eu.dnetlib.domain.data.BrowseData;
12
import eu.dnetlib.domain.data.Document;
13
import eu.dnetlib.domain.functionality.LayoutField;
14
import gr.uoa.di.driver.data.browsedata.BrowseDataUtil;
15
import gr.uoa.di.driver.enabling.resultset.ResultSet;
16
import gr.uoa.di.driver.enabling.resultset.ResultSetFactory;
17
import gr.uoa.di.driver.util.ServiceLocator;
18
import gr.uoa.di.web.utils.search.browse.BrowseDataReader;
19
import gr.uoa.di.web.utils.search.query.QueryCollectionEnhancer;
20
import gr.uoa.di.web.utils.search.query.QueryEnhancer;
21
import org.apache.log4j.Logger;
22

    
23
import java.util.ArrayList;
24
import java.util.HashMap;
25
import java.util.List;
26
import java.util.Map;
27

    
28
/**
29
 * Manages all searches in the the web interface. All elements in query forms
30
 * are passed to the SearchManager and page results are retuned in a format that
31
 * is straightforward for jsp pages to render.
32
 * 
33
 * @author kiatrop
34
 */
35
public class SearchManager {
36
	public static Logger logger = Logger.getLogger(SearchManager.class);
37
	private static Logger tLogger = Logger.getLogger("gr.uoa.di.driver.web.interceptors.Timer");
38

    
39
	private CriteriaManager criteriaManager = null;
40
	private BrowseDataReader browseDataReader = null;
41
	private DocumentReader reader = null;
42
	private ResultSetFactory rsFactory = null;
43
	private String indexVersion = null;
44

    
45
	private ServiceLocator<SearchService> searchServiceLocator = null;
46
	private ServiceLocator<PublisherService> publisherServiceLocator = null;
47

    
48
	private QueryEnhancer enhancer = null;
49

    
50
	public ResultSetFactory getRsFactory() {
51
		return rsFactory;
52
	}
53

    
54
	public void setRsFactory(ResultSetFactory rsFactory) {
55
		this.rsFactory = rsFactory;
56
	}
57
	
58
	public DocumentPage search(String query, int pageSize, int pageNumber, String collectionId) throws SearchServiceException {
59
		query = enhanceWithCurrentCollection(query, collectionId);
60
		
61
		return this.search(query, pageSize, pageNumber);
62
	}
63

    
64
	/**
65
	 * Use an internal cache of the {@link #cacheSize} MRU query results. If the
66
	 * query result is invalidated (result set update fails) the query is
67
	 * resubmitted. The returned page points to the spacified <code>page</code>
68
	 * assuming <code>pageSize</code> documents per page.
69
	 * <p>
70
	 * NOTE: Cache only search query results -- never cache result set data!
71
	 * 
72
	 * @param query
73
	 *            The query to execute.
74
	 * @param pageSize
75
	 *            The number of documents in the page.
76
	 * @param page
77
	 *            The number of the page to return. First page is 1.
78
	 * @return The requested page.
79
	 * @throws SearchServiceException
80
	 */
81
	public DocumentPage search(String query, int pageSize, int pageNumber)
82
			throws SearchServiceException {
83
		tLogger.debug("Starting search");
84
		tLogger.debug("Enhancing query");
85
		query = enhancer.enhanceQuery(query);
86
		
87
		logger.debug("performing search with query = '" + query + "'");
88

    
89
		try {
90
			tLogger.debug("performing search");
91
			EPR epr = null;
92
            //getSearchServiceLocator().getService().search(query);
93
			tLogger.debug("Creating rs");
94
			ResultSet<String> rs = rsFactory.createResultSet(epr);
95

    
96
			// update page from result set
97
			tLogger.debug("Creating document page");
98
			DocumentPage page = new DocumentPage(rs, getReader(), pageSize, pageNumber);
99

    
100
			return page;
101
		} catch (RuntimeException re) {
102
			throw new SearchServiceException(
103
					"Error connecting to search service.", re);
104
		}
105
	}
106

    
107
	public BrowseData refine(String query, String collectionId, List<String> fields)
108
			throws SearchServiceException {
109
		tLogger.debug("Starting refine");
110
		tLogger.debug("Enhancing query");
111
		query = enhanceWithCurrentCollection(query, collectionId);
112
		
113
		logger.info("running refine query: '" + query + "' for fields: " + fields);
114
		tLogger.debug("performing refine");
115
		EPR epr = null;
116
		//searchServiceLocator.getService().refine(query, fields);
117
		tLogger.debug("Creating rs");
118
		ResultSet<String> rs = rsFactory.createResultSet(epr);
119

    
120
		if (logger.isDebugEnabled()) {
121
			logger.debug("EPR : " + epr.getEpr());
122
		}
123

    
124
		BrowseData data = new BrowseData();
125
		tLogger.debug("Getting " + (rs.size()) + " elements from rs");
126
		List<String> list = rs.getElements(1, rs.size());
127
		logger.debug("record list size " + list.size());
128
		
129
		tLogger.debug("Parsing browse data");
130
		if (indexVersion.toLowerCase().equals("new")) {
131
			for (int i = 0; i < list.size(); i++) {
132
				String record = list.get(i);
133
				if (record == null || record.trim().equals("")) {
134
					continue;
135
				}
136
				
137
				data.append(BrowseDataUtil.parseRows(record));
138
			}
139
			
140
		} else if (indexVersion.toLowerCase().equals("old")) {
141
			for (int i = 0; i < list.size(); i++) {
142
				String record = list.get(i);
143
				if (record == null || record.trim().equals("")) {
144
					continue;
145
				}
146

    
147
				int count = BrowseDataUtil.parseCount(record);
148
				String field = BrowseDataUtil.parseField(record);
149
				String value = BrowseDataUtil.parseValue(record);
150
	
151
				data.addFieldEntry(field, value, count);
152
			}
153
		}
154
		
155
		return this.browseDataReader.read(data);
156
	}
157
	
158
	private String enhanceWithCurrentCollection(String query,
159
			String collectionId) {
160
		
161
		if (collectionId!= null && !collectionId.isEmpty() && enhancer instanceof QueryCollectionEnhancer) {
162
			if (!((QueryCollectionEnhancer) enhancer).getCollectionIds().contains(collectionId)) {
163
				QueryCollectionEnhancer collectionEnhancer = new QueryCollectionEnhancer();
164
				collectionEnhancer.setCollectionIds(new ArrayList<String>());
165
				collectionEnhancer.addCollectionId(collectionId);
166
				query = collectionEnhancer.enhanceQuery(query);
167
			}
168
		}
169
		return query;
170
	}
171

    
172
	public BrowseData browse(String prefix, String field)
173
			throws SearchServiceException {
174
		logger.info("running browse query for field " + field);
175
		BrowseData data = null;
176
		//searchServiceLocator.getService().browse(prefix,field);
177
			
178
		return this.browseDataReader.read(data);
179

    
180
	}
181

    
182
	protected DocumentReader getReader() throws SearchServiceException {
183
		if (reader == null) {
184
			LayoutManager lm = criteriaManager.getLayoutManager();
185
			// use all index fields
186
			List<LayoutField> fields = lm.getIndexLayoutManager()
187
					.getResultFields();
188

    
189
			// map index field names to searchable names
190
			Map<String, String> nameMap = new HashMap<String, String>();
191
			for (LayoutField field : fields) {
192
				String name = field.getName();
193
				nameMap.put(name, lm.getNameFromIndexType(name));
194
			}
195

    
196
			// hardcoded header searchables -- not part of index layout
197
			LayoutField idField = new LayoutField();
198
			idField.setIndexable(false);
199
			idField.setName("id");
200
			idField.setResult(true);
201
			idField.setStat(false);
202
			idField.setTokenizable(false);
203
			idField.setType("objIdentifier");
204
			idField.setXpath("//dri:objIdentifier");
205
			fields.add(idField);
206
			LayoutField dateField = new LayoutField();
207
			dateField.setIndexable(false);
208
			dateField.setName("dateCollected");
209
			dateField.setResult(true);
210
			dateField.setStat(false);
211
			dateField.setTokenizable(false);
212
			dateField.setType("dateOfCollection");
213
			dateField.setXpath("//dri:dateOfCollection");
214
			fields.add(dateField);
215

    
216
			//logger.debug("vocabulary map: " + vocabularyMap.keySet());
217
			reader = new DocumentReader(fields, nameMap);
218
		}
219
		
220
		return reader;
221
	}
222

    
223
	public Document retrieveDocument(String id) throws SearchServiceException {
224
		try {
225
			PublisherService publisher = getPublisherServiceLocator()
226
					.getService();
227
			return getReader().read(publisher.getResourceById(id, "DMF"));
228

    
229
		} catch (Throwable t) {
230
			throw new SearchServiceException(
231
					"Cannot retrieve document with id: " + id, t);
232
		}
233
	}
234

    
235
	public List<Document> retrieveDocuments(List<String> ids)
236
			throws SearchServiceException {
237
		List<Document> documents = new ArrayList<Document>();
238
		PublisherService publisher = getPublisherServiceLocator().getService();
239

    
240
		for (String id : ids) {
241
			try {
242
				String xmlDoc = publisher.getResourceById(id, "DMF");
243
				if (xmlDoc != null)
244
					documents.add(getReader().read(xmlDoc));
245
				else 
246
					logger.warn("Document " + id + " not found in publisher");
247
			} catch (Exception t) {
248
				throw new SearchServiceException("Cannot retrieve document with id: " + id, t);
249
			}
250
		}
251
		
252
		return documents;
253
	}
254

    
255
	public DocumentPage retrieveDocuments(String id, List<String> ids,
256
			int page, int size) throws PublisherServiceException, SearchServiceException {
257

    
258
		if(ids==null || ids.isEmpty()){
259
			return DocumentPage.EMPTY_PAGE;
260
		}
261
		
262
		PublisherService publisher = getPublisherServiceLocator().getService();
263
		EPR epr = publisher.getResourcesByIds(ids, "DMF");
264
		ResultSet<String> rs = rsFactory.createResultSet(epr);
265

    
266
		if (logger.isDebugEnabled()) {
267
			logger.debug("EPR : " + epr.getEpr());
268
		}
269

    
270
		DocumentPage documentPage = 
271
			new DocumentPage(rs, getReader(), size, page);
272

    
273
		return documentPage;
274
	}
275

    
276
	@Deprecated
277
	public int getCacheSize() {
278
		return 0;
279
	}
280

    
281
	@Deprecated
282
	public void setCacheSize(int cacheSize) {
283
	}
284

    
285
	public CriteriaManager getCriteriaManager() {
286
		return criteriaManager;
287
	}
288

    
289
	public void setCriteriaManager(CriteriaManager criteriaManager) {
290
		this.criteriaManager = criteriaManager;
291
	}
292

    
293
	@Deprecated
294
	public boolean isEnableQueryCache() {
295
		return false;
296
	}
297

    
298
	@Deprecated
299
	public void setEnableQueryCache(boolean enableQueryCache) {
300
	}
301

    
302
	public String getIndexVersion() {
303
		return indexVersion;
304
	}
305

    
306
	public void setIndexVersion(String indexVersion) {
307
		this.indexVersion = indexVersion;
308
	}
309
	
310
	public BrowseDataReader getBrowseDataReader() {
311
		return browseDataReader;
312
	}
313

    
314
	public void setBrowseDataReader(BrowseDataReader browseDataReader) {
315
		this.browseDataReader = browseDataReader;
316
	}
317

    
318
	public ServiceLocator<PublisherService> getPublisherServiceLocator() {
319
		return publisherServiceLocator;
320
	}
321

    
322
	public void setPublisherServiceLocator(
323
			ServiceLocator<PublisherService> publisherServiceLocator) {
324
		this.publisherServiceLocator = publisherServiceLocator;
325
	}
326

    
327
	public ServiceLocator<SearchService> getSearchServiceLocator() {
328
		return searchServiceLocator;
329
	}
330

    
331
	public void setSearchServiceLocator(
332
			ServiceLocator<SearchService> searchServiceLocator) {
333
		this.searchServiceLocator = searchServiceLocator;
334
	}
335

    
336
	public QueryEnhancer getEnhancer() {
337
		return enhancer;
338
	}
339

    
340
	public void setEnhancer(QueryEnhancer enhancer) {
341
		this.enhancer = enhancer;
342
	}
343
}
(8-8/9)