package com.lemans.ds.search import com.lemans.services.LemansManager import com.opencsv.CSVWriter import grails.transaction.Transactional import javax.servlet.ServletResponse @Transactional class GenericSearchService extends LemansManager { private static final String FILTER_SQL = 'EXEC dbo.spResponsiveSearchFilters @filterType = ?, @selectedParameters = ?' private static final String FILTER_OPTIONS_SQL = 'EXEC dbo.spResponsiveSearchFilters_V1 @filterType = ?, @selectedParameters = ?' private static final String FILTER_RESULTS_SQL = 'EXEC dbo.spResponsiveSearchResults @filterType = ?, @selectedParameters = ?, ' + '@offset = ?, @pagesize = ?, @sortBy = ?, @mode = ?, @export = ?' private final FilterXmlGenerator filterXmlGenerator = new FilterXmlGenerator() def commonService /** * Returns Filters and their values. * * @param searchType * @param filterType * @param criteria Map * * @return Map containing results and totalRecords */ Map filterOptions(String searchType, String filterType, Map criteria) { String xml = filterXmlGenerator.generateXml(searchType, filterType, criteria) List data = sql().callWithAllRows(FILTER_OPTIONS_SQL, [filterType, xml]) { } [results: data ? data[0] : [], totalRecords: data ? data[0].size() : 0] } /** * Returns Filters and their values. * @param searchType * @param filterType * @param criteria Map * @return XML containing filter results */ String filters(String searchType, String filterType, Map criteria) { String xml = filterXmlGenerator.generateXml(searchType, filterType, criteria) queryForXml(FILTER_SQL, [filterType, xml]) } /** * Returns Results with totalRecords. * * @param searchType * * @param filterType * * @param criteria Map * * @return Map containing results and totalRecords */ Map searchResults(String searchType, String filterType, Map criteria) { List data = genericSearchResults(searchType, filterType, criteria) [results: data ? data[0] : [], totalRecords: data ? (data[1][0]?.totalRecords ?: 0) : 0] } /** * Returns Results with totalRecords. * * @param searchType * * @param filterType * * @param criteria Map * * @return Map containing resultXml and totalRecords */ Map searchResultsByMode(String searchType, String filterType, Map criteria) { List data = genericSearchResults(searchType, filterType, criteria) Integer totalRecords = data ? data[1][0].totalRecords : 0 [resultXML: totalRecords ? data[0][0]?.get("") : '', totalRecords: totalRecords] } void downloadCSVFile(List results, ServletResponse response, String fileName) { response.setHeader 'Content-disposition', "attachment; filename=${fileName}.csv" response.contentType = 'application/csv' generateCsv(results, response) } private List genericSearchResults(String searchType, String filterType, Map criteria) { List parameters = parameters(searchType, filterType, criteria) commonService.transformClob(sql().callWithAllRows(FILTER_RESULTS_SQL, parameters) { }) } private List parameters(String searchType, String filterType, Map criteria) { String xml = filterXmlGenerator.generateXml(searchType, filterType, criteria) [filterType, xml, criteria.offset ?: 0, criteria.pageSize ?: 25, criteria.sorting ?: null, criteria.mode, criteria.export] } private void generateCsv(List results, ServletResponse response) { CSVWriter csvWriter = new CSVWriter(response.writer) String[] header = results[0]?.keySet() List output = [] output << header results.each { Map it -> String[] temp = it.values() output << temp } csvWriter.writeAll(output) csvWriter.close() } }