001package org.kuali.ole.docstore.discovery.service;
002
003import org.apache.commons.lang.StringUtils;
004import org.apache.solr.client.solrj.SolrQuery;
005import org.apache.solr.client.solrj.SolrServer;
006import org.apache.solr.client.solrj.SolrServerException;
007import org.apache.solr.client.solrj.impl.HttpSolrServer;
008import org.apache.solr.client.solrj.response.QueryResponse;
009import org.apache.solr.common.SolrDocument;
010import org.apache.solr.common.SolrDocumentList;
011import org.kuali.ole.docstore.discovery.model.CallNumberBrowseParams;
012import org.kuali.ole.docstore.discovery.model.SearchCondition;
013import org.kuali.ole.docstore.discovery.model.SearchParams;
014import org.kuali.ole.docstore.discovery.solr.work.bib.WorkBibCommonFields;
015import org.kuali.ole.docstore.model.bo.*;
016import org.kuali.ole.docstore.model.enums.DocType;
017import org.kuali.ole.pojo.OLESerialReceivingRecord;
018import org.kuali.ole.utility.callnumber.CallNumber;
019import org.kuali.ole.utility.callnumber.CallNumberFactory;
020import org.kuali.rice.core.api.config.property.ConfigContext;
021import org.slf4j.Logger;
022import org.slf4j.LoggerFactory;
023
024import java.io.IOException;
025import java.text.CharacterIterator;
026import java.text.Format;
027import java.text.SimpleDateFormat;
028import java.text.StringCharacterIterator;
029import java.util.ArrayList;
030import java.util.Collection;
031import java.util.Date;
032import java.util.HashMap;
033import java.util.Iterator;
034import java.util.LinkedHashMap;
035import java.util.List;
036import java.util.Map;
037import java.util.Set;
038
039/**
040 * User: tirumalesh.b
041 * Date: 16/1/12 Time: 12:49 PM
042 */
043public class QueryServiceImpl
044        implements QueryService {
045    private static final Logger LOG = LoggerFactory.getLogger(QueryServiceImpl.class);
046    private static QueryService queryService = null;
047    private static String docSearchUrl = null;
048    private final String INSTANCE_IDENTIFIER = "instanceIdentifier";
049    private final String BIBLIOGRAPHIC = "bibliographic";
050    private final String DOC_TYPE = "DocType";
051    private final String DOC_FORMAT = "DocFormat";
052    private final String HOLDINGS_IDENTIFIER = "holdingsIdentifier";
053    private final String ITEM_IDENTIFIER = "itemIdentifier";
054    private final String INSTANCE = "instance";
055    private final String OLEML = "oleml";
056    private final String DELETE_WITH_LINKED_DOCS = "deleteWithLinkedDocs";
057    private final String DELETE = "delete";
058
059    private QueryServiceImpl() {
060        init();
061    }
062
063    public static QueryService getInstance() {
064        if (null == queryService) {
065            queryService = new QueryServiceImpl();
066        }
067        return queryService;
068    }
069
070    protected void init() {
071        LOG.debug("QueryServiceImpl init ");
072        if(ConfigContext.getCurrentContextConfig()!=null){
073            docSearchUrl = ConfigContext.getCurrentContextConfig().getProperty("docSearchURL");
074            if ((null != docSearchUrl) && !docSearchUrl.endsWith("/")) {
075                docSearchUrl = docSearchUrl + "/";
076            }
077        }
078
079    }
080
081    @Override
082    public List<OleDocument> queryForDocs(OleDocument queryDoc) throws Exception {
083        List<OleDocument> oleDocuments;
084        List<Map<String, Object>> solrHits;
085        String queryString = buildQueryForDoc(queryDoc);
086        solrHits = getSolrHitsForQuery(queryString);
087        oleDocuments = buildOleDocuments(solrHits);
088        return oleDocuments;
089    }
090
091    private List<Map<String, Object>> getSolrHits(SearchParams searchParams) throws Exception {
092        List<Map<String, Object>> solrHits;
093        String queryString = buildQuery(searchParams);
094        solrHits = getSolrHitsForQuery(queryString);
095        return solrHits;
096    }
097
098    /**
099     * To get the records from solr
100     * @param searchParams
101     * @return solrHits
102     * @throws Exception
103     */
104    private List<Map<String, Object>> getSolrHitsWithParams(SearchParams searchParams) throws Exception {
105        int totalRecords = 0;
106        List<Map<String, Object>> solrHits;
107        StringBuffer initialQuery = new StringBuffer();
108        buildInitialQuery(initialQuery, searchParams);
109        if(StringUtils.isNotEmpty(searchParams.getSortField()) && StringUtils.isNotEmpty(searchParams.getSortOrder())) {
110            buildSortQuery(initialQuery , searchParams);
111        }
112        totalRecords = getSolrHitsForQueryParams(initialQuery.toString());
113        LOG.info("Total Records count:" + totalRecords);
114        searchParams.setTotalRecCount(totalRecords);
115        searchParams.setSearchQuery(initialQuery.toString());
116        solrHits = getSolrHitsForQueryParams(searchParams);
117        return solrHits;
118    }
119
120    /**
121     * prepare the sort solr query based on sortFiled and sortOrder type in search params
122     * @param solrQuery , searchParams
123     * @return
124     */
125    private void buildSortQuery(StringBuffer solrQuery , SearchParams searchParams) {
126        String sortField = getSortField(searchParams.getSortField());
127        String sortOrder = searchParams.getSortOrder();
128        if(StringUtils.isNotEmpty(sortField))  {
129            solrQuery.append("&sort="+sortField+" "+sortOrder);
130        }
131    }
132
133    /**
134     * return the sort filed according to docstore
135     * @param sortField
136     * @return
137     */
138    private String getSortField(String sortField) {
139
140        if("Title".equals(sortField)) {
141            return "Title_sort";
142        }else  if("Author".equals(sortField)) {
143            return "Author_sort";
144        }else  if("Publication Date".equals(sortField)) {
145            return "PublicationDate_sort";
146        } else  if("Location".equals(sortField)) {
147            return "Location_sort";
148        }else  if("Call Number".equals(sortField)) {
149            return "CallNumber_sort";
150        }
151        return null;
152
153    }
154
155    @Override
156    public List<WorkBibDocument> getBibDocuments(SearchParams searchParams) throws Exception {
157        List<WorkBibDocument> workBibDocuments;
158        List<Map<String, Object>> solrHits = getSolrHitsWithParams(searchParams);
159        workBibDocuments = buildWorkBibDocuments(solrHits);
160        return workBibDocuments;
161    }
162
163    @Override
164    public List<WorkHoldingsDocument> getHoldingDocuments(SearchParams searchParams) throws Exception {
165        List<WorkHoldingsDocument> workHoldingsDocuments;
166        List<Map<String, Object>> solrHits = getSolrHitsWithParams(searchParams);
167        workHoldingsDocuments = buildWorkHoldingDocuments(solrHits);
168        // Set bibTitle and showBibMessage for HoldingsDocument
169        for (WorkHoldingsDocument workHoldingsDocument : workHoldingsDocuments) {
170            if(workHoldingsDocument.getBibIdentifier() != null){
171                WorkBibDocument workBibDocument = new WorkBibDocument();
172                workBibDocument.setId(workHoldingsDocument.getBibIdentifier());
173                workBibDocument = buildBibDocumentInfo(workBibDocument);
174                workHoldingsDocument.setBibUUIDList(queryService.queryForBibs(workHoldingsDocument.getInstanceIdentifier()));
175                String showBibMessage = getLinkedBibCount(workHoldingsDocument.getBibUUIDList());
176                workHoldingsDocument.setBibTitle(workBibDocument.getTitle());
177                workHoldingsDocument.setLinkedBibCount(showBibMessage);
178            }
179
180        }
181        return workHoldingsDocuments;
182    }
183
184    @Override
185    public List<OLESerialReceivingRecord> getOleSerialReceivingRecords(SearchParams searchParams) throws Exception {
186        List<OLESerialReceivingRecord> oleSerialReceivingRecordList;
187        List<Map<String, Object>> solrHits = getSolrHits(searchParams);
188        oleSerialReceivingRecordList = buildOleSerialReceivingRecords(solrHits);
189        return oleSerialReceivingRecordList;
190    }
191
192    @Override
193    public List<WorkItemDocument> getItemDocuments(SearchParams searchParams) throws Exception {
194        List<WorkItemDocument> workItemDocuments;
195        List<Map<String, Object>> solrHits = getSolrHitsWithParams(searchParams);
196        workItemDocuments = buildWorkItemDocuments(solrHits);
197        // Set bibTitle and showBibMessage for ItemDocument
198        for (WorkItemDocument workItemDocument : workItemDocuments) {
199            if(workItemDocument.getBibIdentifier() != null) {
200                WorkBibDocument workBibDocument = new WorkBibDocument();
201                workBibDocument.setId(workItemDocument.getBibIdentifier());
202                workBibDocument = buildBibDocumentInfo(workBibDocument);
203                workItemDocument.setBibUUIDList(queryService.queryForBibs(workItemDocument.getInstanceIdentifier()));
204                String linkedBibCount = getLinkedBibCount(workItemDocument.getBibUUIDList());
205                workItemDocument.setBibTitle(workBibDocument.getTitle());
206                workItemDocument.setLinkedBibCount(linkedBibCount);
207            }
208        }
209        return workItemDocuments;
210    }
211
212
213    /**
214     *  Get List of records from solr after click next or previous
215     * @param searchParams
216     * @return List Of Documents
217     * @throws Exception
218     * */
219    @Override
220    public List getDocuments(SearchParams searchParams) {
221        List<WorkItemDocument> workItemDocumentList = null;
222        List<WorkHoldingsDocument> workHoldingsDocumentList = null;
223        List<WorkBibDocument> workBibDocumentList = null;
224        List<WorkEHoldingsDocument> workEHoldingsDocumentList = null;
225
226        try {
227            if (searchParams.getDocType().equalsIgnoreCase("item")) {
228                workItemDocumentList = getItemDocuments(searchParams);
229                return workItemDocumentList;
230            } else if (searchParams.getDocType().equalsIgnoreCase("holdings")) {
231                workHoldingsDocumentList = getHoldingDocuments(searchParams);
232                return workHoldingsDocumentList;
233            } else if (searchParams.getDocType().equalsIgnoreCase("bibliographic")) {
234                workBibDocumentList = getBibDocuments(searchParams);
235                return workBibDocumentList;
236            } else if (searchParams.getDocType().equalsIgnoreCase("eholdings")) {
237                workEHoldingsDocumentList = getEHoldingsDocuments(searchParams);
238                return workEHoldingsDocumentList;
239            }
240        } catch (Exception e) {
241            LOG.info("Exception in DocumentSearch " + e);
242        }
243        return null;
244
245    }
246
247
248    @Override
249    public String queryField(SearchParams searchParams, String fieldName) throws Exception {
250        SolrQuery solrQuery = new SolrQuery();
251        SolrServer server = SolrServerManager.getInstance().getSolrServer();
252        String query = ServiceLocator.getDiscoveryService().buildQuery(searchParams);
253        int i = query.indexOf("=");
254        String query1 = query.substring(i + 1);
255        solrQuery.setQuery(query1);
256        solrQuery.setStart(1);
257        solrQuery.setRows(100);
258        QueryResponse response = server.query(solrQuery);
259        return getFieldValue(response, fieldName);
260    }
261
262    public String getFieldValue(QueryResponse response, String fieldName) {
263        String result = null;
264        SolrDocumentList docs = response.getResults();
265        if (docs != null) {
266            SolrDocument doc = docs.get(0);
267            result = (String) doc.getFieldValue(fieldName);
268        }
269        return result;
270    }
271
272    /**
273     * @param hitsOnPage
274     * @return List of OleDocuments
275     */
276    public List<OLESerialReceivingRecord> buildOleSerialReceivingRecords(List<Map<String, Object>> hitsOnPage) throws SolrServerException {
277        List<OLESerialReceivingRecord> oleSerialReceivingRecordList = new ArrayList<OLESerialReceivingRecord>();
278        for (Map<String, Object> hitsOnPageItr : hitsOnPage) {
279            OLESerialReceivingRecord oleSerialReceivingRecord = new OLESerialReceivingRecord();
280            Map map = hitsOnPageItr;
281            Set keys = map.keySet();
282            for (Object key : keys) {
283                if (key.toString().equalsIgnoreCase("Title_display")) {
284                    Object value = map.get(key);
285                    if (value instanceof String) {
286                        oleSerialReceivingRecord.setTitle((String) value);
287                    }
288                }
289                if (key.toString().equalsIgnoreCase("CallNumber_display")) {
290                    Object value = map.get(key);
291                    if (value instanceof String) {
292                        oleSerialReceivingRecord.setCallNumber((String) value);
293                    }
294                }
295                if (key.toString().equalsIgnoreCase("ISSN_display")) {
296                    Object value = map.get(key);
297                    if (value instanceof String) {
298                        oleSerialReceivingRecord.setIssn((String) value);
299                    }
300                }
301
302                if (key.toString().equalsIgnoreCase("id")) {
303                    Object value = map.get(key);
304                    if (value instanceof String) {
305                        oleSerialReceivingRecord.setBibId((String) value);
306                    }
307                }
308
309                if (key.toString().equalsIgnoreCase("instanceIdentifier")) {
310                    Object value = map.get(key);
311                    if (value instanceof String) {
312                        WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
313                        workInstanceDocument.setId(value.toString());
314                        workInstanceDocument =  queryForInstanceTree(workInstanceDocument);
315                        String callNumber = workInstanceDocument!=null && workInstanceDocument.getHoldingsDocument()!=null ?
316                                workInstanceDocument.getHoldingsDocument().getCallNumber():null;
317                        String location = workInstanceDocument!=null && workInstanceDocument.getHoldingsDocument()!=null ?
318                                workInstanceDocument.getHoldingsDocument().getLocationName():null;
319                        oleSerialReceivingRecord.setInstanceId((String) value);
320                        oleSerialReceivingRecord.setCallNumber(callNumber);
321                        oleSerialReceivingRecord.setBoundLocation(location);
322                        oleSerialReceivingRecordList.add(oleSerialReceivingRecord);
323                    } else if (value instanceof List) {
324                        ArrayList<String> list = (ArrayList<String>) value;
325                        for (String str : list) {
326                            WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
327                            workInstanceDocument.setId(str);
328                            workInstanceDocument =  queryForInstanceTree(workInstanceDocument);
329                            String callNumber = workInstanceDocument!=null && workInstanceDocument.getHoldingsDocument()!=null ?
330                                    workInstanceDocument.getHoldingsDocument().getCallNumber():null;
331                            String location = workInstanceDocument!=null && workInstanceDocument.getHoldingsDocument()!=null ?
332                                    workInstanceDocument.getHoldingsDocument().getLocationName():null;
333                            OLESerialReceivingRecord oleSerialReceiving_Record = new OLESerialReceivingRecord();
334                            oleSerialReceiving_Record.setBibId(oleSerialReceivingRecord.getBibId());
335                            oleSerialReceiving_Record.setTitle(oleSerialReceivingRecord.getTitle());
336                            oleSerialReceiving_Record.setCallNumber(callNumber);
337                            oleSerialReceiving_Record.setIssn(oleSerialReceivingRecord.getIssn());
338                            oleSerialReceiving_Record.setInstanceId(str);
339                            oleSerialReceiving_Record.setBoundLocation(location);
340                            oleSerialReceivingRecordList.add(oleSerialReceiving_Record);
341                        }
342
343                    }
344                }
345
346
347            }
348
349        }
350        return oleSerialReceivingRecordList;
351    }
352
353    /**
354     * @param hitsOnPage
355     * @return List of OleDocuments
356     */
357    public List<OleDocument> buildOleDocuments(List<Map<String, Object>> hitsOnPage) {
358        List<OleDocument> oleDocuments = new ArrayList<OleDocument>();
359        for (Map<String, Object> hitsOnPageItr : hitsOnPage) {
360            WorkBibDocument workBibDocument = new WorkBibDocument();
361            Map map = hitsOnPageItr;
362            Set keys = map.keySet();
363            for (Object key : keys) {
364                if (key.toString().equalsIgnoreCase("Title_display")) {
365                    Object value = map.get(key);
366                    if (value instanceof String) {
367                        workBibDocument.setTitle((String) value);
368                    } else if (value instanceof List) {
369                        workBibDocument.setTitles((List<String>) value);
370                    }
371                }
372
373                if (key.toString().equalsIgnoreCase("Author_display")) {
374                    Object value = map.get(key);
375                    if (value instanceof String) {
376                        workBibDocument.setAuthor((String) value);
377                    } else if (value instanceof List) {
378                        workBibDocument.setAuthors((List<String>) value);
379                    }
380                }
381
382                if (key.toString().equalsIgnoreCase("PublicationDate_display")) {
383                    Object value = map.get(key);
384                    if (value instanceof String) {
385                        workBibDocument.setPublicationDate((String) value);
386                    } else if (value instanceof List) {
387                        workBibDocument.setPublicationDates((List<String>) value);
388                    }
389                }
390
391                if (key.toString().equalsIgnoreCase("ISBN_display")) {
392                    Object value = map.get(key);
393                    if (value instanceof String) {
394                        workBibDocument.setIsbn((String) value);
395                    } else if (value instanceof List) {
396                        workBibDocument.setIsbns((List<String>) value);
397                    }
398                }
399
400                if (key.toString().equalsIgnoreCase("Publisher_display")) {
401                    Object value = map.get(key);
402                    if (value instanceof String) {
403                        workBibDocument.setPublisher((String) value);
404                    } else if (value instanceof List) {
405                        workBibDocument.setPublishers((List<String>) value);
406                    }
407                }
408                if (key.toString().equalsIgnoreCase("id")) {
409                    workBibDocument.setId((String) map.get(key));
410                }
411                if (key.toString().equalsIgnoreCase("bibIdentifier")) {
412                    workBibDocument.setId((String) map.get(key));
413                }
414
415            }
416            oleDocuments.add(workBibDocument);
417        }
418        return oleDocuments;
419    }
420
421    /**
422     * @param hitsOnPage
423     * @return List of workBibDocuments
424     */
425    public List<WorkBibDocument> buildWorkBibDocuments(List<Map<String, Object>> hitsOnPage) {
426        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
427        for (Map<String, Object> hitsOnPageItr : hitsOnPage) {
428            WorkBibDocument workBibDocument = new WorkBibDocument();
429            Map map = hitsOnPageItr;
430            Set keys = map.keySet();
431            for (Object key : keys) {
432
433                if (key.toString().equalsIgnoreCase("LocalId_display")) {
434                    Object value = map.get(key);
435                    if (value instanceof String) {
436                        workBibDocument.setLocalIds((String) value);
437                    } else if (value instanceof List) {
438                        workBibDocument.setLocalId((List<String>) value);
439                    }
440                }
441                if (key.toString().equalsIgnoreCase("Title_display")) {
442                    Object value = map.get(key);
443                    if (value instanceof String) {
444                        workBibDocument.setTitle((String) value);
445                    } else if (value instanceof List) {
446                        workBibDocument.setTitles((List<String>) value);
447                    }
448                }
449
450                if (key.toString().equalsIgnoreCase("Author_display")) {
451                    Object value = map.get(key);
452                    if (value instanceof String) {
453                        workBibDocument.setAuthor((String) value);
454                    } else if (value instanceof List) {
455                        workBibDocument.setAuthors((List<String>) value);
456                    }
457                }
458
459                if (key.toString().equalsIgnoreCase("PublicationDate_display")) {
460                    Object value = map.get(key);
461                    if (value instanceof String) {
462                        workBibDocument.setPublicationDate((String) value);
463                    } else if (value instanceof List) {
464                        workBibDocument.setPublicationDates((List<String>) value);
465                    }
466                }
467
468                if (key.toString().equalsIgnoreCase("ISBN_display")) {
469                    Object value = map.get(key);
470                    if (value instanceof String) {
471                        workBibDocument.setIsbn((String) value);
472                    } else if (value instanceof List) {
473                        workBibDocument.setIsbns((List<String>) value);
474                    }
475                }
476
477                if (key.toString().equalsIgnoreCase("Publisher_display")) {
478                    Object value = map.get(key);
479                    if (value instanceof String) {
480                        workBibDocument.setPublisher((String) value);
481                    } else if (value instanceof List) {
482                        workBibDocument.setPublishers((List<String>) value);
483                    }
484                }
485
486                if (key.toString().equalsIgnoreCase("instanceIdentifier")) {
487                    Object value = map.get(key);
488                    if (value instanceof String) {
489                        workBibDocument.setInstanceIdentifier((String) value);
490                    } else if (value instanceof List) {
491                        ArrayList<String> list = (ArrayList<String>) value;
492                        workBibDocument.setInstanceIdentifier(list.get(0));
493                    }
494                }
495
496                if (key.toString().equalsIgnoreCase("DocFormat")) {
497                    Object value = map.get(key);
498                    if (value instanceof String) {
499                        workBibDocument.setDocFormat((String) value);
500                    } else if (value instanceof List) {
501                        ArrayList<String> list = (ArrayList<String>) value;
502                        workBibDocument.setDocFormat(list.get(0));
503                    }
504                }
505
506                if (key.toString().equalsIgnoreCase("staffOnlyFlag")) {
507                    Object value = map.get(key);
508                    if (value instanceof String) {
509                        workBibDocument.setStaffOnlyFlag((String) value);
510                    } else if (value instanceof List) {
511                        ArrayList<String> list = (ArrayList<String>) value;
512                        workBibDocument.setStaffOnlyFlag(list.get(0));
513                    }
514                }
515
516                if (key.toString().equalsIgnoreCase("id")) {
517                    workBibDocument.setId((String) map.get(key));
518                }
519
520            }
521            workBibDocuments.add(workBibDocument);
522        }
523        return workBibDocuments;
524    }
525
526    /**
527     * @param hitsOnPage
528     * @return List of workHoldingsDocuments
529     */
530    public List<WorkHoldingsDocument> buildWorkHoldingDocuments(List<Map<String, Object>> hitsOnPage) {
531        List<WorkHoldingsDocument> workHoldingsDocuments = new ArrayList<WorkHoldingsDocument>();
532        for (Map<String, Object> hitsOnPageItr : hitsOnPage) {
533            WorkHoldingsDocument workHoldingsDocument = new WorkHoldingsDocument();
534            Map map = hitsOnPageItr;
535            if (map.get("DocType").equals("holdings")) {
536                Set keys = map.keySet();
537                for (Object key : keys) {
538                    if (key.toString().equalsIgnoreCase("LocalId_display")) {
539                        Object value = map.get(key);
540                        if (value instanceof String) {
541                            workHoldingsDocument.setLocalId((String) value);
542                        }
543                    }
544                    if (key.toString().equalsIgnoreCase("Location_display")) {
545                        Object value = map.get(key);
546                        if (value instanceof String) {
547                            workHoldingsDocument.setLocationName((String) value);
548                        }
549                    }
550                    if (key.toString().equalsIgnoreCase("CallNumber_display")) {
551                        Object value = map.get(key);
552                        if (value instanceof String) {
553                            workHoldingsDocument.setCallNumber((String) value);
554                        }
555                    }
556                    if (key.toString().equalsIgnoreCase("id")) {
557                        workHoldingsDocument.setHoldingsIdentifier((String) map.get(key));
558                    }
559                    if (key.toString().equalsIgnoreCase("bibIdentifier")) {
560                        Object value = map.get(key);
561                        if (value instanceof String) {
562                            workHoldingsDocument.setBibIdentifier((String) value);
563                        } else if (value instanceof List) {
564                            ArrayList<String> list = (ArrayList<String>) value;
565                            workHoldingsDocument.setBibIdentifier(list.get(0));
566                        }
567                    }
568                    if (key.toString().equalsIgnoreCase("instanceIdentifier")) {
569                        Object value = map.get(key);
570                        if (value instanceof String) {
571                            workHoldingsDocument.setInstanceIdentifier((String) value);
572                        } else if (value instanceof List) {
573                            ArrayList<String> list = (ArrayList<String>) value;
574                            workHoldingsDocument.setInstanceIdentifier(list.get(0));
575                        }
576                    }
577                    if (key.toString().equalsIgnoreCase("staffOnlyFlag")) {
578                        Object value = map.get(key);
579                        if (value instanceof String) {
580                            workHoldingsDocument.setStaffOnlyFlag((String) value);
581                        } else if (value instanceof List) {
582                            ArrayList<String> list = (ArrayList<String>) value;
583                            workHoldingsDocument.setStaffOnlyFlag(list.get(0));
584
585                        }
586                    }
587                }
588                workHoldingsDocuments.add(workHoldingsDocument);
589            }
590        }
591        return workHoldingsDocuments;
592    }
593
594    /**
595     * @param hitsOnPage
596     * @return List of workItemDocuments
597     */
598    public List<WorkItemDocument> buildWorkItemDocuments(List<Map<String, Object>> hitsOnPage) {
599        List<WorkItemDocument> workItemDocuments = new ArrayList<WorkItemDocument>();
600        for (Map<String, Object> hitsOnPageItr : hitsOnPage) {
601            WorkItemDocument workItemDocument = new WorkItemDocument();
602            Map map = hitsOnPageItr;
603            Set keys = map.keySet();
604            for (Object key : keys) {
605                if (key.toString().equalsIgnoreCase("LocalId_display")) {
606                    Object value = map.get(key);
607                    if (value instanceof String) {
608                        workItemDocument.setLocalId((String) value);
609                    }
610                }
611                if (key.toString().equalsIgnoreCase("Location_display")) {
612                    Object value = map.get(key);
613                    if (value instanceof String) {
614                        workItemDocument.setLocation((String) value);
615                    } else if (value instanceof List) {
616                        ArrayList<String> list = (ArrayList<String>) value;
617                        workItemDocument.setLocation(list.get(0));
618                    }
619                }
620                if (key.toString().equalsIgnoreCase("CallNumber_display")) {
621                    Object value = map.get(key);
622                    if (value instanceof String) {
623                        workItemDocument.setCallNumber((String) value);
624                    } else if (value instanceof List) {
625                        ArrayList<String> list = (ArrayList<String>) value;
626                        workItemDocument.setCallNumber(list.get(0));
627                    }
628                }
629                if (key.toString().equalsIgnoreCase("ItemBarcode_display")) {
630                    Object value = map.get(key);
631                    if (value instanceof String) {
632                        workItemDocument.setBarcode((String) value);
633                    } else if (value instanceof List) {
634                        ArrayList<String> list = (ArrayList<String>) value;
635                        workItemDocument.setBarcode(list.get(0));
636                    }
637                }
638                if (key.toString().equalsIgnoreCase("ShelvingOrder_display")) {
639                    Object value = map.get(key);
640                    if (value instanceof String) {
641                        workItemDocument.setShelvingOrder((String) value);
642                    } else if (value instanceof List) {
643                        ArrayList<String> list = (ArrayList<String>) value;
644                        workItemDocument.setShelvingOrder(list.get(0));
645                    }
646                }
647                if (key.toString().equalsIgnoreCase("Enumeration_display")) {
648                    Object value = map.get(key);
649                    if (value instanceof String) {
650                        workItemDocument.setEnumeration((String) value);
651                    } else if (value instanceof List) {
652                        ArrayList<String> list = (ArrayList<String>) value;
653                        workItemDocument.setEnumeration(list.get(0));
654                    }
655                }
656                if (key.toString().equalsIgnoreCase("Chronology_display")) {
657                    Object value = map.get(key);
658                    if (value instanceof String) {
659                        workItemDocument.setChronology((String) value);
660                    } else if (value instanceof List) {
661                        ArrayList<String> list = (ArrayList<String>) value;
662                        workItemDocument.setChronology(list.get(0));
663                    }
664                }
665                if (key.toString().equalsIgnoreCase("CopyNumber_display")) {
666                    Object value = map.get(key);
667                    if (value instanceof String) {
668                        workItemDocument.setCopyNumber((String) value);
669                    } else if (value instanceof List) {
670                        ArrayList<String> list = (ArrayList<String>) value;
671                        workItemDocument.setCopyNumber(list.get(0));
672                    }
673                }
674
675                if (key.toString().equalsIgnoreCase("bibIdentifier")) {
676                    Object value = map.get(key);
677                    if (value instanceof String) {
678                        workItemDocument.setBibIdentifier((String) value);
679                    } else if (value instanceof List) {
680                        ArrayList<String> list = (ArrayList<String>) value;
681                        workItemDocument.setBibIdentifier(list.get(0));
682                    }
683                }
684
685                if (key.toString().equalsIgnoreCase("id")) {
686                    workItemDocument.setId((String) map.get(key));
687                }
688
689                if (key.toString().equalsIgnoreCase("id")) {
690                    workItemDocument.setItemIdentifier((String) map.get(key));
691                }
692
693                if (key.toString().equalsIgnoreCase("instanceIdentifier")) {
694                    Object value = map.get(key);
695                    if (value instanceof String) {
696                        workItemDocument.setInstanceIdentifier((String) value);
697                    } else if (value instanceof List) {
698                        ArrayList<String> list = (ArrayList<String>) value;
699                        workItemDocument.setInstanceIdentifier(list.get(0));
700                    }
701                }
702
703                if (key.toString().equalsIgnoreCase("staffOnlyFlag")) {
704                    Object value = map.get(key);
705                    if (value instanceof String) {
706                        workItemDocument.setStaffOnlyFlag((String) value);
707                    } else if (value instanceof List) {
708                        ArrayList<String> list = (ArrayList<String>) value;
709                        workItemDocument.setStaffOnlyFlag(list.get(0));
710                    }
711                }
712
713            }
714            workItemDocuments.add(workItemDocument);
715        }
716        return workItemDocuments;
717    }
718
719
720    /**
721     * @param queryDoc
722     * @return
723     * @throws Exception
724     */
725    @Override
726    public WorkBibDocument queryForBibTree(WorkBibDocument queryDoc) throws Exception {
727        String id = queryDoc.getId();
728        LOG.info("id-->" + id);
729        List<WorkInstanceDocument> workInstanceDocumentList = new ArrayList<WorkInstanceDocument>();
730        List<WorkItemDocument> workItemDocumentList = new ArrayList<WorkItemDocument>();
731        WorkInstanceDocument workInstanceDocument = null;
732        WorkHoldingsDocument workHoldingsDocument;
733        WorkItemDocument workItemDocument;
734        List<WorkEInstanceDocument> workEInstanceDocumentList = new ArrayList<>();
735        queryDoc = buildBibDocumentInfo(queryDoc);
736        String queryString = buildQueryForBibTree(queryDoc);
737        SolrQuery solrQuery = new SolrQuery();
738        SolrServer server = SolrServerManager.getInstance().getSolrServer();
739        solrQuery.setQuery(queryString);
740        solrQuery.addSortField("Location_sort", SolrQuery.ORDER.asc);
741        solrQuery.addSortField("ShelvingOrder_sort", SolrQuery.ORDER.asc);
742        solrQuery.setRows(50000); // There can bib can have more items.
743        LOG.info("solr query-->" + solrQuery);
744        QueryResponse response = server.query(solrQuery);
745        List<SolrDocument> solrDocumentList = response.getResults();
746        for (SolrDocument solrDocument : solrDocumentList) {
747
748            //build instance document
749            String docType = (String) solrDocument.getFieldValue("DocType");
750            if (docType.equalsIgnoreCase(DocType.HOLDINGS.getCode())) {
751                workInstanceDocument = new WorkInstanceDocument();
752                String instanceIdentifier = (String) solrDocument.getFieldValue("instanceIdentifier");
753                String holdingsIdentifier = (String) solrDocument.getFieldValue("id");
754                workItemDocumentList = new ArrayList<WorkItemDocument>();
755                workHoldingsDocument = new WorkHoldingsDocument();
756                workHoldingsDocument.setHoldingsIdentifier(holdingsIdentifier);
757                workHoldingsDocument.setInstanceIdentifier(instanceIdentifier);
758                workHoldingsDocument.setBibUUIDList(queryService.queryForBibs(workHoldingsDocument.getInstanceIdentifier()));
759                String locationName = (String) solrDocument.getFieldValue("Location_display");
760                workHoldingsDocument.setLocationName(locationName);
761                workHoldingsDocument.setCallNumberType(getFieldVal(solrDocument, "CallNumberType_display"));
762                workHoldingsDocument.setCallNumberPrefix(getFieldVal(solrDocument, "CallNumberPrefix_display"));
763                workHoldingsDocument.setCallNumber(getFieldVal(solrDocument, "CallNumber_display"));
764                workHoldingsDocument.setCopyNumber(getFieldVal(solrDocument, "CopyNumber_display"));
765                workHoldingsDocument.setDateEntered(getFieldDateVal(solrDocument, "dateEntered"));
766                workHoldingsDocument.setDateUpdated(getFieldDateVal(solrDocument, "dateUpdated"));
767                workHoldingsDocument.setCreatedBy(getFieldVal(solrDocument, "createdBy"));
768                workHoldingsDocument.setUpdatedBy(getFieldVal(solrDocument, "updatedBy"));
769                workHoldingsDocument.setLocalId(getFieldVal(solrDocument, "LocalId_display"));
770                workHoldingsDocument.setBibIdentifier(getFieldVal(solrDocument, "bibIdentifier"));
771                workInstanceDocument.setHoldingsDocument(workHoldingsDocument);
772
773                for (SolrDocument itemSolrDocument : solrDocumentList) {
774                    String itemDocType = (String) itemSolrDocument.getFieldValue("DocType");
775                    if ((itemDocType.equalsIgnoreCase(DocType.ITEM.getCode())) && (itemSolrDocument.getFieldValue("holdingsIdentifier").equals(holdingsIdentifier))) {
776
777                        workItemDocument = new WorkItemDocument();
778                        String itemIdentifier = (String) itemSolrDocument.getFieldValue("id");
779                        workItemDocument.setItemIdentifier(itemIdentifier);
780                        String callNumberType = (String) itemSolrDocument.getFieldValue("CallNumberType_display");
781                        String callNumberPrefix = (String) itemSolrDocument.getFieldValue("CallNumberPrefix_display");
782                        String callNumber = (String) itemSolrDocument.getFieldValue("CallNumber_display");
783                        workItemDocument.setLocation(getFieldVal(itemSolrDocument, "Location_display"));
784                        workItemDocument.setCopyNumber(getFieldVal(itemSolrDocument, "CopyNumber_display"));
785                        workItemDocument.setEnumeration(getFieldVal(itemSolrDocument, "Enumeration_display"));
786                        workItemDocument.setChronology(getFieldVal(itemSolrDocument, "Chronology_display"));
787                        workItemDocument.setItemStatus(getFieldVal(itemSolrDocument, "ItemStatus_display"));
788                        workItemDocument.setBarcode(getFieldVal(itemSolrDocument, "ItemBarcode_display"));
789                        workItemDocument.setVolumeNumber(getFieldVal(itemSolrDocument, "VolumeNumber_display"));
790                        workItemDocument.setLocalId(getFieldVal(itemSolrDocument, "LocalId_display"));
791                        workItemDocument.setCallNumberType(callNumberType);
792                        workItemDocument.setCallNumberPrefix(callNumberPrefix);
793                        workItemDocument.setItemType(getFieldVal(itemSolrDocument, "ItemTypeCodeValue_display"));
794                        workItemDocument.setCallNumber(callNumber);
795                        String staffOnlyFlag = (String) itemSolrDocument.getFieldValue("staffOnlyFlag");
796                        workItemDocument.setStaffOnlyFlag(staffOnlyFlag);
797                        workItemDocument.setDateEntered(getFieldDateVal(itemSolrDocument, "dateEntered"));
798                        workItemDocument.setDateUpdated(getFieldDateVal(itemSolrDocument, "dateUpdated"));
799                        workItemDocument.setCreatedBy(getFieldVal(itemSolrDocument, "createdBy"));
800                        workItemDocument.setUpdatedBy(getFieldVal(itemSolrDocument, "updatedBy"));
801                        workItemDocumentList.add(workItemDocument);
802                        workInstanceDocument.setItemDocumentList(workItemDocumentList);
803
804                        LOG.debug("workItemDocumentList size-->" + workItemDocumentList.size());
805                    }
806                }
807                workInstanceDocument.setInstanceIdentifier(instanceIdentifier);
808                workInstanceDocumentList.add(workInstanceDocument);
809            }
810
811            if (docType.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) {
812                WorkEInstanceDocument workEInstanceDocument = new WorkEInstanceDocument();
813                WorkEHoldingsDocument workEHoldingsDocument = new WorkEHoldingsDocument();
814                workEHoldingsDocument.setHoldingsIdentifier((String) solrDocument.getFieldValue("id"));
815                workEHoldingsDocument.setLocalId((String) solrDocument.getFieldValue("LocalId_display"));
816                workEHoldingsDocument.setImprint((String) solrDocument.getFieldValue("Imprint_display"));
817                workEHoldingsDocument.setInstanceIdentifier((String) solrDocument.getFieldValue("instanceIdentifier"));
818                workEHoldingsDocument.setAccessStatus(getFieldVal(solrDocument, "AccessStatus_display"));
819                workEHoldingsDocument.setSubscriptionStatus(getFieldVal(solrDocument, "SubscriptionStatus_display"));
820                workEHoldingsDocument.setPlatForm(getFieldVal(solrDocument, "Platform_display"));
821                workEHoldingsDocument.setLocation(getFieldVal(solrDocument, "Location_display"));
822                workEHoldingsDocument.setUrl(getFieldVal(solrDocument, "Url_display"));
823                workEHoldingsDocument.setStaffOnly(getFieldVal(solrDocument, "staffOnlyFlag"));
824                workEHoldingsDocument.seteResourceName(getFieldVal(solrDocument, "EResource_name_display"));
825                workEInstanceDocument.setInstanceIdentifier((String) solrDocument.getFieldValue("instanceIdentifier"));
826                workEHoldingsDocument.setCoverageDates(getFieldValues(solrDocument,"CoverageDate_display" ));
827                workEInstanceDocument.setWorkEHoldingsDocument(workEHoldingsDocument);
828                workEInstanceDocument.setPublisher(getFieldVal(solrDocument, "E_Publisher_display"));
829                workEInstanceDocument.setPublicDisplayNote(getFieldVal(solrDocument, "Public_Note_display"));
830                workEInstanceDocumentList.add(workEInstanceDocument);
831            }
832
833            queryDoc.setInstanceDocument(workInstanceDocument);
834            queryDoc.setWorkInstanceDocumentList(workInstanceDocumentList);
835            queryDoc.setWorkEInstanceDocumentList(workEInstanceDocumentList);
836        }
837
838        return queryDoc;
839    }
840
841    private String getFieldVal(SolrDocument solrDocument, String field) {
842        String fieldValue = null;
843        if (solrDocument.getFieldValue(field) instanceof String) {
844            fieldValue = (String) solrDocument.getFieldValue(field);
845        } else if (solrDocument.getFieldValue(field) instanceof List) {
846            List<String> locList = (List<String>) solrDocument.getFieldValue(field);
847            fieldValue = locList.get(0);
848        }
849        return fieldValue;
850    }
851
852    private List<String> getFieldValues(SolrDocument solrDocument, String field) {
853        List<String> list = new ArrayList<>();
854        if (solrDocument.getFieldValue(field) instanceof String) {
855            list.add((String) solrDocument.getFieldValue(field));
856        } else if (solrDocument.getFieldValue(field) instanceof List) {
857            list.addAll((List<String>) solrDocument.getFieldValue(field));
858        }
859        return list;
860    }
861
862    private String getFieldDateVal(SolrDocument solrDocument, String field) {
863        String fieldValue = null;
864
865        if (solrDocument.getFieldValue(field) instanceof Date) {
866            Format formatter = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
867            fieldValue = formatter.format(solrDocument.getFieldValue(field));
868        }
869        return fieldValue;
870    }
871    public WorkBibDocument buildBibDocumentInfo(WorkBibDocument bibDocument) throws SolrServerException, IOException {
872        String queryString = buildQueryForBibInfo(bibDocument);
873        SolrQuery solrQuery = new SolrQuery();
874        SolrServer server = SolrServerManager.getInstance().getSolrServer();
875        solrQuery.setQuery(queryString);
876        QueryResponse response = server.query(solrQuery);
877        List<SolrDocument> solrDocumentList = response.getResults();
878
879        for (SolrDocument solrDocument : solrDocumentList) {
880            StringBuffer titleBuffer = new StringBuffer();
881            String title = (String) solrDocument.getFieldValue("Title_display");
882            String format = (String) solrDocument.getFieldValue("DocFormat");
883            String staffOnlyFlag = (String) solrDocument.getFieldValue("staffOnlyFlag");
884            /* if("true".equals(staffOnlyFlag))  {
885                titleBuffer.append("<font color='red'>");
886                titleBuffer.append(title);
887                titleBuffer.append("</font>");
888            bibDocument.setTitle(titleBuffer.toString());
889            }else{
890                bibDocument.setTitle(title);
891            }*/
892            bibDocument.setTitle(title);
893            bibDocument.setAuthor(getFieldVal(solrDocument, "Author_display"));
894            bibDocument.setPublicationDate(getFieldVal(solrDocument, "PublicationDate_display"));
895            bibDocument.setPublisher(getFieldVal(solrDocument, "Publisher_display"));
896            bibDocument.setIssn(getFieldVal(solrDocument, "ISSN_display"));
897            bibDocument.setIsbn(getFieldVal(solrDocument, "ISBN_display"));
898            bibDocument.setEdition(getFieldVal(solrDocument, "Edition_display"));
899            bibDocument.setStaffOnlyFlag(staffOnlyFlag);
900            bibDocument.setDocFormat(format);
901        }
902
903        return bibDocument;
904    }
905
906
907    /**
908     * @param workBibDocumentList
909     * @return
910     * @throws Exception
911     */
912    @Override
913    public List<WorkBibDocument> queryForBibTree(List<WorkBibDocument> workBibDocumentList) throws Exception {
914        for (WorkBibDocument bibDocument : workBibDocumentList) {
915            bibDocument = queryForBibTree(bibDocument);
916            workBibDocumentList.add(bibDocument);
917        }
918        return workBibDocumentList;
919    }
920
921
922    /**
923     * This method returns the Bib ids for the selected bound-with instance.
924     *
925     * @param instancedId
926     * @return
927     * @throws SolrServerException
928     */
929    @Override
930    public List<String> queryForBibs(String instancedId) throws SolrServerException {
931        List<String> bibUuidList = new ArrayList<String>();
932        SolrQuery solrQuery = new SolrQuery();
933        SolrServer server = SolrServerManager.getInstance().getSolrServer();
934        solrQuery.setQuery("instanceIdentifier:" + instancedId);
935        solrQuery.setRows(500);
936        LOG.info("solr query-->" + solrQuery);
937        QueryResponse response = server.query(solrQuery);
938        List<SolrDocument> solrDocumentList = response.getResults();
939        for (SolrDocument solrDocument : solrDocumentList) {
940            String docType = (String) solrDocument.getFieldValue("DocType");
941            if (docType.equalsIgnoreCase(DocType.BIB.getDescription())) {
942                bibUuidList.add((String) solrDocument.getFieldValue("id"));
943            }
944
945        }
946        return bibUuidList;
947    }
948
949    public List<String> queryForItems(String bibId) throws SolrServerException {
950        List<String> itemIdList = new ArrayList<String>();
951        SolrQuery solrQuery = new SolrQuery();
952        SolrServer server = SolrServerManager.getInstance().getSolrServer();
953        solrQuery.setQuery("(DocType:item)AND(bibIdentifier:" + bibId + ")");
954        solrQuery.setRows(500);
955        LOG.info("solr query-->" + solrQuery);
956        QueryResponse response = server.query(solrQuery);
957        List<SolrDocument> solrDocumentList = response.getResults();
958        for (SolrDocument solrDocument : solrDocumentList) {
959            Object itemId = solrDocument.getFieldValue("id");
960            if (itemId instanceof String) {
961                itemIdList.add((String) itemId);
962            }
963            if (itemId instanceof List) {
964                itemIdList.addAll((ArrayList) itemId);
965            }
966        }
967
968
969        return itemIdList;
970    }
971
972    @Override
973    public String queryForBib(String itemId) throws SolrServerException {
974        List<String> bibUuidList = new ArrayList<String>();
975        SolrQuery solrQuery = new SolrQuery();
976        SolrServer server = SolrServerManager.getInstance().getSolrServer();
977        solrQuery.setQuery("itemIdentifier:" + itemId);
978        solrQuery.setRows(500);
979        LOG.info("solr query-->" + solrQuery);
980        QueryResponse response = server.query(solrQuery);
981        List<SolrDocument> solrDocumentList = response.getResults();
982        for (SolrDocument solrDocument : solrDocumentList) {
983            String docType = (String) solrDocument.getFieldValue("DocType");
984            if (docType.equalsIgnoreCase(DocType.INSTANCE.getDescription())) {
985                return getFieldVal(solrDocument, "bibIdentifier");
986            }
987        }
988        return "";
989    }
990
991    /**
992     * This method used to get the instances for the selected bibs.
993     *
994     * @param uuid
995     * @return
996     * @throws SolrServerException
997     */
998    @Override
999    public List<String> queryForInstances(String uuid) throws SolrServerException {
1000        List<String> instanceIdList = new ArrayList<String>();
1001        SolrQuery solrQuery = new SolrQuery();
1002        SolrServer server = SolrServerManager.getInstance().getSolrServer();
1003        solrQuery.setQuery("id:" + uuid);
1004        LOG.info("solr query-->" + solrQuery);
1005        solrQuery.setRows(500);
1006        QueryResponse response = server.query(solrQuery);
1007        List<SolrDocument> solrDocumentList = response.getResults();
1008        for (SolrDocument solrDocument : solrDocumentList) {
1009            String docType = (String) solrDocument.getFieldValue("DocType");
1010            if (docType.equalsIgnoreCase(DocType.BIB.getDescription())) {
1011                Object instanceId = solrDocument.getFieldValue("instanceIdentifier");
1012                if (instanceId instanceof String) {
1013                    instanceIdList.add((String) instanceId);
1014                }
1015                if (instanceId instanceof List) {
1016                    instanceIdList = (List<String>) instanceId;
1017                }
1018            }
1019
1020        }
1021        return instanceIdList;
1022    }
1023
1024    @Override
1025    public WorkInstanceDocument queryForInstanceTree(WorkInstanceDocument instanceDocument) throws SolrServerException {
1026
1027        String id = instanceDocument.getId();
1028        LOG.info("id-->" + id);
1029        List<WorkInstanceDocument> workInstanceDocumentList = new ArrayList<WorkInstanceDocument>();
1030        List<WorkHoldingsDocument> workHoldingsDocumentList = new ArrayList<WorkHoldingsDocument>();
1031        List<WorkItemDocument> workItemDocumentList = new ArrayList<WorkItemDocument>();
1032        WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
1033        WorkHoldingsDocument workHoldingsDocument;
1034        WorkItemDocument workItemDocument;
1035        //String queryString = buildQueryForInstanceTree(instanceDocument);
1036        SolrQuery solrQuery = new SolrQuery();
1037        SolrServer server = SolrServerManager.getInstance().getSolrServer();
1038        solrQuery.setQuery("DocType:holdings AND instanceIdentifier:" + id);
1039        LOG.info("solr query-->" + solrQuery);
1040        solrQuery.addSortField("Location_sort", SolrQuery.ORDER.asc);
1041        solrQuery.addSortField("ShelvingOrder_sort", SolrQuery.ORDER.asc);
1042        solrQuery.setRows(500);
1043        QueryResponse response = server.query(solrQuery);
1044        List<SolrDocument> holdingsSolrDocumentList = response.getResults();
1045        String docType;
1046        workItemDocumentList = new ArrayList<WorkItemDocument>();
1047        workHoldingsDocumentList = new ArrayList<WorkHoldingsDocument>();//
1048        for (SolrDocument holdingSolrDocument : holdingsSolrDocumentList) {
1049            docType = (String) holdingSolrDocument.getFieldValue("DocType");
1050            if ((docType.equalsIgnoreCase(DocType.HOLDINGS.getCode())) && (holdingSolrDocument.getFieldValue("instanceIdentifier").equals(id))) {
1051                workHoldingsDocument = new WorkHoldingsDocument();
1052                String holdingsIdentifier = (String) holdingSolrDocument.getFieldValue("id");
1053                String bibIdentifier = getFieldVal(holdingSolrDocument, "bibIdentifier");
1054                workHoldingsDocument.setHoldingsIdentifier(holdingsIdentifier);
1055                String locationName = getFieldVal(holdingSolrDocument, "Location_display");
1056                String instanceIdentifier = getFieldVal(holdingSolrDocument, "instanceIdentifier");
1057                workHoldingsDocument.setInstanceIdentifier(instanceIdentifier);
1058                workHoldingsDocument.setBibUUIDList(queryService.queryForBibs(instanceIdentifier));
1059                workHoldingsDocument.setLocationName(locationName);
1060                workHoldingsDocument.setCallNumberType(getFieldVal(holdingSolrDocument, "CallNumberType_display"));
1061                workHoldingsDocument.setCallNumberPrefix(getFieldVal(holdingSolrDocument, "CallNumberPrefix_display"));
1062                workHoldingsDocument.setCallNumber(getFieldVal(holdingSolrDocument, "CallNumber_display"));
1063                workHoldingsDocument.setCopyNumber(getFieldVal(holdingSolrDocument, "CopyNumber_display"));
1064                String staffOnlyFlag = (String) holdingSolrDocument.getFieldValue("staffOnlyFlag");
1065                workHoldingsDocument.setStaffOnlyFlag(staffOnlyFlag);
1066                workHoldingsDocumentList.add(workHoldingsDocument);
1067                workInstanceDocument.setBibIdentifier(bibIdentifier);
1068                workInstanceDocument.setHoldingsDocument(workHoldingsDocument);
1069            }
1070        }
1071        SolrQuery solrQueryForItem = new SolrQuery();
1072        solrQueryForItem.setQuery("DocType:item AND instanceIdentifier:" + id);
1073        LOG.info("solr query-->" + solrQueryForItem);
1074        solrQueryForItem.addSortField("Location_sort", SolrQuery.ORDER.asc);
1075        solrQueryForItem.addSortField("CallNumberPrefix_sort", SolrQuery.ORDER.asc);
1076        solrQueryForItem.addSortField("CallNumber_sort", SolrQuery.ORDER.asc);
1077        solrQueryForItem.addSortField("Enumeration_sort", SolrQuery.ORDER.asc);
1078        solrQueryForItem.addSortField("Chronology_sort", SolrQuery.ORDER.asc);
1079        solrQueryForItem.addSortField("CopyNumber_sort", SolrQuery.ORDER.asc);
1080        solrQueryForItem.addSortField("ItemBarcode_sort", SolrQuery.ORDER.asc);
1081        solrQueryForItem.setRows(5000);
1082        QueryResponse responseItem = server.query(solrQueryForItem);
1083        List<SolrDocument> itemSolrDocumentList = responseItem.getResults();
1084        for (SolrDocument itemSolrDocument : itemSolrDocumentList) {
1085            docType = (String) itemSolrDocument.getFieldValue("DocType");
1086            if ((docType.equalsIgnoreCase(DocType.ITEM.getCode()))) {
1087                workItemDocument = new WorkItemDocument();
1088                String itemIdentifier = getFieldVal(itemSolrDocument, "id");
1089                String callNumberType = getFieldVal(itemSolrDocument, "CallNumberType_display");
1090                String callNumberPrefix = getFieldVal(itemSolrDocument, "CallNumberPrefix_display");
1091                String bibIdentifier = getFieldVal(itemSolrDocument, "bibIdentifier");
1092                String callNumber = getFieldVal(itemSolrDocument, "CallNumber_display");
1093                workItemDocument.setLocation(getFieldVal(itemSolrDocument, "Location_display"));
1094                workItemDocument.setBarcode(getFieldVal(itemSolrDocument, "ItemBarcode_display"));
1095                workItemDocument.setItemType(getFieldVal(itemSolrDocument, "ItemTypeCodeValue_display"));
1096                workItemDocument.setLocationName(getFieldVal(itemSolrDocument, "LocationLevelName_display"));
1097                workItemDocument.setItemStatus(getFieldVal(itemSolrDocument, "ItemStatus_display"));
1098                workItemDocument.setCopyNumber(getFieldVal(itemSolrDocument, "CopyNumber_display"));
1099                workItemDocument.setEnumeration(getFieldVal(itemSolrDocument, "Enumeration_display"));
1100                workItemDocument.setChronology(getFieldVal(itemSolrDocument, "Chronology_display"));
1101                workItemDocument.setCallNumberType(callNumberType);
1102                String staffOnlyFlag = (String) itemSolrDocument.getFieldValue("staffOnlyFlag");
1103                workItemDocument.setStaffOnlyFlag(staffOnlyFlag);
1104                workItemDocument.setCallNumberPrefix(callNumberPrefix);
1105                workItemDocument.setCallNumber(callNumber);
1106                workItemDocument.setItemIdentifier(itemIdentifier);
1107                workItemDocumentList.add(workItemDocument);
1108                workInstanceDocument.setBibIdentifier(bibIdentifier);
1109            }
1110        }
1111        workInstanceDocument.setItemDocumentList(workItemDocumentList);
1112        workInstanceDocument.setInstanceIdentifier(id);
1113        workInstanceDocumentList.add(workInstanceDocument);
1114        return workInstanceDocument;
1115    }
1116
1117    @Override
1118    public WorkItemDocument queryForItemTree(WorkItemDocument itemDocument) throws SolrServerException {
1119
1120        String id = itemDocument.getId();
1121        LOG.info("id-->" + id);
1122        List<WorkHoldingsDocument> workHoldingsDocumentList = new ArrayList<WorkHoldingsDocument>();
1123        List<WorkItemDocument> workItemDocumentList = new ArrayList<WorkItemDocument>();
1124        WorkItemDocument workItemDocument;
1125        //String queryString = buildQueryForItemTree(itemDocument);
1126        SolrQuery solrQuery = new SolrQuery();
1127        SolrServer server = SolrServerManager.getInstance().getSolrServer();
1128        solrQuery.setQuery("id:" + id);
1129        solrQuery.setRows(500);
1130        LOG.info("solr query-->" + solrQuery);
1131        QueryResponse response = server.query(solrQuery);
1132        List<SolrDocument> solrDocumentList = response.getResults();
1133        String docType;
1134        workItemDocument = new WorkItemDocument();
1135        workItemDocumentList = new ArrayList<WorkItemDocument>();
1136
1137        for (SolrDocument itemSolrDocument : solrDocumentList) {
1138            docType = (String) itemSolrDocument.getFieldValue("DocType");
1139            if ((docType.equalsIgnoreCase(DocType.ITEM.getCode())) && (itemSolrDocument.getFieldValue("id").equals(id))) {
1140
1141
1142                String itemIdentifier = (String) itemSolrDocument.getFieldValue("id");
1143//                String instanceIdentifier = (String) itemSolrDocument.getFieldValue("instanceIdentifier");
1144//                String bibIdentifier = (String) itemSolrDocument.getFieldValue("bibIdentifier");
1145//                String callNumberType = (String) itemSolrDocument.getFieldValue("CallNumberType_display");
1146//                String callNumberPrefix = (String) itemSolrDocument.getFieldValue("CallNumberPrefix_display");
1147//                String callNumber = (String) itemSolrDocument.getFieldValue("CallNumber_display");
1148
1149                String instanceIdentifier = getFieldVal(itemSolrDocument, "instanceIdentifier");
1150                String bibIdentifier = getFieldVal(itemSolrDocument, "bibIdentifier");
1151                String callNumberType = getFieldVal(itemSolrDocument, "CallNumberType_display");
1152                String callNumberPrefix = getFieldVal(itemSolrDocument, "CallNumberPrefix_display");
1153                String callNumber = getFieldVal(itemSolrDocument, "CallNumber_display");
1154
1155                workItemDocument.setLocation(getFieldVal(itemSolrDocument, "Location_display"));
1156                workItemDocument.setBarcode(getFieldVal(itemSolrDocument, "ItemBarcode_display"));
1157                workItemDocument.setItemType(getFieldVal(itemSolrDocument, "ItemTypeCodeValue_display"));
1158                workItemDocument.setLocationName(getFieldVal(itemSolrDocument, "LocationLevelName_display"));
1159                workItemDocument.setCopyNumber(getFieldVal(itemSolrDocument, "CopyNumber_display"));
1160                workItemDocument.setVolumeNumber(getFieldVal(itemSolrDocument, "VolumeNumber_display"));
1161                workItemDocument.setItemStatus(getFieldVal(itemSolrDocument, "ItemStatus_display"));
1162                workItemDocument.setCallNumber(callNumber);
1163                workItemDocument.setCallNumberType(callNumberType);
1164                workItemDocument.setCallNumberPrefix(callNumberPrefix);
1165                workItemDocument.setItemIdentifier(itemIdentifier);
1166                workItemDocument.setInstanceIdentifier(instanceIdentifier);
1167                workItemDocument.setBibIdentifier(bibIdentifier);
1168                workItemDocumentList.add(workItemDocument);
1169                LOG.debug("workItemDocumentList size-->" + workItemDocumentList.size());
1170            }
1171        }
1172
1173
1174        return workItemDocument;  //To change body of implemented methods use File | Settings | File Templates.
1175    }
1176
1177    @Override
1178    public WorkEInstanceDocument queryForEInstanceTree(WorkEInstanceDocument eInstanceDocument) throws SolrServerException {
1179
1180        String id = eInstanceDocument.getId();
1181        LOG.info("id-->" + id);
1182        WorkEInstanceDocument workEInstanceDocument = new WorkEInstanceDocument();
1183        WorkEHoldingsDocument workEHoldingsDocument;
1184        SolrQuery solrQuery = new SolrQuery();
1185        SolrServer server = SolrServerManager.getInstance().getSolrServer();
1186        solrQuery.setQuery("instanceIdentifier:" + id);
1187        LOG.info("solr query-->" + solrQuery);
1188        QueryResponse response = server.query(solrQuery);
1189        List<SolrDocument> solrDocumentList = response.getResults();
1190        String docType;
1191
1192        for (SolrDocument holdingSolrDocument : solrDocumentList) {
1193            docType = (String) holdingSolrDocument.getFieldValue("DocType");
1194
1195            if ((docType.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) && (holdingSolrDocument.getFieldValue("instanceIdentifier").equals(id))) {
1196                workEHoldingsDocument = new WorkEHoldingsDocument();
1197                String holdingsIdentifier = (String) holdingSolrDocument.getFieldValue("id");
1198                String bibIdentifier = getFieldVal(holdingSolrDocument, "bibIdentifier");
1199                workEHoldingsDocument.setHoldingsIdentifier(holdingsIdentifier);
1200//                String locationName = (String) holdingSolrDocument.getFieldValue("LocationLevel_display");
1201                String locationName = getFieldVal(holdingSolrDocument, "Location_display");
1202                String instanceIdentifier = getFieldVal(holdingSolrDocument, "instanceIdentifier");
1203                workEHoldingsDocument.setInstanceIdentifier(instanceIdentifier);
1204                workEHoldingsDocument.setAccessStatus(getFieldVal(holdingSolrDocument, "AccessStatus_display"));
1205                workEHoldingsDocument.setSubscriptionStatus(getFieldVal(holdingSolrDocument, "SubscriptionStatus_display"));
1206                workEHoldingsDocument.setImprint(getFieldVal(holdingSolrDocument, "Imprint_display"));
1207                workEHoldingsDocument.setPlatForm(getFieldVal(holdingSolrDocument, "Platform_display"));
1208                workEHoldingsDocument.setLocation(getFieldVal(holdingSolrDocument, "Location_display"));
1209                workEHoldingsDocument.seteResourceName(getFieldVal(holdingSolrDocument, "EResource_name_display"));
1210                workEHoldingsDocument.setCoverageDates(getFieldValues(holdingSolrDocument,"CoverageDate_display" ));
1211                workEHoldingsDocument.setStaffOnly(getFieldVal(holdingSolrDocument, "staffOnlyFlag"));
1212                workEHoldingsDocument.setBibIdentifier(bibIdentifier);
1213                workEInstanceDocument.setBibIdentifier(bibIdentifier);
1214                workEInstanceDocument.setInstanceIdentifier(instanceIdentifier);
1215                workEInstanceDocument.setWorkEHoldingsDocument(workEHoldingsDocument);
1216            }
1217        }
1218
1219        workEInstanceDocument.setInstanceIdentifier(id);
1220
1221        return workEInstanceDocument;
1222    }
1223
1224
1225    private String buildQueryForBibTree(OleDocument queryDoc) {
1226        StringBuilder query = new StringBuilder();
1227
1228        if (((WorkBibDocument) queryDoc).getId() != null && query.length() > 0) {
1229            query.append("(bibIdentifier :").append((((WorkBibDocument) queryDoc).getId())).append(")");
1230        } else if (((WorkBibDocument) queryDoc).getId() != null) {
1231            query.append("(bibIdentifier :").append((((WorkBibDocument) queryDoc).getId())).append(")");
1232
1233
1234        }
1235        return query.toString();
1236    }
1237
1238    private String buildQueryForInstanceTree(OleDocument queryDoc) {
1239        StringBuilder query = new StringBuilder();
1240
1241        if (((WorkInstanceDocument) queryDoc).getId() != null && query.length() > 0) {
1242            query.append("(instanceIdentifier :").append((((WorkInstanceDocument) queryDoc).getId())).append(")");
1243        } else if (((WorkInstanceDocument) queryDoc).getId() != null) {
1244            query.append("(instanceIdentifier :").append((((WorkInstanceDocument) queryDoc).getId())).append(")");
1245
1246
1247        }
1248        return query.toString();
1249    }
1250
1251    private String buildQueryForItemTree(OleDocument queryDoc) {
1252        StringBuilder query = new StringBuilder();
1253
1254        if (((WorkItemDocument) queryDoc).getId() != null && query.length() > 0) {
1255            query.append("(id :").append((((WorkItemDocument) queryDoc).getId())).append(")");
1256        } else if (((WorkItemDocument) queryDoc).getId() != null) {
1257            query.append("(id :").append((((WorkItemDocument) queryDoc).getId())).append(")");
1258
1259
1260        }
1261        return query.toString();
1262    }
1263
1264    private String buildQueryForBibInfo(OleDocument queryDoc) {
1265        StringBuilder query = new StringBuilder();
1266
1267        if (((WorkBibDocument) queryDoc).getId() != null && query.length() > 0) {
1268            query.append("(id :").append((((WorkBibDocument) queryDoc).getId())).append(" AND DocType:bibliographic").append(")");
1269        } else if (((WorkBibDocument) queryDoc).getId() != null) {
1270            query.append("(id :").append((((WorkBibDocument) queryDoc).getId())).append(" AND DocType:bibliographic").append(")");
1271
1272
1273        }
1274        return query.toString();
1275    }
1276
1277    /**
1278     * @param queryDoc
1279     * @return query
1280     *         Usage: Builds query string using OleDocument Data
1281     */
1282    public String buildQueryForDoc(OleDocument queryDoc) {
1283        StringBuilder query = new StringBuilder();
1284        if ((((WorkBibDocument) queryDoc).getInstanceDocument() == null)
1285                || ((WorkBibDocument) queryDoc).getInstanceDocument().getInstanceIdentifier() == null) {
1286            if (((WorkBibDocument) queryDoc).getTitle() != null) {
1287                query.append("(Title_display:").append(((WorkBibDocument) queryDoc).getTitle()).append(")");
1288            }
1289            if (((WorkBibDocument) queryDoc).getAuthor() != null && query.length() > 0) {
1290                query.append("AND (Author_display:").append(((WorkBibDocument) queryDoc).getAuthor()).append(")");
1291            } else if (((WorkBibDocument) queryDoc).getAuthor() != null) {
1292                query.append("(Author_display:").append(((WorkBibDocument) queryDoc).getAuthor()).append(")");
1293            }
1294            if (((WorkBibDocument) queryDoc).getPublicationDate() != null && query.length() > 0) {
1295                query.append("AND (PublicationDate_display:").append(((WorkBibDocument) queryDoc).getPublicationDate()).append(")");
1296            } else if (((WorkBibDocument) queryDoc).getPublicationDate() != null) {
1297                query.append("(PublicationDate_display:").append(((WorkBibDocument) queryDoc).getPublicationDate()).append(")");
1298            }
1299            if (((WorkBibDocument) queryDoc).getIsbn() != null && query.length() > 0) {
1300                query.append("AND (ISBN_display:").append(((WorkBibDocument) queryDoc).getIsbn()).append(")");
1301            } else if (((WorkBibDocument) queryDoc).getIsbn() != null) {
1302                query.append("(ISBN_display:").append(((WorkBibDocument) queryDoc).getIsbn()).append(")");
1303            }
1304            if (((WorkBibDocument) queryDoc).getPublisher() != null && query.length() > 0) {
1305                query.append("AND (Publisher_display:").append(((WorkBibDocument) queryDoc).getPublisher()).append(")");
1306            } else if (((WorkBibDocument) queryDoc).getPublisher() != null) {
1307                query.append("(Publisher_display:").append(((WorkBibDocument) queryDoc).getPublisher()).append(")");
1308            }
1309            if (((WorkBibDocument) queryDoc).getId() != null && query.length() > 0) {
1310                query.append("(id:").append((((WorkBibDocument) queryDoc).getId())).append(")");
1311            } else if (((WorkBibDocument) queryDoc).getId() != null) {
1312                query.append("(id:").append((((WorkBibDocument) queryDoc).getId())).append(")");
1313
1314            }
1315        } else {
1316            query.append("(" + DOC_TYPE + ":" + queryDoc.getDocType().getDescription() + ")");
1317            if (((WorkBibDocument) queryDoc).getInstanceDocument() != null) {
1318                query.append(" AND ");
1319                String instanseIdentifier = ((WorkBibDocument) queryDoc).getInstanceDocument().getInstanceIdentifier();
1320                query.append("(" + INSTANCE_IDENTIFIER + ":" + instanseIdentifier + ")");
1321            }
1322        }
1323        query.append(
1324                "&fl=id,instanceIdentifier,Title_display,Author_display,PublicationDate_display,ISBN_display,Publisher_display");
1325        return query.toString();
1326    }
1327
1328
1329    /**
1330     * @param inputQuery
1331     * @return hitsOnPage
1332     * @throws Exception Usage: Gets Solr response for input query and builds List of Maps holding Solr Doc Data
1333     */
1334    public List<Map<String, Object>> getSolrHitsForQuery(String inputQuery) throws Exception {
1335        SolrServer server;
1336        List<Map<String, Object>> hitsOnPage = new ArrayList<Map<String, Object>>();
1337        server = SolrServerManager.getInstance().getSolrServer();
1338        SolrQuery solrQuery = new SolrQuery();
1339        solrQuery.setQuery(inputQuery);
1340        solrQuery.setSortField("Title_sort", SolrQuery.ORDER.asc);
1341        solrQuery.setIncludeScore(true);
1342        solrQuery.setRows(20000);
1343        LOG.info("solr Query -->" + solrQuery.getQuery());
1344        QueryResponse queryResponse = server.query(solrQuery);
1345        SolrDocumentList solrDocumentList = queryResponse.getResults();
1346
1347        for (SolrDocument solrDocument : solrDocumentList) {
1348            hitsOnPage.add(solrDocument);
1349        }
1350        return hitsOnPage;
1351    }
1352
1353
1354    /**
1355     * Gets Solr response for search Params
1356     * @param searchParams
1357     * @return hitsOnPage
1358     * @throws Exception
1359     */
1360    public List<Map<String, Object>> getSolrHitsForQueryParams(SearchParams searchParams) throws Exception {
1361        SolrServer server;
1362        List<Map<String, Object>> hitsOnPage = new ArrayList<Map<String, Object>>();
1363        server = SolrServerManager.getInstance().getSolrServer();
1364        SolrQuery solrQuery = new SolrQuery();
1365        solrQuery.setQuery(searchParams.getSearchQuery());
1366        if(StringUtils.isNotEmpty(searchParams.getSortField()) && StringUtils.isNotEmpty(searchParams.getSortOrder())) {
1367            String solrField = getSortField(searchParams.getSortField()).toString();
1368            if("asc".equals(searchParams.getSortOrder())) {
1369                solrQuery.setSortField(solrField ,SolrQuery.ORDER.asc);
1370            }
1371            else if("desc".equals(searchParams.getSortOrder())) {
1372                solrQuery.setSortField(solrField ,SolrQuery.ORDER.desc);
1373            }
1374        }
1375        else {
1376            solrQuery.setSortField("Title_sort", SolrQuery.ORDER.asc);
1377        }
1378        solrQuery.setIncludeScore(true);
1379        solrQuery.setRows(searchParams.getRows());
1380        solrQuery.setStart(searchParams.getStart());
1381        LOG.info("solr Query -->" + solrQuery.getQuery());
1382        QueryResponse queryResponse = server.query(solrQuery);
1383        SolrDocumentList solrDocumentList = queryResponse.getResults();
1384
1385        for (SolrDocument solrDocument : solrDocumentList) {
1386            hitsOnPage.add(solrDocument);
1387        }
1388        return hitsOnPage;
1389    }
1390
1391
1392    /**
1393     * Gets total number of records from solr
1394     * @param inputQuery
1395     * @return numFound
1396     * @throws Exception
1397     */
1398    public int getSolrHitsForQueryParams(String inputQuery) throws Exception {
1399        SolrServer server;
1400        List<Map<String, Object>> hitsOnPage = new ArrayList<Map<String, Object>>();
1401        server = SolrServerManager.getInstance().getSolrServer();
1402        SolrQuery solrQuery = new SolrQuery();
1403        solrQuery.setQuery(inputQuery);
1404        solrQuery.setIncludeScore(true);
1405        solrQuery.setRows(0);
1406
1407        LOG.info("solr Query -->" + solrQuery.getQuery());
1408        QueryResponse queryResponse = server.query(solrQuery);
1409        int numFound = (int) queryResponse.getResults().getNumFound();
1410        return numFound;
1411    }
1412
1413
1414    /**
1415     * @param idList
1416     * @param identifierType
1417     * @return
1418     */
1419    @Override
1420    public List<String> getUUIDList(List<String> idList, String identifierType) {
1421        SolrServer solrServer;
1422        SolrQuery solrQuery = new SolrQuery();
1423        SolrDocumentList solrDocumentList;
1424        String id;
1425        StringBuilder builder = new StringBuilder();
1426        List<String> uuidList = new ArrayList<String>();
1427        String searchField = null;
1428        if (identifierType.equalsIgnoreCase("SCN")) {
1429            searchField = WorkBibCommonFields.SYSTEM_CONTROL_NUMBER + ":";
1430        } else if (identifierType.equalsIgnoreCase("ISBN")) {
1431            searchField = WorkBibCommonFields.ISBN_SEARCH + ":";
1432        }
1433        try {
1434            solrServer = SolrServerManager.getInstance().getSolrServer();
1435            for (String ssn : idList) {
1436                if (builder.length() > 0) {
1437                    builder.append(" OR ");
1438                }
1439                builder.append("(");
1440                builder.append(searchField);
1441                builder.append(ssn);
1442                builder.append(")");
1443            }
1444
1445            LOG.debug("query-->" + builder.toString());
1446            solrQuery.setQuery(builder.toString());
1447            LOG.debug("solr query-->" + solrQuery);
1448            QueryResponse response = solrServer.query(solrQuery);
1449            solrDocumentList = response.getResults();
1450            for (SolrDocument solrDocument : solrDocumentList) {
1451                id = (String) solrDocument.getFieldValue("id");
1452                LOG.debug("id-->" + id);
1453                uuidList.add(id);
1454            }
1455
1456        } catch (SolrServerException e) {
1457
1458        }
1459        return uuidList;
1460    }
1461
1462    /**
1463     * This method returns the list of titles based on the given search value.
1464     *
1465     * @param fieldValue
1466     * @return
1467     */
1468    @Override
1469    public List<String> getTitleValues(String fieldValue) {
1470        SolrServer solrServer;
1471        SolrQuery solrQuery = new SolrQuery();
1472        SolrDocumentList solrDocumentList;
1473        Object title;
1474        StringBuilder builder = new StringBuilder();
1475        List<String> titleList = new ArrayList<String>();
1476        String searchField = null;
1477        searchField = WorkBibCommonFields.TITLE_SEARCH + ":";
1478        try {
1479            solrServer = SolrServerManager.getInstance().getSolrServer();
1480            builder.append("(");
1481            builder.append("DocType");
1482            builder.append(":");
1483            builder.append("bibliographic");
1484            builder.append(")");
1485            builder.append("AND");
1486            builder.append("(");
1487            builder.append("(");
1488            builder.append(searchField);
1489            builder.append("(");
1490            builder.append(fieldValue);
1491            builder.append(")");
1492            builder.append(")");
1493            builder.append(")");
1494            LOG.debug("query-->" + builder.toString());
1495            solrQuery.setQuery(builder.toString());
1496            LOG.info("solr query-->" + solrQuery);
1497            QueryResponse response = solrServer.query(solrQuery);
1498            solrDocumentList = response.getResults();
1499            for (SolrDocument solrDocument : solrDocumentList) {
1500                title = solrDocument.getFieldValue("Title_search");
1501                LOG.debug("title-->" + title);
1502                if (title instanceof List) {
1503                    titleList.addAll((Collection<? extends String>) title);
1504                } else {
1505                    titleList.add(title.toString());
1506                }
1507            }
1508
1509        } catch (SolrServerException e) {
1510
1511        }
1512        return titleList;
1513
1514    }
1515
1516    public String buildQuery(SearchParams searchParams) {
1517        StringBuffer query = new StringBuffer();
1518        buildInitialQuery(query, searchParams);
1519        if (searchParams.getResultPageSize() != null) {
1520            query.append("&rows=" + searchParams.getResultPageSize());
1521        }
1522        if (searchParams.getResultFromIndex() != null) {
1523            query.append("&start=" + searchParams.getResultFromIndex());
1524        }
1525        query.append(buildQueryWithSortFields(searchParams.getSortField(), searchParams.getSortOrder()));
1526        query.append(buildQueryWithFieldListParameters(searchParams.getFieldList()));
1527        return query.toString();
1528    }
1529
1530    /**
1531     * @param query
1532     * @param searchParams Usage: This method builds initial SOLR query with DocType and DocFormat as SolrParams
1533     */
1534    private void buildInitialQuery(StringBuffer query, SearchParams searchParams) {
1535
1536        if (searchParams.getDocType() == null && searchParams.getSearchFieldsList().isEmpty())
1537            return;
1538        if (searchParams.getDocType() != null && searchParams.getSearchFieldsList().isEmpty()) {
1539            query.append("(DocType:" + searchParams.getDocType() + ")");
1540        } else if (searchParams.getDocType() != null && !searchParams.getSearchFieldsList().isEmpty()) {
1541            query.append("(DocType:" + searchParams.getDocType() + ")");
1542            query.append("AND");
1543        }
1544
1545        /*  if (searchParams.getDocFormat().equalsIgnoreCase("marc")) {
1546            query.append("((DocType:" + searchParams.getDocType() + ")" + "OR(DocType:item))");
1547        }
1548        else {
1549            query.append("(DocType:" + searchParams.getDocType() + ")");
1550        }*/
1551        if (searchParams.getSearchFieldsList().isEmpty() && searchParams.getDocFormat() != null && !searchParams.getDocFormat().equalsIgnoreCase("all")) {
1552            query.append("AND");
1553            query.append("(DocFormat:" + searchParams.getDocFormat() + ")");
1554        } else if (searchParams.getDocFormat() != null && !searchParams.getDocFormat().equalsIgnoreCase("all")) {
1555            query.append("(DocFormat:" + searchParams.getDocFormat() + ")");
1556            query.append("AND");
1557        }
1558
1559        if (searchParams.getSearchFieldsList().size() > 0) {
1560            query.append(buildQueryWithSearchParameters(searchParams.getSearchFieldsList()));
1561        }
1562    }
1563
1564    public String buildQueryWithSearchParameters(List<SearchCondition> searchFieldsList) {
1565        SearchCondition docSearchFieldsDTO = null;
1566        StringBuffer queryStringbuffer = new StringBuffer();
1567        StringBuffer highlightBuffer = new StringBuffer("&hl.fl=");
1568        if (searchFieldsList != null && searchFieldsList.size() > 0) {
1569            queryStringbuffer.append("(");
1570            for (int i = 0; i < searchFieldsList.size(); i++) {
1571                int searchScopeAddLimit = i;
1572                docSearchFieldsDTO = searchFieldsList.get(i);
1573                if (docSearchFieldsDTO.getOperator() != null) {
1574                    // queryStringbuffer.append(docSearchFieldsDTO.getOperator());
1575                }
1576                queryStringbuffer.append("(");
1577                if (docSearchFieldsDTO.getDocField().equalsIgnoreCase("all") || (
1578                        docSearchFieldsDTO.getDocField() == null || docSearchFieldsDTO.getDocField().length() == 0)) {
1579                    queryStringbuffer.append("all_text");
1580                    highlightBuffer.append("*");
1581
1582                } else {
1583                    queryStringbuffer.append(docSearchFieldsDTO.getDocField());
1584                    highlightBuffer.append(docSearchFieldsDTO.getDocField());
1585
1586                    if (i != searchFieldsList.size() - 1) {
1587                        highlightBuffer.append(",");
1588                    }
1589                }
1590                queryStringbuffer.append(":");
1591                String searchScope = docSearchFieldsDTO.getSearchScope();
1592                String searchText = docSearchFieldsDTO.getSearchText();
1593                String operator = docSearchFieldsDTO.getOperator();
1594                if (docSearchFieldsDTO.getFieldType() != null && docSearchFieldsDTO.getFieldType().equals("range")) {
1595                    //do nothing to searchText
1596                } else {
1597                    if (searchText.equalsIgnoreCase("")) {
1598                        searchText = "(*:*)";
1599                    } else {
1600                        //commented line for jira-4802
1601                        //searchText = searchText.toLowerCase();
1602                        //searchText = searchText.replaceAll("[~!(){}\\[\\]':-]+", " ");
1603                        searchText=getModifiedText(searchText);
1604
1605                        searchText.replaceAll(" ", "+");
1606                    }
1607                }
1608                LOG.debug("searchText-->" + searchText);
1609                String searchTextVal = null;
1610                if (searchText.length() > 0) {
1611                    queryStringbuffer.append("(");
1612                    if (searchScope.equalsIgnoreCase("AND")) {
1613                        searchText = searchText.replaceAll("\\s+", " ");
1614                        searchTextVal = searchText.trim().replace(" ", " AND ");
1615                    } else if (searchScope.equalsIgnoreCase("OR")) {
1616                        searchText = searchText.replaceAll("\\s+", " ");
1617                        searchTextVal = searchText.trim().replace(" ", " OR ");
1618                    } else if (searchScope.equalsIgnoreCase("phrase")) {
1619                        searchTextVal = "\"" + searchText + "\"";
1620                    } else if (searchScope.equalsIgnoreCase("none")) {
1621                        //do nothing to the search text
1622                        searchTextVal = searchText;
1623                    }
1624                    /* try {
1625                        searchTextVal = URLEncoder.encode(searchTextVal, "UTF-8");
1626                    }
1627                    catch (UnsupportedEncodingException e) {
1628                        e.printStackTrace();
1629                    }*/
1630                    queryStringbuffer.append(searchTextVal);
1631                    LOG.debug("searchTextVal............" + searchTextVal + "........" + queryStringbuffer.toString());
1632                    queryStringbuffer.append(")");
1633                }
1634                queryStringbuffer.append(")");
1635                ++searchScopeAddLimit;
1636                if (operator == null) {
1637                    break;
1638                }
1639                if (searchScopeAddLimit != searchFieldsList.size()) {
1640                    queryStringbuffer.append(operator);
1641                }
1642            }
1643            queryStringbuffer.append(")");
1644            queryStringbuffer.append(highlightBuffer.toString());
1645
1646            queryStringbuffer.append("&hl=true");
1647        }
1648        return queryStringbuffer.toString();
1649    }
1650
1651    public String buildQueryWithSortFields(String sortField, String sortOrder) {
1652        StringBuffer sortFieldsQuery = new StringBuffer();
1653        if (null != sortField) {
1654            sortFieldsQuery.append("&");
1655            sortFieldsQuery.append("sort=");
1656            sortFieldsQuery.append(sortField);
1657            if (null != sortOrder) {
1658                sortFieldsQuery.append(" ");
1659                sortFieldsQuery.append(sortOrder);
1660            }
1661        }
1662        return sortFieldsQuery.toString();
1663    }
1664
1665    public String buildQueryWithFieldListParameters(List<String> fieldsList) {
1666        String queryWithFieldListParameters = "";
1667        if (fieldsList != null) {
1668            StringBuffer fieldsListQueryStringbuffer = new StringBuffer();
1669            fieldsListQueryStringbuffer.append("&");
1670            fieldsListQueryStringbuffer.append("fl=");
1671            for (int i = 0; i < fieldsList.size(); i++) {
1672                fieldsListQueryStringbuffer.append(fieldsList.get(i));
1673                fieldsListQueryStringbuffer.append(",");
1674            }
1675            queryWithFieldListParameters = fieldsListQueryStringbuffer
1676                    .substring(0, fieldsListQueryStringbuffer.length() - 1);
1677        }
1678        return queryWithFieldListParameters;
1679    }
1680
1681    /**
1682     * Prepares the solr query based on user input values location, classification and call number browse text
1683     * Calculates totalCallNumberCount and totalForwardCallNumberCount based on solr query results
1684     * Evaluates matchIndex based on totalCallNumberCount and totalForwardCallNumberCount
1685     *
1686     * @param callNumberBrowseParams contains required parameters for call number browse functionality
1687     * @throws Exception
1688     */
1689    public void initCallNumberBrowse(CallNumberBrowseParams callNumberBrowseParams) throws Exception {
1690        int matchIndex = 0;
1691        int totalCallNumberCount = 0;
1692        int totalForwardCallNumberCount = 0;
1693        String location = callNumberBrowseParams.getLocation();
1694        String classificationScheme = callNumberBrowseParams.getClassificationScheme();
1695        String callNumberBrowseText = callNumberBrowseParams.getCallNumberBrowseText();
1696        String docType = callNumberBrowseParams.getDocTye();
1697        if (StringUtils.isNotEmpty(classificationScheme)) {
1698            String queryString = buildQueryForTotalCallNumberCount(location, classificationScheme, docType);
1699            List<Map<String, Object>> solrHits;
1700            totalCallNumberCount = getSolrHitsForCallNumberBrowse(queryString);
1701            LOG.info("Total Call Number count:" + totalCallNumberCount);
1702
1703            if (StringUtils.isNotEmpty(callNumberBrowseText)) {
1704                CallNumber callNumber = CallNumberFactory.getInstance().getCallNumber(classificationScheme);
1705                String normalizedCallNumberBrowseText = callNumber.getSortableKey(callNumberBrowseText);
1706                normalizedCallNumberBrowseText = normalizedCallNumberBrowseText.replaceAll(" ", "-");
1707
1708                queryString = buildQueryForTotalForwardCallNumberCount(location, classificationScheme, normalizedCallNumberBrowseText, docType);
1709                totalForwardCallNumberCount = getSolrHitsForCallNumberBrowse(queryString);
1710            } else
1711                totalForwardCallNumberCount = totalCallNumberCount;
1712        }
1713
1714        LOG.info("Total Forward Call Number Count:" + totalForwardCallNumberCount);
1715        matchIndex = (totalCallNumberCount - totalForwardCallNumberCount) + 1;
1716        callNumberBrowseParams.setMatchIndex(matchIndex);
1717        callNumberBrowseParams.setTotalCallNumberCount(totalCallNumberCount);
1718        callNumberBrowseParams.setTotalForwardCallNumberCount(totalForwardCallNumberCount);
1719    }
1720
1721    /**
1722     * Used to display closest record based on input fields classification, rows and start index
1723     *
1724     * @param callNumberBrowseParams contains required parameters for call number browse functionality
1725     * @return
1726     * @throws Exception
1727     */
1728    public List<WorkBibDocument> browseCallNumbers(CallNumberBrowseParams callNumberBrowseParams) throws Exception {
1729        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
1730        if (StringUtils.isNotEmpty(callNumberBrowseParams.getClassificationScheme())) {
1731            int startIndex = callNumberBrowseParams.getStartIndex();
1732            if (startIndex > 0) {
1733                startIndex = startIndex - 1;
1734            }
1735            String queryString = buildQueryForBrowseCallNumbers(callNumberBrowseParams.getLocation(), callNumberBrowseParams.getClassificationScheme(), callNumberBrowseParams.getNumRows(), startIndex, callNumberBrowseParams.getDocTye());
1736            List<Map<String, Object>> solrHits;
1737            solrHits = getSolrHitsForCallNumberBrowse(queryString, startIndex, callNumberBrowseParams.getNumRows());
1738            List<WorkItemDocument> workItemDocuments = buildWorkItemDocuments(solrHits);
1739            buildItemCallNumber(workItemDocuments);
1740            workBibDocuments = getWorkBibDocuments(workItemDocuments);
1741            LOG.info("Before Merging");
1742            LOG.info("Item list size:" + workItemDocuments.size());
1743            LOG.info("Bib list size:" + workBibDocuments.size());
1744            workBibDocuments = mergeBibAndItemDocuments(workItemDocuments, workBibDocuments);
1745            LOG.info("After Merging");
1746            LOG.info("Item list size:" + workItemDocuments.size());
1747            LOG.info("Bib list size:" + workBibDocuments.size());
1748        }
1749        return workBibDocuments;
1750    }
1751
1752    /**
1753     * Merges the item documents with corresponding Bib document.
1754     * The main intention is to make equal count for both Item and Bib documents.
1755     *
1756     * @param workItemDocumentList contains list of Item records
1757     * @param workBibDocumentList  contains list of Bib records.
1758     * @return
1759     */
1760    public List<WorkBibDocument> mergeBibAndItemDocuments(List<WorkItemDocument> workItemDocumentList, List<WorkBibDocument> workBibDocumentList) {
1761
1762        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
1763        for (WorkItemDocument workItemDocument : workItemDocumentList) {
1764//            WorkBibDocument workBibDocument=new WorkBibDocument();
1765            for (WorkBibDocument workBibDoc : workBibDocumentList) {
1766                WorkBibDocument workBibDocument = new WorkBibDocument();
1767                if (workBibDoc.getId().equals(workItemDocument.getBibIdentifier())) {
1768                    //workBibDocument = workBibDoc;
1769                    workBibDocument.setAuthor(workBibDoc.getAuthor());
1770                    workBibDocument.setTitle(workBibDoc.getTitle());
1771                    workBibDocument.setId(workBibDoc.getId());
1772                    workBibDocument.setDocFormat(workBibDoc.getDocFormat());
1773                    workBibDocument.setInstanceIdentifier(workBibDoc.getInstanceIdentifier());
1774                    List<WorkInstanceDocument> workInstanceDocuments = new ArrayList<WorkInstanceDocument>();
1775                    WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
1776                    List<WorkItemDocument> workitemDocuments = new ArrayList<WorkItemDocument>();
1777                    workitemDocuments.add(workItemDocument);
1778                    workInstanceDocument.setItemDocumentList(workitemDocuments);
1779                    workInstanceDocuments.add(workInstanceDocument);
1780                    workBibDocument.setWorkInstanceDocumentList(workInstanceDocuments);
1781                    workBibDocuments.add(workBibDocument);
1782                    break;
1783                }
1784            }
1785
1786        }
1787        return workBibDocuments;
1788    }
1789
1790    /**
1791     * Prepares a list of Bib records based on available Item records.
1792     *
1793     * @param workItemDocuments contains list of Item documents
1794     * @return
1795     * @throws Exception
1796     */
1797    public List<WorkBibDocument> getWorkBibDocuments(List<WorkItemDocument> workItemDocuments) throws Exception {
1798        List<WorkBibDocument> workBibDocumentList = new ArrayList<WorkBibDocument>();
1799        if (workItemDocuments.size() <= 0)
1800            return workBibDocumentList;
1801        String queryString = buildQueryForBib(workItemDocuments);
1802        List<Map<String, Object>> solrHits = getSolrHitsForQuery(queryString);
1803        workBibDocumentList = buildWorkBibDocuments(solrHits);
1804        return workBibDocumentList;
1805    }
1806
1807    /**
1808     * Building solr query with list of Item records
1809     * The solr query is used to get Bib records.
1810     *
1811     * @param workItemDocumentList contains list of Item records
1812     * @return the solr query for Bib records
1813     */
1814    public String buildQueryForBib(List<WorkItemDocument> workItemDocumentList) {
1815        if (workItemDocumentList != null && workItemDocumentList.size() > 0) {
1816            StringBuilder query = new StringBuilder();
1817            StringBuilder idQuery = new StringBuilder();
1818            query.append("(DocType:bibliographic) AND");
1819            int i = 0;
1820            for (; i < workItemDocumentList.size() - 1; i++) {
1821                idQuery.append(("(id:" + workItemDocumentList.get(i).getBibIdentifier()) + ") OR ");
1822            }
1823            idQuery.append("(id:" + workItemDocumentList.get(i).getBibIdentifier() + ")");
1824            if (idQuery.length() > 0)
1825                query.append("(" + idQuery + ")");
1826            return query.toString();
1827        }
1828        return null;
1829    }
1830
1831
1832    /**
1833     * Preparing solr query based on user input fields location and classification scheme.
1834     *
1835     * @param location             contains user input location
1836     * @param classificationScheme user input classification
1837     * @return solr query for total call number count
1838     */
1839    public String buildQueryForTotalCallNumberCount(String location, String classificationScheme, String docType) {
1840        StringBuffer query = new StringBuffer();
1841        query.append("(DocCategory:work)AND(DocType:" + docType + ")AND(DocFormat:oleml)");
1842        if (StringUtils.isNotEmpty(location))
1843            query.append("AND (Location_search:" + location + ")");
1844        if (StringUtils.isNotEmpty(classificationScheme))
1845            query.append("AND(ShelvingSchemeCode_search:" + classificationScheme + ")");
1846        query.append("AND (ShelvingOrder_sort:{* TO *})");
1847        query.append("&sort=ShelvingOrder_sort asc");
1848        return query.toString();
1849    }
1850
1851    /**
1852     * Building solr query for getting Item/Holdings records with call number
1853     *
1854     * @param location             the Item/Holdings location
1855     * @param classificationScheme the Item/Holdings classification
1856     * @param numRows              the number of rows for displaying results
1857     * @param startIndex           index used to specify the
1858     * @return the solr query for browse call numbers.
1859     */
1860    public String buildQueryForBrowseCallNumbers(String location, String classificationScheme, int numRows, int startIndex, String docType) {
1861        StringBuffer query = new StringBuffer();
1862        String queryString = buildCommonQueryForForwardCallNumber(location, classificationScheme, "", docType);
1863        query.append(queryString);
1864        query.append("&fl=");
1865        // query.append("CallNumber_display,ShelvingSchemeCode_display,bibIdentifier,id");
1866        query.append("CallNumber_display,bibIdentifier,id");
1867        query.append("&rows=" + numRows + "&start=" + startIndex);
1868        query.append("&sort=ShelvingOrder_sort asc");
1869        return query.toString();
1870    }
1871
1872    /**
1873     * @param location             the Item/Holdings location.
1874     * @param classificationScheme the Item/Holdings classification.
1875     * @param callNumberBrowseText the user input field callNumberBrowseText.
1876     * @return the solr query for getting forward call number count.
1877     */
1878    public String buildQueryForTotalForwardCallNumberCount(String location, String classificationScheme, String callNumberBrowseText, String docType) {
1879        StringBuffer query = new StringBuffer();
1880        String queryString = buildCommonQueryForForwardCallNumber(location, classificationScheme, callNumberBrowseText, docType);
1881        query.append(queryString);
1882        return query.toString();
1883    }
1884
1885    /**
1886     * @param location             the Item/Holdings location
1887     * @param classificationScheme the Item/Holdings classification
1888     * @param callNumberBrowseText the user input field callNumberBrowseText.
1889     * @return solr query
1890     */
1891    public String buildCommonQueryForForwardCallNumber(String location, String classificationScheme, String callNumberBrowseText, String docType) {
1892        StringBuffer query = new StringBuffer();
1893        //TODO: Supporting other DocType
1894        query.append("(DocCategory:work)AND(DocType:" + docType + ")AND(DocFormat:oleml)");
1895        StringBuffer locations = new StringBuffer();
1896        if (StringUtils.isNotEmpty(location)) {
1897            query.append("AND((Location_display:" + location + "*)");
1898            if (location.contains("-")) {
1899                locations.append(location.split("-")[0]);
1900                locations.append("*");
1901                locations.append(location.split("-")[1]);
1902                location = locations.substring(0,locations.length());
1903            }
1904            query.append("OR(Location_search:" + "" + location.toLowerCase() + "*" + "))");
1905        }
1906        if (StringUtils.isNotEmpty(classificationScheme))
1907            query.append("AND(ShelvingSchemeCode_search:" + classificationScheme + ")");
1908        if (StringUtils.isNotEmpty(callNumberBrowseText))
1909            query.append("AND (ShelvingOrder_sort:{\"" + callNumberBrowseText + "*\" TO *})");
1910        else
1911            query.append("AND (ShelvingOrder_sort:{* TO *})");
1912        return query.toString();
1913    }
1914
1915    public List<WorkBibDocument> getWorkBibRecords(List<LinkedHashMap<String, String>> uuidsMapList) throws Exception {
1916        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
1917        for (LinkedHashMap<String, String> uuidsMap : uuidsMapList) {
1918            WorkBibDocument workBibDocument = new WorkBibDocument();
1919            if (uuidsMap.containsKey(DocType.BIB.getDescription())) {
1920                String bibId = uuidsMap.get(DocType.BIB.getDescription());
1921                if (LOG.isInfoEnabled()) {
1922                    LOG.info(" bibId ---------------> " + bibId);
1923                }
1924                workBibDocument.setId(bibId.toString());
1925                workBibDocument = queryForBibTree(workBibDocument);
1926            } else if (uuidsMap.containsKey(DocType.INSTANCE.getDescription())) {
1927                WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
1928                List<WorkInstanceDocument> workInstanceDocuments = new ArrayList<WorkInstanceDocument>();
1929                String instanceId = uuidsMap.get(DocType.INSTANCE.getDescription());
1930                if (LOG.isInfoEnabled()) {
1931                    LOG.info(" instanceId ---------------> " + instanceId);
1932                }
1933                workInstanceDocument.setId(instanceId.toString());
1934                workInstanceDocument.setInstanceIdentifier(instanceId.toString());
1935                workInstanceDocument = queryForInstanceTree(workInstanceDocument);
1936                workInstanceDocuments.add(workInstanceDocument);
1937                workBibDocument.setId(workInstanceDocument.getBibIdentifier());
1938                workBibDocument.setWorkInstanceDocumentList(workInstanceDocuments);
1939                workBibDocument = queryForBibTree(workBibDocument);
1940            } else if (uuidsMap.containsKey(DocType.ITEM.getDescription())) {
1941                WorkItemDocument workItemDocument = new WorkItemDocument();
1942                List<WorkInstanceDocument> workInstanceDocuments = new ArrayList<WorkInstanceDocument>();
1943                List<WorkItemDocument> workItemDocumentList = new ArrayList<WorkItemDocument>();
1944                WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
1945                String itemId = uuidsMap.get(DocType.ITEM.getDescription());
1946                if (LOG.isInfoEnabled()) {
1947                    LOG.info(" itemId ---------------> " + itemId);
1948                }
1949                workItemDocument.setId(itemId.toString());
1950                workItemDocument = queryForItemTree(workItemDocument);
1951                workItemDocumentList.add(workItemDocument);
1952                workInstanceDocument.setItemDocumentList(workItemDocumentList);
1953                workInstanceDocument.setId(workItemDocument.getInstanceIdentifier());
1954                //workInstanceDocument = queryForInstanceTree(workInstanceDocument);
1955                workInstanceDocuments.add(workInstanceDocument);
1956                workBibDocument.setId(workItemDocument.getBibIdentifier());
1957                workBibDocument.setWorkInstanceDocumentList(workInstanceDocuments);
1958                workBibDocument = queryForBibTree(workBibDocument);
1959            } else if (uuidsMap.containsKey(DocType.HOLDINGS.getDescription())) {
1960                WorkHoldingsDocument workHoldingsDocument = new WorkHoldingsDocument();
1961                List<WorkInstanceDocument> workInstanceDocuments = new ArrayList<WorkInstanceDocument>();
1962                WorkInstanceDocument workInstanceDocument = new WorkInstanceDocument();
1963                String holdingsId = uuidsMap.get(DocType.HOLDINGS.getDescription());
1964                if (LOG.isInfoEnabled()) {
1965                    LOG.info(" holdingsId ---------------> " + holdingsId);
1966                }
1967                workHoldingsDocument.setHoldingsIdentifier(holdingsId);
1968                workInstanceDocument.setHoldingsDocument(workHoldingsDocument);
1969                workInstanceDocument = queryForInstanceTree(workInstanceDocument);
1970                workInstanceDocuments.add(workInstanceDocument);
1971                workBibDocument.setId(workInstanceDocument.getBibIdentifier());
1972                workBibDocument.setWorkInstanceDocumentList(workInstanceDocuments);
1973                workBibDocument = queryForBibTree(workBibDocument);
1974            } else if (uuidsMap.containsKey(DocType.EINSTANCE.getDescription())) {
1975                WorkEInstanceDocument workEInstanceDocument = new WorkEInstanceDocument();
1976                List<WorkEInstanceDocument> workEInstanceDocuments = new ArrayList<WorkEInstanceDocument>();
1977                String instanceId = uuidsMap.get(DocType.EINSTANCE.getDescription());
1978                if (LOG.isInfoEnabled()) {
1979                    LOG.info(" eInstanceId ---------------> " + instanceId);
1980                }
1981                workEInstanceDocument.setId(instanceId.toString());
1982                workEInstanceDocument.setInstanceIdentifier(instanceId.toString());
1983                workEInstanceDocument = queryForEInstanceTree(workEInstanceDocument);
1984                workEInstanceDocuments.add(workEInstanceDocument);
1985                workBibDocument.setId(workEInstanceDocument.getBibIdentifier());
1986                workBibDocument.setWorkEInstanceDocumentList(workEInstanceDocuments);
1987                workBibDocument = queryForBibTree(workBibDocument);
1988            }
1989            workBibDocuments.add(workBibDocument);
1990        }
1991        return workBibDocuments;
1992    }
1993
1994    /**
1995     * @param inputQuery input query
1996     * @param start      start index
1997     * @param numRows    the number of rows for displaying results
1998     * @return the list of solr hits for call number browse
1999     * @throws Exception
2000     */
2001    public List<Map<String, Object>> getSolrHitsForCallNumberBrowse(String inputQuery, int start, int numRows) throws Exception {
2002        SolrServer server;
2003        List<Map<String, Object>> hitsOnPage = new ArrayList<Map<String, Object>>();
2004        server = SolrServerManager.getInstance().getSolrServer();
2005        SolrQuery solrQuery = new SolrQuery();
2006        solrQuery.setQuery(inputQuery);
2007        solrQuery.setIncludeScore(true);
2008        solrQuery.setRows(numRows);
2009        solrQuery.setStart(start);
2010        solrQuery.setSortField("ShelvingOrder_sort", SolrQuery.ORDER.asc);
2011        LOG.info("solr Query -->" + solrQuery.getQuery());
2012        QueryResponse queryResponse = server.query(solrQuery);
2013        SolrDocumentList solrDocumentList = queryResponse.getResults();
2014
2015        for (SolrDocument solrDocument : solrDocumentList) {
2016            hitsOnPage.add(solrDocument);
2017        }
2018        return hitsOnPage;
2019    }
2020
2021    public int getSolrHitsForCallNumberBrowse(String inputQuery) throws Exception {
2022        SolrServer server;
2023        List<Map<String, Object>> hitsOnPage = new ArrayList<Map<String, Object>>();
2024        server = SolrServerManager.getInstance().getSolrServer();
2025        SolrQuery solrQuery = new SolrQuery();
2026        solrQuery.setQuery(inputQuery);
2027        solrQuery.setIncludeScore(true);
2028        solrQuery.setRows(0);
2029        solrQuery.setSortField("ShelvingOrder_sort", SolrQuery.ORDER.asc);
2030        LOG.info("solr Query -->" + solrQuery.getQuery());
2031        QueryResponse queryResponse = server.query(solrQuery);
2032        int numFound = (int) queryResponse.getResults().getNumFound();
2033        return numFound;
2034    }
2035
2036    /**
2037     * Verify solr for the field and return true if exists (Ingest)
2038     * Verify solr for the field other updating record (Update)
2039     *
2040     * @param docType
2041     * @param field
2042     * @param value
2043     * @param id
2044     * @return
2045     * @throws Exception
2046     */
2047    public boolean isFieldValueExists(String docType, String field, String value, String id) throws Exception {
2048        String queryString = "(DocType:" + docType + ")AND(" + field + ":" + value + ")";
2049        QueryResponse queryResponse = getSolrResponse(queryString, field);
2050        long i = queryResponse.getResults().getNumFound();
2051        // verify barcode while updating an item
2052        if (id != null) {
2053            if (i == 1) {      // verify the result record id with given id.
2054                SolrDocumentList solrDocumentList = queryResponse.getResults();
2055                for (SolrDocument solrDocument : solrDocumentList) {
2056                    if (!id.equalsIgnoreCase(solrDocument.getFieldValue("id").toString())) {
2057                        return true;   // other record is having barcode value
2058                    }
2059                }
2060            } else if (i > 1) {
2061                return true;   // other records having same barcode value.
2062            }
2063        } else if (i > 0) {    // verify barcode while ingesting an item.
2064            return true;
2065        }
2066        return false;
2067    }
2068
2069    private QueryResponse getSolrResponse(String queryString, String field) throws SolrServerException {
2070        SolrQuery solrQuery = new SolrQuery();
2071        SolrServer server = SolrServerManager.getInstance().getSolrServer();
2072        solrQuery.setQuery(queryString);
2073        solrQuery.setRows(500);
2074        solrQuery.setFields("id");
2075        return server.query(solrQuery);
2076    }
2077
2078
2079    /**
2080     * Append 'Enumeration', 'Chronology' and 'Copy Number' to item call number based on their availability.
2081     *
2082     * @param itemDocuments
2083     */
2084    public void buildItemCallNumber(List<WorkItemDocument> itemDocuments) {
2085        String itemCallNumber = "";
2086        for (WorkItemDocument workItemDocument : itemDocuments) {
2087            itemCallNumber = workItemDocument.getCallNumber();
2088            if (StringUtils.isNotEmpty(itemCallNumber)) {
2089                itemCallNumber = itemCallNumber + " " + StringUtils.trimToEmpty(workItemDocument.getEnumeration()) + " "
2090                        + StringUtils.trimToEmpty(workItemDocument.getChronology()) + " " + StringUtils
2091                        .trimToEmpty(workItemDocument.getCopyNumber());
2092
2093            }
2094            workItemDocument.setCallNumber(itemCallNumber);
2095        }
2096    }
2097
2098
2099    public List retriveResults(String queryString) {
2100        HttpSolrServer server = null;
2101        ArrayList<HashMap<String, Object>> hitsOnPage = new ArrayList<HashMap<String, Object>>();
2102        try {
2103            String serverUrl = ConfigContext.getCurrentContextConfig().getProperty("ole.docstore.url.base") + "/bib";
2104            server = new HttpSolrServer(serverUrl);
2105        } catch (Exception e) {
2106            LOG.error(e.getMessage(), e);
2107        }
2108        SolrQuery query = new SolrQuery();
2109        query.setQuery(queryString);
2110        query.setIncludeScore(true);
2111        try {
2112            QueryResponse qr = server.query(query);
2113
2114            SolrDocumentList sdl = qr.getResults();
2115
2116
2117            for (SolrDocument d : sdl) {
2118                HashMap<String, Object> values = new HashMap<String, Object>();
2119
2120                for (Iterator<Map.Entry<String, Object>> i = d.iterator(); i.hasNext(); ) {
2121                    Map.Entry<String, Object> e2 = i.next();
2122
2123                    values.put(e2.getKey(), e2.getValue());
2124                }
2125
2126                hitsOnPage.add(values);
2127            }
2128        } catch (SolrServerException e) {
2129            e.printStackTrace();
2130        }
2131        return hitsOnPage;
2132    }
2133
2134
2135    /**
2136     * Retrieve instance,item and bib uuid using item barcode or item uuid.
2137     *
2138     * @param itemBarcode
2139     * @return Map
2140     */
2141    public Map getItemDetails(String itemBarcode, String itemUUID) throws Exception {
2142        LOG.debug("Inside the getItemDetails method");
2143
2144        HashMap itemAndTitleDetails = new HashMap();
2145        HashMap<String, Object> itemvalues = new HashMap<String, Object>();
2146        try {
2147            if (itemBarcode != null && !"".equals(itemBarcode)) {
2148                List<HashMap<String, Object>> documentList = retriveResults("ItemBarcode_display:" + itemBarcode);
2149                if(documentList!=null && documentList.size()>0){
2150                    itemvalues = documentList.get(0);
2151                    if (itemvalues.get("instanceIdentifier") != null) {
2152                        Object object = itemvalues.get("instanceIdentifier");
2153                        if(object instanceof List) {
2154                            List<String> list = (List<String>) itemvalues.get("instanceIdentifier");
2155                            if(list.size() > 0)
2156                                itemAndTitleDetails.put("instanceUuid", list.get(0));
2157                        }
2158                        else
2159                            itemAndTitleDetails.put("instanceUuid", (String) itemvalues.get("instanceIdentifier"));
2160                    }
2161
2162                    if (itemvalues.get("ItemIdentifier_display") != null) {
2163                        Object object = itemvalues.get("ItemIdentifier_display");
2164                        if(object instanceof List) {
2165                            List<String> list = (List<String>) itemvalues.get("ItemIdentifier_display");
2166                            if(list.size() > 0)
2167                                itemAndTitleDetails.put("itemUuid", list.get(0));
2168                        }
2169                        else
2170                            itemAndTitleDetails.put("itemUuid", (String) itemvalues.get("ItemIdentifier_display"));
2171                    }
2172
2173                    if (itemvalues.get("bibIdentifier") != null) {
2174                        Object object = itemvalues.get("bibIdentifier");
2175                        if(object instanceof List) {
2176                            List<String> list = (List<String>) itemvalues.get("bibIdentifier");
2177                            if(list.size() > 0)
2178                                itemAndTitleDetails.put("bibUuid", list.get(0));
2179                        }
2180                        else
2181                            itemAndTitleDetails.put("bibUuid", (String) itemvalues.get("bibIdentifier"));
2182                    }
2183                }
2184            } else {
2185                List<HashMap<String, Object>> documentList = retriveResults("id:" + itemUUID);
2186                if(documentList!=null && documentList.size()>0){
2187                    itemvalues = documentList.get(0);
2188                    if (itemvalues.get("instanceIdentifier") != null) {
2189                        Object object = itemvalues.get("instanceIdentifier");
2190                        if(object instanceof List) {
2191                            List<String> list = (List<String>) itemvalues.get("instanceIdentifier");
2192                            if(list.size() > 0)
2193                                itemAndTitleDetails.put("instanceUuid", list.get(0));
2194                        }
2195                        else
2196                            itemAndTitleDetails.put("instanceUuid", (String) itemvalues.get("instanceIdentifier"));
2197                    }
2198
2199                    if (itemvalues.get("ItemIdentifier_display") != null) {
2200                        Object object = itemvalues.get("ItemIdentifier_display");
2201                        if(object instanceof List) {
2202                            List<String> list = (List<String>) itemvalues.get("ItemIdentifier_display");
2203                            if(list.size() > 0)
2204                                itemAndTitleDetails.put("itemUuid", list.get(0));
2205                        }
2206                        else
2207                            itemAndTitleDetails.put("itemUuid", (String) itemvalues.get("ItemIdentifier_display"));
2208                    }
2209
2210                    if (itemvalues.get("bibIdentifier") != null) {
2211                        Object object = itemvalues.get("bibIdentifier");
2212                        if(object instanceof List) {
2213                            List<String> list = (List<String>) itemvalues.get("bibIdentifier");
2214                            if(list.size() > 0)
2215                                itemAndTitleDetails.put("bibUuid", list.get(0));
2216                        }
2217                        else
2218                            itemAndTitleDetails.put("bibUuid", (String) itemvalues.get("bibIdentifier"));
2219                    }
2220                }
2221            }
2222            return itemAndTitleDetails;
2223        } catch (Exception e) {
2224            LOG.error("Item barcode does not exist.", e);
2225            throw new Exception("Item barcode does not exist.");
2226        }
2227    }
2228
2229    /**
2230     * Retrieve title and author from docstore using solr query.
2231     *
2232     * @param bibUuid
2233     * @return
2234     * @throws Exception
2235     */
2236    public Map getTitleAndAuthorfromBib(String bibUuid) throws Exception {
2237        LOG.debug("Inside the getTitleAndAuthorfromBib method");
2238        Map<String, String> bibInformationMap = new HashMap<String, String>();
2239        try {
2240            List<HashMap<String, Object>> bibDocumentList = QueryServiceImpl.getInstance().retriveResults("id:" + bibUuid);
2241            HashMap<String, Object> bibvalues = bibDocumentList.get(0);
2242            bibInformationMap.put("title", (String) ((ArrayList) bibvalues.get("245a")).get(0));
2243            if (bibvalues.get("100a") != null)
2244                bibInformationMap.put("author", (String) ((ArrayList) bibvalues.get("100a")).get(0));
2245            else
2246                bibInformationMap.put("author", "No Author");
2247            return bibInformationMap;
2248        } catch (Exception e) {
2249            LOG.error("Title does not exist.", e);
2250            throw new Exception("Title does not exist.");
2251        }
2252    }
2253
2254
2255    public Map<String, String> getBibInformation(String bibIdentifier, Map<String, String> searchCriteria) {
2256
2257        HashMap bibDetails = new HashMap();
2258        String title = (String) searchCriteria.get("title");
2259        String author = (String) searchCriteria.get("author");
2260        String publisher = (String) searchCriteria.get("publisher");
2261        String isbn = (String) searchCriteria.get("ISBN");
2262
2263        StringBuffer solrQuery = new StringBuffer();
2264        solrQuery.append("(id:" + bibIdentifier + ") AND ");
2265
2266        if (title != null && !title.equals(""))
2267            solrQuery.append("(Title_search:" + title.toLowerCase() + "*) AND ");
2268        if (author != null && !author.equals(""))
2269            solrQuery.append("(Author_search:" + author.toLowerCase() + "*) AND ");
2270        if (publisher != null && !publisher.equals(""))
2271            solrQuery.append("(Publisher_search:" + publisher.toLowerCase() + "*) AND");
2272        if (isbn != null && !isbn.equals(""))
2273            solrQuery.append("(ISBN_display:" + isbn.toLowerCase() + ") AND");
2274
2275        String query = solrQuery.substring(0, solrQuery.lastIndexOf("AND"));
2276
2277        List<HashMap<String, Object>> documentList = retriveResults("(DocType:bibliographic) AND (" + query + ")");
2278        if (documentList.size() > 0) {
2279            HashMap<String, Object> itemvalues = documentList.get(0);
2280            if (itemvalues.get("Title_display") != null)
2281                bibDetails.put("Title", (String) ((ArrayList) itemvalues.get("Title_display")).get(0));
2282            else if (itemvalues.get("Title_search") != null)
2283                bibDetails.put("Title", (String) ((ArrayList) itemvalues.get("Title_search")).get(0));
2284            if (itemvalues.get("Author_display") != null)
2285                bibDetails.put("Author", (String) ((ArrayList) itemvalues.get("Author_display")).get(0));
2286            else if (itemvalues.get("Author_search") != null)
2287                bibDetails.put("Author", (String) ((ArrayList) itemvalues.get("Author_search")).get(0));
2288            if (itemvalues.get("Publisher_display") != null)
2289                bibDetails.put("Publisher", (String) ((ArrayList) itemvalues.get("Publisher_display")).get(0));
2290            else if (itemvalues.get("Publisher_search") != null)
2291                bibDetails.put("Publisher", (String) ((ArrayList) itemvalues.get("Publisher_search")).get(0));
2292            if (itemvalues.get("ISBN_display") != null)
2293                bibDetails.put("ISBN", (String) ((ArrayList) itemvalues.get("ISBN_display")).get(0));
2294        }
2295
2296        if ((title != null && !title.equals("")) || (author != null && !author.equals("")) || (publisher != null && !publisher.equals("")))
2297            if (bibDetails != null && bibDetails.isEmpty())
2298                return null;
2299
2300        return bibDetails;
2301
2302    }
2303
2304    /**
2305     * This method is for item search in deliver
2306     *
2307     * @param queryString
2308     * @param rowSize
2309     * @return
2310     */
2311    public List retriveResults(String queryString, int rowSize) {
2312        HttpSolrServer server = null;
2313        ArrayList<HashMap<String, Object>> hitsOnPage = new ArrayList<HashMap<String, Object>>();
2314        try {
2315            String serverUrl = ConfigContext.getCurrentContextConfig().getProperty("ole.docstore.url.base") + "/bib";
2316            server = new HttpSolrServer(serverUrl);
2317        } catch (Exception e) {
2318            LOG.error(e.getMessage(), e);
2319        }
2320        SolrQuery query = new SolrQuery();
2321        query.setQuery(queryString);
2322        query.setIncludeScore(true);
2323        query.setRows(rowSize);
2324        try {
2325            QueryResponse qr = server.query(query);
2326
2327            SolrDocumentList sdl = qr.getResults();
2328
2329
2330            for (SolrDocument d : sdl) {
2331                HashMap<String, Object> values = new HashMap<String, Object>();
2332
2333                for (Iterator<Map.Entry<String, Object>> i = d.iterator(); i.hasNext(); ) {
2334                    Map.Entry<String, Object> e2 = i.next();
2335
2336                    values.put(e2.getKey(), e2.getValue());
2337                }
2338
2339                hitsOnPage.add(values);
2340            }
2341        } catch (SolrServerException e) {
2342            e.printStackTrace();
2343        }
2344        return hitsOnPage;
2345    }
2346
2347
2348    /**
2349     * Verifies whether the given field for the given document id has a value from the given value list.
2350     * Returns true if the field has a value.
2351     *
2352     * @param uuid
2353     * @param fieldName
2354     * @param fieldValueList - "," separated values
2355     * @return
2356     * @throws SolrServerException
2357     */
2358    @Override
2359    public boolean verifyFieldValue(String uuid, String fieldName, List<String> fieldValueList) throws SolrServerException {
2360        SolrQuery solrQuery = new SolrQuery();
2361        SolrServer server = SolrServerManager.getInstance().getSolrServer();
2362        solrQuery.setQuery("id:" + uuid);
2363        solrQuery.setFields(fieldName);
2364        QueryResponse queryResponse = server.query(solrQuery);
2365        SolrDocumentList solrDocuments = queryResponse.getResults();
2366
2367        for (String fieldValue : fieldValueList) {
2368            for (SolrDocument solrDocument : solrDocuments) {
2369                if (solrDocument.getFieldValue(fieldName) instanceof String) {
2370                    String fieldVal = "";
2371                    fieldVal = (String) solrDocument.getFieldValue(fieldName);
2372                    if ((fieldVal != null) && (fieldVal.equalsIgnoreCase(fieldValue))) {
2373                        return true;
2374                    }
2375                } else if (solrDocument.getFieldValue(fieldName) instanceof List) {
2376                    List<String> fieldValuesFromSolr = (List<String>) solrDocument.getFieldValue(fieldName);
2377                    for (String fieldVal : fieldValuesFromSolr) {
2378                        if (fieldVal.equalsIgnoreCase(fieldValue)) {
2379                            return true;
2380                        }
2381                    }
2382                }
2383            }
2384        }
2385        return false;
2386    }
2387
2388    /**
2389     * @param instanceIds
2390     * @return
2391     * @throws SolrServerException
2392     */
2393    @Override
2394    public List<String> getItemIdsForInstanceIds(List<String> instanceIds) throws SolrServerException {
2395
2396        List<String> itemIds = new ArrayList<String>();
2397
2398        for (String uuid : instanceIds) {
2399            SolrQuery solrQuery = new SolrQuery();
2400            SolrServer server = SolrServerManager.getInstance().getSolrServer();
2401            solrQuery.setQuery("id:" + uuid);
2402            solrQuery.setFields("itemIdentifier");
2403            QueryResponse queryResponse = server.query(solrQuery);
2404            SolrDocumentList solrDocuments = queryResponse.getResults();
2405            for (SolrDocument solrDocument : solrDocuments) {
2406                if (solrDocument.getFieldValue("itemIdentifier") instanceof String) {
2407                    String fieldVal = (String) solrDocument.getFieldValue("itemIdentifier");
2408                    itemIds.add(fieldVal);
2409                } else if (solrDocument.getFieldValue("itemIdentifier") instanceof List) {
2410                    List<String> fieldValuesFromSolr = (List<String>) solrDocument.getFieldValue("itemIdentifier");
2411                    itemIds.addAll(fieldValuesFromSolr);
2412                }
2413            }
2414        }
2415        return itemIds;
2416    }
2417
2418    @Override
2419    public List<WorkEHoldingsDocument> getEHoldingsDocuments(SearchParams searchParams) throws Exception {
2420        List<WorkEHoldingsDocument> workEHoldingsDocuments;
2421        List<Map<String, Object>> solrHits = getSolrHitsWithParams(searchParams);
2422        workEHoldingsDocuments = buildWorkEHoldingDocuments(solrHits);
2423        return workEHoldingsDocuments;
2424    }
2425
2426    private List<WorkEHoldingsDocument> buildWorkEHoldingDocuments(List<Map<String, Object>> solrHits) {
2427        List<WorkEHoldingsDocument> workEHoldingsDocuments = new ArrayList<>();
2428        for (Map<String, Object> hitsOnPageItr : solrHits) {
2429            WorkEHoldingsDocument workEHoldingsDocument = new WorkEHoldingsDocument();
2430            Map map = hitsOnPageItr;
2431            Set keys = map.keySet();
2432            for (Object key : keys) {
2433                if (key.toString().equalsIgnoreCase("id")) {
2434                    workEHoldingsDocument.setHoldingsIdentifier((String) map.get(key));
2435                }
2436                if (key.toString().equalsIgnoreCase("LocalId_display")) {
2437                    Object value = map.get(key);
2438                    if (value instanceof String) {
2439                        workEHoldingsDocument.setLocalId((String) value);
2440                    }
2441                }
2442                if (key.toString().equalsIgnoreCase("bibIdentifier")) {
2443                    Object value = map.get(key);
2444                    if (value instanceof String) {
2445                        workEHoldingsDocument.setBibIdentifier((String) value);
2446                    } else if (value instanceof List) {
2447                        ArrayList<String> list = (ArrayList<String>) value;
2448                        workEHoldingsDocument.setBibIdentifier(list.get(0));
2449                    }
2450                }
2451                if (key.toString().equalsIgnoreCase("instanceIdentifier")) {
2452                    Object value = map.get(key);
2453                    if (value instanceof String) {
2454                        workEHoldingsDocument.setInstanceIdentifier((String) value);
2455                    } else if (value instanceof List) {
2456                        ArrayList<String> list = (ArrayList<String>) value;
2457                        workEHoldingsDocument.setInstanceIdentifier(list.get(0));
2458                    }
2459                }
2460                if (key.toString().equalsIgnoreCase("Imprint_display")) {
2461                    Object value = map.get(key);
2462                    if (value instanceof String) {
2463                        workEHoldingsDocument.setImprint((String) value);
2464                    } else if (value instanceof List) {
2465                        ArrayList<String> list = (ArrayList<String>) value;
2466                        workEHoldingsDocument.setImprint(list.get(0));
2467                    }
2468                }
2469                if (key.toString().equalsIgnoreCase("AccessStatus_display")) {
2470                    Object value = map.get(key);
2471                    if (value instanceof String) {
2472                        workEHoldingsDocument.setAccessStatus((String) value);
2473                    } else if (value instanceof List) {
2474                        ArrayList<String> list = (ArrayList<String>) value;
2475                        workEHoldingsDocument.setAccessStatus(list.get(0));
2476                    }
2477                }
2478                if (key.toString().equalsIgnoreCase("Platform_display")) {
2479                    Object value = map.get(key);
2480                    if (value instanceof String) {
2481                        workEHoldingsDocument.setPlatForm((String) value);
2482                    } else if (value instanceof List) {
2483                        ArrayList<String> list = (ArrayList<String>) value;
2484                        workEHoldingsDocument.setPlatForm(list.get(0));
2485                    }
2486                }
2487                if (key.toString().equalsIgnoreCase("StatisticalSearchingFullValue_display")) {
2488                    Object value = map.get(key);
2489                    if (value instanceof String) {
2490                        workEHoldingsDocument.setStatisticalCode((String) value);
2491                    } else if (value instanceof List) {
2492                        ArrayList<String> list = (ArrayList<String>) value;
2493                        workEHoldingsDocument.setStatisticalCode(list.get(0));
2494                    }
2495                }
2496                if (key.toString().equalsIgnoreCase("SubscriptionStatus_display")) {
2497                    Object value = map.get(key);
2498                    if (value instanceof String) {
2499                        workEHoldingsDocument.setSubscriptionStatus((String) value);
2500                    } else if (value instanceof List) {
2501                        ArrayList<String> list = (ArrayList<String>) value;
2502                        workEHoldingsDocument.setSubscriptionStatus(list.get(0));
2503                    }
2504                }
2505                if (key.toString().equalsIgnoreCase("bibIdentifier")) {
2506                    Object value = map.get(key);
2507                    if (value instanceof String) {
2508                        workEHoldingsDocument.setBibIdentifier((String) value);
2509                    } else if (value instanceof List) {
2510                        ArrayList<String> list = (ArrayList<String>) value;
2511                        workEHoldingsDocument.setBibIdentifier(list.get(0));
2512                    }
2513                }
2514                if (key.toString().equalsIgnoreCase("staffOnlyFlag")) {
2515                    Object value = map.get(key);
2516                    if (value instanceof String) {
2517                        workEHoldingsDocument.setStaffOnly((String) value);
2518                    } else if (value instanceof List) {
2519                        ArrayList<String> list = (ArrayList<String>) value;
2520                        workEHoldingsDocument.setStaffOnly(list.get(0));
2521                    }
2522                }
2523
2524
2525            }
2526            workEHoldingsDocuments.add(workEHoldingsDocument);
2527        }
2528        return workEHoldingsDocuments;
2529    }
2530
2531    /**
2532     * Show additional linked Bib count based on input Bib UUID list
2533     *
2534     * @param bibUUIDList
2535     * @return
2536     */
2537    private String getLinkedBibCount(List<String> bibUUIDList) {
2538        String showBibMessage = "";
2539        if (bibUUIDList != null) {
2540            if ((bibUUIDList.size() > 1)) {
2541                // showBibMessage = (bibUUIDList.size() - 1) + " more Bib(s)";
2542                showBibMessage = "Bound with Bibs(" + (bibUUIDList.size()) + ")";
2543            } else if ((bibUUIDList.size() == 1)) {
2544                //  showBibMessage = "No more Bibs";
2545            }
2546        }
2547        return showBibMessage;
2548    }
2549
2550    public List<String> getBibUuidsForBibMatchPoints(String code, String value) throws SolrServerException {
2551        List<String> uuids = new ArrayList<>();
2552        SolrQuery solrQuery = new SolrQuery();
2553        SolrServer server = SolrServerManager.getInstance().getSolrServer();
2554        String query = null;
2555        if ("001".equals(code)) {
2556            query = "id" + ":\"wbm-" + value + "\"";
2557        } else {
2558            query = code + ":\"" + value + "\"";
2559        }
2560        solrQuery.setQuery(query);
2561        solrQuery.setFields("id");
2562        QueryResponse queryResponse = server.query(solrQuery);
2563        SolrDocumentList solrDocuments = queryResponse.getResults();
2564        if (solrDocuments.size() > 0) {
2565            for (SolrDocument solrDoc : solrDocuments) {
2566                uuids.add((String) solrDoc.getFieldValue("id"));
2567            }
2568        }
2569        return uuids;
2570    }
2571
2572    private String getModifiedText(String searchText) {
2573        StringBuffer modifiedText = new StringBuffer();
2574        StringCharacterIterator stringCharacterIterator = new StringCharacterIterator(searchText);
2575        char character = stringCharacterIterator.current();
2576        while (character != CharacterIterator.DONE) {
2577
2578            if (character == '\\') {
2579                modifiedText.append("\\\\");
2580            } else if (character == '?') {
2581                modifiedText.append("\\?");
2582            } else if (character == '*' && StringUtils.isEmpty(modifiedText.toString())) {
2583                modifiedText.append("\\*");
2584            } else if (character == '+') {
2585                modifiedText.append("\\+");
2586            } else if (character == ':') {
2587                modifiedText.append("\\:");
2588            } else if (character == '{') {
2589                modifiedText.append("\\{");
2590            } else if (character == '}') {
2591                modifiedText.append("\\}");
2592            } else if (character == '[') {
2593                modifiedText.append("\\[");
2594            } else if (character == ']') {
2595                modifiedText.append("\\]");
2596            } else if (character == '(') {
2597                modifiedText.append("\\(");
2598            } else if (character == ')') {
2599                modifiedText.append("\\)");
2600            } else if (character == '^') {
2601                modifiedText.append("\\^");
2602            } else if (character == '~') {
2603                modifiedText.append("\\~");
2604            } else if (character == '-') {
2605                modifiedText.append("\\-");
2606            } else if (character == '!') {
2607                modifiedText.append("\\!");
2608            } else if (character == '\'') {
2609                modifiedText.append("\\'");
2610            } else if (character == '@') {
2611                modifiedText.append("\\@");
2612            } else if (character == '#') {
2613                modifiedText.append("\\#");
2614            } else if (character == '$') {
2615                modifiedText.append("\\$");
2616            } else if (character == '%') {
2617                modifiedText.append("\\%");
2618            } else {
2619                //the char is not a special one
2620                //add it to the result as is
2621                modifiedText.append(character);
2622            }
2623            character = stringCharacterIterator.next();
2624        }
2625
2626        return modifiedText.toString().toLowerCase();
2627    }
2628    public List<String>  getBibDetailsForPurchaseOrderSearch(Map<String, String> searchCriteria) {
2629
2630        List<String> finallist = new ArrayList<>();
2631        String solrQuery;
2632
2633        StringBuffer query = new StringBuffer("");
2634        String title = ((String) searchCriteria.get("title"))!=null?searchCriteria.get("title") :"";
2635        String author = ((String) searchCriteria.get("author"))!=null?searchCriteria.get("author") :"";
2636        String issn = ((String) searchCriteria.get("issn"))!=null?searchCriteria.get("issn") :"";
2637        if (title.equalsIgnoreCase("")) {
2638            String searchText;
2639
2640            searchText = "(*:*)";
2641            query.append("(Title_search:"+searchText+")AND");
2642        } else {
2643            String searchText;
2644            searchText=getModifiedText(title);
2645            searchText.replaceAll(" ", "+");
2646            String searchTextVal=null;
2647            if (searchText.length() > 0) {
2648                searchTextVal = searchText.trim().replace(" ", " AND ");
2649            }
2650
2651            query.append("(Title_search:("+searchTextVal+"))AND");
2652        }
2653        if (author.equalsIgnoreCase("")) {
2654            String searchText;
2655
2656            searchText = "(*:*)";
2657            query.append("(Author_search:"+searchText+")AND");
2658        } else {
2659            String searchText;
2660            searchText=getModifiedText(author);
2661            searchText.replaceAll(" ", "+");
2662            String searchTextVal=null;
2663            if (searchText.length() > 0) {
2664                searchTextVal = searchText.trim().replace(" ", " AND ");
2665            }
2666            query.append("(Author_search:("+searchTextVal+"))AND");
2667        }
2668        if (issn.equalsIgnoreCase("")) {
2669            String searchText;
2670            searchText = "(*:*)";
2671            query.append("(ISSN_search:"+searchText+")AND");
2672        } else {
2673            String searchText;
2674            searchText=getModifiedText(issn);
2675            String searchTextVal=null;
2676            searchText.replaceAll(" ", "+");
2677            if (searchText.length() > 0) {
2678                searchTextVal = searchText.trim().replace(" ", " AND ");
2679            }
2680            query.append("(ISSN_search:("+searchTextVal+"))AND");
2681        }
2682
2683
2684        if (!query.toString().equals("")) {
2685            query = new StringBuffer(query.substring(0, query.lastIndexOf("AND")));
2686            solrQuery=query.toString();
2687            int rowSize=10;
2688            if (searchCriteria.get("rowSize") != null)
2689                rowSize = Integer.parseInt(searchCriteria.get("rowSize"));
2690            try {
2691                List<HashMap<String, Object>> documentList = QueryServiceImpl.getInstance().retriveResults("(DocType:bibliographic) AND (" + solrQuery + ")", rowSize);
2692
2693                for (int i = 0; i < documentList.size(); i++) {
2694                    HashMap<String, Object> itemvalues = documentList.get(i);
2695                    if (itemvalues.get("id") != null) {
2696                        finallist.add((String) itemvalues.get("id"));
2697                    }
2698                }
2699
2700            } catch (Exception e) {
2701
2702                LOG.info("Exception ------> " + e);
2703
2704            }
2705
2706        }
2707        return finallist;
2708
2709    }
2710
2711
2712}