Index: branches/pssGrails3/grails-app/utils/com/lemanscorp/search/SearchUtils.groovy =================================================================== diff -u -r8887 -r8890 --- branches/pssGrails3/grails-app/utils/com/lemanscorp/search/SearchUtils.groovy (.../SearchUtils.groovy) (revision 8887) +++ branches/pssGrails3/grails-app/utils/com/lemanscorp/search/SearchUtils.groovy (.../SearchUtils.groovy) (revision 8890) @@ -22,7 +22,8 @@ def result = '' try { - def core = (serverURL.contains("/${productCore}/") ? "${productCore}" : serverURL.contains("/${partCore}/") ? "${partCore}" : '') + def core = (serverURL.contains("/${productCore}/") ? "${productCore}" : serverURL.contains("/${partCore}/") ? "${partCore}" : + '') log.debug "completeUrl ${core}=>:" + serverURL + (queryParams ? '?' + queryParams : '') def url = new URL(serverURL) @@ -57,7 +58,7 @@ result } - String getHostName() { + String getHostName() { String hostName = 'localhost' try { hostName = InetAddress.localHost().hostName() Index: branches/pssGrails3/grails-app/services/com/lemanscorp/search/solr/SolrService.groovy =================================================================== diff -u -r8884 -r8890 --- branches/pssGrails3/grails-app/services/com/lemanscorp/search/solr/SolrService.groovy (.../SolrService.groovy) (revision 8884) +++ branches/pssGrails3/grails-app/services/com/lemanscorp/search/solr/SolrService.groovy (.../SolrService.groovy) (revision 8890) @@ -1,445 +1,452 @@ package com.lemanscorp.search.solr -import grails.util.Holders +import com.lemanscorp.search.SearchUtils import grails.converters.JSON +import grails.util.Holders +import org.apache.commons.logging.LogFactory +import javax.annotation.Resource import java.util.regex.Matcher -import javax.annotation.Resource; - -import org.apache.commons.logging.LogFactory - -import com.lemanscorp.search.SearchUtils - class SolrService { - static transactional = false + static transactional = false - def solrRequestService + def solrRequestService - def solrResponseService + def solrResponseService - @Resource(name="solrPrefix") - String solrPrefix + @Resource(name = 'solrPrefix') + String solrPrefix - def productCore = Holders.config.search.product.core + def productCore = Holders.config.search.product.core - def partCore = Holders.config.search.part.core + def partCore = Holders.config.search.part.core - def productGroup = Holders.config.search.productGroup.core + def productGroup = Holders.config.search.productGroup.core - def inactivePart = Holders.config.search.inactivePart.core + def inactivePart = Holders.config.search.inactivePart.core - def masterProduct = Holders.config.search.masterProduct.core + def masterProduct = Holders.config.search.masterProduct.core - SearchUtils searchUtils =new SearchUtils() + SearchUtils searchUtils = new SearchUtils() - def searchTermLogger = LogFactory.getLog("searchTermsLogger") + def searchTermLogger = LogFactory.getLog('searchTermsLogger') - def programCriteriaQuery(params) { - Map criteria = getCriteria(params) + def programCriteriaQuery(params) { + Map criteria = getCriteria(params) - String core = findCore(criteria.renderers) - String filter = solrRequestService.createFilterQS(params, criteria.selectedFacetsMap, criteria.domainConfigFacets, core) - String fqQueryString = "fq=${filter.encodeAsURL().toString()}" - String fl = '' - String format = 'xml' - String queryParams = buildQuery(params, criteria.sortBys, fl, fqQueryString, format) - String totalRecordsString = 'numFound="0"' - String solrResponse = createDisMaxCriteriaAndCallSolr(queryParams, criteria.term, criteria.sortedRelevency, core, totalRecordsString) - solrResponse - } + String core = findCore(criteria.renderers) + String filter = solrRequestService.createFilterQS(params, criteria.selectedFacetsMap, criteria.domainConfigFacets, core) + String fqQueryString = "fq=${filter.encodeAsURL().toString()}" + String fl = '' + String format = 'xml' + String queryParams = buildQuery(params, criteria.sortBys, fl, fqQueryString, format) + String totalRecordsString = 'numFound="0"' + String solrResponse = createDisMaxCriteriaAndCallSolr(queryParams, criteria.term, criteria.sortedRelevency, core, + totalRecordsString) + solrResponse + } - def runQuery(params) { - Map criteria = getCriteria(params) + def runQuery(params) { + Map criteria = getCriteria(params) - String core = findCore(criteria.renderers) - String filter = solrRequestService.createFilterQS(params, criteria.selectedFacetsMap, criteria.domainConfigFacets, core) - String facetFieldsQuery = solrRequestService.createSelectedAndNextFCsQS(params, criteria.selectedFacets, criteria.nextFacets) - String fqQueryString = "fq=${filter.encodeAsURL().toString()}${facetFieldsQuery}" - String format = 'json' - String fl = 'score' - String queryParams = buildQuery(params, criteria.sortBys, fl, fqQueryString, format) - String totalRecordsString = '"numFound":0' - String solrResponse = createDisMaxCriteriaAndCallSolr(queryParams, criteria.term, criteria.sortedRelevency, core, totalRecordsString) + String core = findCore(criteria.renderers) + String filter = solrRequestService.createFilterQS(params, criteria.selectedFacetsMap, criteria.domainConfigFacets, core) + String facetFieldsQuery = solrRequestService.createSelectedAndNextFCsQS(params, criteria.selectedFacets, criteria.nextFacets) + String fqQueryString = "fq=${filter.encodeAsURL().toString()}${facetFieldsQuery}" + String format = 'json' + String fl = 'score' + String queryParams = buildQuery(params, criteria.sortBys, fl, fqQueryString, format) + String totalRecordsString = '"numFound":0' + String solrResponse = createDisMaxCriteriaAndCallSolr(queryParams, criteria.term, criteria.sortedRelevency, core, + totalRecordsString) - SortBy sortBy = populateSortBy(criteria.sortBys, params) - PartSearchResponse psResponse = new PartSearchResponse() - psResponse.header.sortBy = sortBy - solrResponseService.processJSON(params, criteria.selectedFacetsMap, criteria.nextFacets, solrResponse, criteria.renderers, criteria.sortBys, criteria.hitlistDoc, psResponse, criteria.selectedConfigFacets, criteria.domainConfigFacets, criteria.uiConfig) - } + SortBy sortBy = populateSortBy(criteria.sortBys, params) + PartSearchResponse psResponse = new PartSearchResponse() + psResponse.header.sortBy = sortBy + solrResponseService.processJSON(params, criteria.selectedFacetsMap, criteria.nextFacets, solrResponse, criteria.renderers, + criteria.sortBys, criteria.hitlistDoc, psResponse, criteria.selectedConfigFacets, criteria.domainConfigFacets, criteria + .uiConfig) + } - private Map getCriteria(params) { - Map selectedFacetsMap = solrRequestService.getSelectedFacets(params) - Set selectedFacets = selectedFacetsMap.keySet() - def term = nullToGenricSearch(params.q) - Expando uiConfig = solrRequestService.getUIConfig(params.docType, params.dm, selectedFacetsMap, term, params.locale) - List domainConfigFacets = uiConfig.domainFacets ?: [] - List selectedConfigFacets = uiConfig.selectedFacets ?: [] - List nextFacets = uiConfig.nextFacets ?: [] - List renderers = uiConfig.renderers ?: [] - List sortBys = uiConfig.sortBys ?: [] - List sortedRelevency = uiConfig.relevancy.list().sort{ -it.weight.toDouble() } - def hitlistDoc = uiConfig.hitlistDoc ?: [] - [selectedFacetsMap: selectedFacetsMap, selectedFacets: selectedFacets, term: term, uiConfig: uiConfig, domainConfigFacets: domainConfigFacets, - selectedConfigFacets: selectedConfigFacets, nextFacets: nextFacets, renderers: renderers, sortBys: sortBys, sortedRelevency: sortedRelevency, - hitlistDoc: hitlistDoc] - } + private Map getCriteria(params) { + Map selectedFacetsMap = solrRequestService.getSelectedFacets(params) + Set selectedFacets = selectedFacetsMap.keySet() + def term = nullToGenricSearch(params.q) + Expando uiConfig = solrRequestService.getUIConfig(params.docType, params.dm, selectedFacetsMap, term, params.locale) + List domainConfigFacets = uiConfig.domainFacets ?: [] + List selectedConfigFacets = uiConfig.selectedFacets ?: [] + List nextFacets = uiConfig.nextFacets ?: [] + List renderers = uiConfig.renderers ?: [] + List sortBys = uiConfig.sortBys ?: [] + List sortedRelevency = uiConfig.relevancy.list().sort { -it.weight.toDouble() } + def hitlistDoc = uiConfig.hitlistDoc ?: [] + [selectedFacetsMap: selectedFacetsMap, selectedFacets: selectedFacets, term: term, uiConfig: uiConfig, + domainConfigFacets: domainConfigFacets, selectedConfigFacets: selectedConfigFacets, nextFacets: nextFacets, + renderers: renderers, sortBys: sortBys, sortedRelevency: sortedRelevency, hitlistDoc: hitlistDoc] + } - String processTerm(String term) { - if (term != "*:*") { - //searchTermLogger.info('searchTerm:' + term) - term = term.encodeAsURL() - } - term - } + String processTerm(String term) { + if (term != '*:*') { + //searchTermLogger.info('searchTerm:' + term) + term = term.encodeAsURL() + } + term + } - private String buildQuery(params, List sortBys, String fl, String fqQueryString, String format) { - def pagination = solrResponseService.getPaginationQueryString(params.rows, params.offset) - def sortOption = solrResponseService.getSortingQS(params.sb, sortBys) - fl = addOutfields(params, fl) - def queryParams = "&${fqQueryString}&wt=${format}${pagination}${sortOption}&fl=${fl}&spellcheck=true&spellcheck.collate=true" - return queryParams - } + private String buildQuery(params, List sortBys, String fl, String fqQueryString, String format) { + def pagination = solrResponseService.getPaginationQueryString(params.rows, params.offset) + def sortOption = solrResponseService.getSortingQS(params.sb, sortBys) + fl = addOutfields(params, fl) + def queryParams = "&${fqQueryString}&wt=${format}${pagination}${sortOption}&fl=${fl}&spellcheck=true&spellcheck.collate=true" + queryParams + } - private String addOutfields(params, String fl) { - if(params.outfields) { - def outfields = params.list('outfields') - outfields?.findAll{it?.trim() != ''}?.collect {outfield-> - if (fl != '') { fl+= ',' } - fl += "${outfield}" - } - } else { - fl += ',*' - } - return fl - } + private String addOutfields(params, String fl) { + if (params.outfields) { + def outfields = params.list('outfields') + outfields?.findAll { it?.trim() != '' }?.collect { outfield -> + if (fl != '') { fl += ',' } + fl += "${outfield}" + } + } else { + fl += ',*' + } + fl + } - private String findCore(List renderers) { - def core - renderers.each { renderer-> - switch (renderer) { - case 'part': - core = "${partCore}" - break; - case 'inactivePart': - core = "${inactivePart}" - break; - case 'fitment': - //still go to part core but do not bring back docs - core = "${partCore}" - break; - case 'productGroup': - core = "${productGroup}" - break; - case 'masterProduct': - core = "${masterProduct}" - break - default: - core = "${productCore}" - break; - } - } - return core - } + private String findCore(List renderers) { + def core + renderers.each { renderer -> + switch (renderer) { + case 'part': + core = "${partCore}" + break + case 'inactivePart': + core = "${inactivePart}" + break + case 'fitment': + //still go to part core but do not bring back docs + core = "${partCore}" + break + case 'productGroup': + core = "${productGroup}" + break + case 'masterProduct': + core = "${masterProduct}" + break + default: + core = "${productCore}" + break + } + } + core + } - private String createDisMaxCriteriaAndCallSolr(String queryParams, String term, List sortedRelevency, String core, String totalRecordsString) { + private String createDisMaxCriteriaAndCallSolr(String queryParams, String term, List sortedRelevency, String core, String + totalRecordsString) { - def solrResponse - def disMaxQuery + def solrResponse + def disMaxQuery - String coreUrl = solrPrefix + "/${core}/select/" - term = processTerm(term) + String coreUrl = solrPrefix + "/${core}/select/" + term = processTerm(term) - if (false) { //IST-6626: if search term contains a '-' - if (core == 'inactivePart') { - disMaxQuery = createDisMaxCriteriaForInactivePunctuatedPartNumber() - queryParams = "q=${term.toUpperCase()}&${disMaxQuery}&" + queryParams - } else { - disMaxQuery = createDisMaxCriteriaForPunctuatedPartNumber() - queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams - } - solrResponse = searchUtils.callSolr(coreUrl, queryParams) - } else { //search term without '-' in it (normal way) - if (core=='inactivePart') { - disMaxQuery=createDisMaxCriteriaForInactivePartNumber() - queryParams="q=${term.toUpperCase()}&${disMaxQuery}&" + queryParams - } else { - disMaxQuery = createDisMaxGeneralCriteria(sortedRelevency) - queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams - } - solrResponse = searchUtils.callSolr(coreUrl, queryParams) - } + if (false) { //IST-6626: if search term contains a '-' + if (core == 'inactivePart') { + disMaxQuery = createDisMaxCriteriaForInactivePunctuatedPartNumber() + queryParams = "q=${term.toUpperCase()}&${disMaxQuery}&" + queryParams + } else { + disMaxQuery = createDisMaxCriteriaForPunctuatedPartNumber() + queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams + } + solrResponse = searchUtils.callSolr(coreUrl, queryParams) + } else { //search term without '-' in it (normal way) + if (core == 'inactivePart') { + disMaxQuery = createDisMaxCriteriaForInactivePartNumber() + queryParams = "q=${term.toUpperCase()}&${disMaxQuery}&" + queryParams + } else { + disMaxQuery = createDisMaxGeneralCriteria(sortedRelevency) + queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams + } + solrResponse = searchUtils.callSolr(coreUrl, queryParams) + } - def numFound + def numFound - if (solrResponse.contains(totalRecordsString)) { numFound = 0 } //"numFound":0 for JSON and 'numFound="0"' for XML + if (solrResponse.contains(totalRecordsString)) { numFound = 0 } //"numFound":0 for JSON and 'numFound="0"' for XML - //IN CASE OF NO RESUTLS, SEARCH BY DISMAX_TEXT_TERM (use white space tokenizer) - if(solrResponse.toString() == '0' && core != 'inactivePart'){ - disMaxQuery = createDisMaxTermCriteria(sortedRelevency) - queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams - solrResponse = searchUtils.callSolr(coreUrl, queryParams) - } - solrResponse - } + //IN CASE OF NO RESUTLS, SEARCH BY DISMAX_TEXT_TERM (use white space tokenizer) + if (solrResponse.toString() == '0' && core != 'inactivePart') { + disMaxQuery = createDisMaxTermCriteria(sortedRelevency) + queryParams = "q=${term.toLowerCase()}&${disMaxQuery}&" + queryParams + solrResponse = searchUtils.callSolr(coreUrl, queryParams) + } + solrResponse + } - private SortBy populateSortBy(List sortBys, params) { - Expando matchingSortBy = sortBys.find{it.id as String == params.sb} - SortBy sortBy = new SortBy(type: "sb", name: "") + private SortBy populateSortBy(List sortBys, params) { + Expando matchingSortBy = sortBys.find { it.id as String == params.sb } + SortBy sortBy = new SortBy(type: 'sb', name: '') - // if sort by is already selected then populate it in header - if(matchingSortBy) { - sortBy.id = matchingSortBy.id as int - sortBy.name = matchingSortBy.name - } else { - Expando defaultSortBy = sortBys.find{it.defaultSortBy == true} - if(defaultSortBy) { - sortBy.id = defaultSortBy.id - sortBy.name = defaultSortBy.name - } - } - //populate the sort by options available to select for next search. - sortBys.each{sb-> - sortBy.options.add(new Value(id: sb.id.toString(), name:sb.name.toString())) - } - return sortBy - } + // if sort by is already selected then populate it in header + if (matchingSortBy) { + sortBy.id = matchingSortBy.id as int + sortBy.name = matchingSortBy.name + } else { + Expando defaultSortBy = sortBys.find { it.defaultSortBy == true } + if (defaultSortBy) { + sortBy.id = defaultSortBy.id + sortBy.name = defaultSortBy.name + } + } + //populate the sort by options available to select for next search. + sortBys.each { sb -> + sortBy.options.add(new Value(id: sb.id.toString(), name: sb.name.toString())) + } + sortBy + } - def createDisMaxCriteriaForPunctuatedPartNumber(){ - return createDisMaxQuery(['punctuatedPartNumber_text', 'vendorPunctuatedPartNumber_text', 'oemPartNumber_text', 'oemPunctuatedPartNumber_text', 'xrefPunctuatedPartNumber_text'].join('+')) - } + def createDisMaxCriteriaForPunctuatedPartNumber() { + createDisMaxQuery(['punctuatedPartNumber_text', 'vendorPunctuatedPartNumber_text', 'oemPartNumber_text', + 'oemPunctuatedPartNumber_text', 'xrefPunctuatedPartNumber_text'].join('+')) + } - def createDisMaxCriteriaForInactivePunctuatedPartNumber(){ - return createDisMaxQuery(['punctuatedPartNumber', 'vendorPunctuatedPartNumber', 'oemPunctuatedPartNumber'].join('+')) - } + def createDisMaxCriteriaForInactivePunctuatedPartNumber() { + createDisMaxQuery(['punctuatedPartNumber', 'vendorPunctuatedPartNumber', 'oemPunctuatedPartNumber'].join('+')) + } - def createDisMaxCriteriaForInactivePartNumber(){ - return createDisMaxQuery(['punctuatedPartNumber', 'vendorPunctuatedPartNumber', 'oemPunctuatedPartNumber', 'partNumber','vendorPartNumber', 'oemPartNumber'].join('+')) - } + def createDisMaxCriteriaForInactivePartNumber() { + createDisMaxQuery(['punctuatedPartNumber', 'vendorPunctuatedPartNumber', 'oemPunctuatedPartNumber', 'partNumber', + 'vendorPartNumber', 'oemPartNumber'].join('+')) + } - /** - * Skip certain fields as search criteria for dismax parser. These fields are added in schema as special search able fields. Their type is 'text_partial' - * @param sortedRelevency - * @return - */ - //IST-6626 - def createDisMaxTermCriteria(sortedRelevency){ - ArrayList excludeItems=['vendorPartNumber','vendorPunctuatedPartNumber', 'partNumber','punctuatedPartNumber', 'oemPartNumber', 'oemPunctuatedPartNumber', 'year'] - def termRelevencyList=[] - sortedRelevency.each{item -> + /** + * Skip certain fields as search criteria for dismax parser. These fields are added in schema as special search able fields. Their + * type is 'text_partial' + * @param sortedRelevency + * @return + */ + //IST-6626 + def createDisMaxTermCriteria(sortedRelevency) { + ArrayList excludeItems = ['vendorPartNumber', 'vendorPunctuatedPartNumber', 'partNumber', 'punctuatedPartNumber', + 'oemPartNumber', 'oemPunctuatedPartNumber', 'year'] + def termRelevencyList = [] + sortedRelevency.each { item -> - if(!excludeItems.contains(item.name)){ - termRelevencyList.add(item) - } - } - def disMaxCriteria=termRelevencyList.collect{field ->"${field.name}${field.name != 'text' ? '_text_term': ''}"+"^"+"${field.weight}"}.join('+') - return createDisMaxQuery(disMaxCriteria) - } + if (!excludeItems.contains(item.name)) { + termRelevencyList.add(item) + } + } + def disMaxCriteria = termRelevencyList.collect { field -> + "${field.name}${field.name != 'text' ? '_text_term' : ''}" + '^' + "${field.weight}" }.join('+') + createDisMaxQuery(disMaxCriteria) + } - def createDisMaxGeneralCriteria(sortedRelevency){ - def disMaxCriteria=sortedRelevency.collect{field -> "${field.name}${field.name != 'text' ? '_text': ''}"+"^"+"${field.weight}"}.join('+') - return createDisMaxQuery(disMaxCriteria) - } + def createDisMaxGeneralCriteria(sortedRelevency) { + def disMaxCriteria = sortedRelevency.collect { field -> + "${field.name}${field.name != 'text' ? '_text' : ''}" + '^' + "${field.weight}" }.join('+') + createDisMaxQuery(disMaxCriteria) + } - def createDisMaxQuery(String disMaxCriteria){ - return "defType=edismax&qf=${disMaxCriteria}&pf=${disMaxCriteria}" - } + def createDisMaxQuery(String disMaxCriteria) { + "defType=edismax&qf=${disMaxCriteria}&pf=${disMaxCriteria}" + } - def runAutoSuggestQuery(params){ + def runAutoSuggestQuery(params) { - /* create selected facets list from request params */ - Map selectedFacetsMap = solrRequestService.getSelectedFacets(params) - Set selectedFacets = selectedFacetsMap.keySet() + /* create selected facets list from request params */ + Map selectedFacetsMap = solrRequestService.getSelectedFacets(params) + Set selectedFacets = selectedFacetsMap.keySet() - String filter = solrRequestService.createFilterQS(params, selectedFacetsMap) + String filter = solrRequestService.createFilterQS(params, selectedFacetsMap) - /* Call sp to get next facets */ - List nextFacets = ['ci','ct1','ct2','ct3','ct4','br','pr'] + /* Call sp to get next facets */ + List nextFacets = ['ci', 'ct1', 'ct2', 'ct3', 'ct4', 'br', 'pr'] - /* create facet query string for selected and next facets */ - def facetFieldsQuery = createSelectedAndNextFacetQuery(params, selectedFacets, nextFacets) + /* create facet query string for selected and next facets */ + def facetFieldsQuery = createSelectedAndNextFacetQuery(params, selectedFacets, nextFacets) - // generate url - def fqQueryString = "&fq=${filter.encodeAsURL().toString()}${facetFieldsQuery}" + // generate url + def fqQueryString = "&fq=${filter.encodeAsURL().toString()}${facetFieldsQuery}" - if (term!="*:*"){ - term=term.encodeAsURL() - } + if (term != '*:*') { + term = term.encodeAsURL() + } - def pagination = getPaginationQueryString(params.rows, params.offset) - def queryParams = "q=${term}&version=2.2&indent=on${fqQueryString}&wt=json${pagination}&sort=partNumber+asc" + def pagination = getPaginationQueryString(params.rows, params.offset) + def queryParams = "q=${term}&version=2.2&indent=on${fqQueryString}&wt=json${pagination}&sort=partNumber+asc" - def autoSuggestSelectUrl = solrPrefix + "/solrSuggest/select/" - def result = searchUtils.callSolr(autoSuggestSelectUrl, queryParams) - return processAutoSuggestResponse(params.dm,params.ci,result) - } + def autoSuggestSelectUrl = solrPrefix + '/solrSuggest/select/' + def result = searchUtils.callSolr(autoSuggestSelectUrl, queryParams) + processAutoSuggestResponse(params.dm, params.ci, result) + } - /** - * Process the autoSuggest Solr response and create formated response. - * this method construct response by create individual division for part, brand, product and category - * @param domain - * @param catalogInstance - * @param jsonData - * @return - */ - def processAutoSuggestResponse(def domain,def catalogInstance,def jsonData){ + /** + * Process the autoSuggest Solr response and create formated response. + * this method construct response by create individual division for part, brand, product and category + * @param domain + * @param catalogInstance + * @param jsonData + * @return + */ + def processAutoSuggestResponse(def domain, def catalogInstance, def jsonData) { - def partsJson = JSON.parse(jsonData) - def TreeMap aro= new TreeMap() - QuickSearch quickSearch = new QuickSearch() - def facetFields=partsJson.facet_counts.facet_fields - quickSearch.partDivisionData=parsePartInfo(partsJson.response.docs) - quickSearch.brandDivisionData=parseFacet(facetFields,'br',domain,null,null) - quickSearch.catalogProductDivisionData=parseFacet(facetFields,'pr',domain,null,null) - quickSearch.catalogCategoryDivisionData=getCategoryDivisionData(facetFields,domain) - return quickSearch.getQuickSearchResponse() - } - /** - * parse solr response for constructing Category division for auto Suggest. - * multiple category fields ct1, ct2, ct3 and ct4 fields are combined. - * each Category are prefixed with parent category Name and CatalogName for readability - * @param facetFields - * @param domain - * @return - */ - def getCategoryDivisionData(def facetFields, def domain){ - def catalogData=parseFacet(facetFields,'ci',domain,null,null) - TreeMap ciMap =new TreeMap() - catalogData.each{ - ciMap.put(it.id,it.name) - } - def category1Data=parseFacet(facetFields,'ct1',domain,null,ciMap) - TreeMap ct1Map =new TreeMap() - category1Data.each{ - def str=it.name.split('>> ') - ct1Map.put(it.id,str[1]) - } - List categoryDivisionData=[] - ['ct2', 'ct3', 'ct4'].each{ - categoryDivisionData.addAll(parseFacet(facetFields,it,domain,ct1Map,ciMap)) - } - categoryDivisionData.addAll(category1Data) - def mc= [ - compare: {a,b-> - a.equals(b)? 0: Math.abs(a.count)>Math.abs(b.count)? -1: 1 - } - ] as Comparator - Collections.sort(categoryDivisionData,mc) - return categoryDivisionData - } - /** - * Masks division Values to the Division Object and constructs the Solr suggest response - * @param data - * @param divisionName - * @param qsResponse - * @return - */ - def maskDivision(def data,def divisionName,def qsResponse){ - Division division= new Division(name:divisionName) - division.values= data - qsResponse.divisions< partInfo<< " ${st['partNumber']}-${st['partDescr']}" } - return partInfo - } - /** - * This method builds the division values for all the solr Suggest division like Catalog, brand and product. - * Category are prefixed with parent category Name and CatalogName for readability. - * Product are prefixed with part catalog Name - * @param facetFields - * @param facetFieldName - * @param dm - * @param ct1Map - * @param ciMap - * @return - */ - def parseFacet(def facetFields,def facetFieldName,def dm, def ct1Map, def ciMap){ - def parsedValues=[] - def facetField=facetFields["${facetFieldName}_FC"] - for(int i=0; i> ') + ct1Map.put(it.id, str[1]) + } + List categoryDivisionData = [] + ['ct2', 'ct3', 'ct4'].each { + categoryDivisionData.addAll(parseFacet(facetFields, it, domain, ct1Map, ciMap)) + } + categoryDivisionData.addAll(category1Data) + def mc = [ + compare: { a, b -> + a == b ? 0 : Math.abs(a.count) > Math.abs(b.count) ? -1 : 1 + } + ] as Comparator + Collections.sort(categoryDivisionData, mc) + categoryDivisionData + } + /** + * Masks division Values to the Division Object and constructs the Solr suggest response + * @param data + * @param divisionName + * @param qsResponse + * @return + */ + def maskDivision(def data, def divisionName, def qsResponse) { + Division division = new Division(name: divisionName) + division.values = data + qsResponse.divisions << division + } + /** + * parse partInfor form the solr docs response and construct the solr Suggest part division + * @param responceDoc + * @return + */ + def parsePartInfo(def responceDoc) { + def partInfo = [] + responceDoc.each { st -> partInfo << " ${st['partNumber']}-${st['partDescr']}" } + partInfo + } + /** + * This method builds the division values for all the solr Suggest division like Catalog, brand and product. + * Category are prefixed with parent category Name and CatalogName for readability. + * Product are prefixed with part catalog Name + * @param facetFields + * @param facetFieldName + * @param dm + * @param ct1Map + * @param ciMap + * @return + */ + def parseFacet(def facetFields, def facetFieldName, def dm, def ct1Map, def ciMap) { + def parsedValues = [] + def facetField = facetFields["${facetFieldName}_FC"] + for (int i = 0; i < facetField.size(); i += 2) { + DivValue value = new DivValue() + value.count = facetField[i + 1] + def exp = facetField[i] - switch(facetFieldName){ - case 'ci': - Matcher matcher = exp =~/^$dm\|(\d+)\|(.+)$/ - if(matcher.find()){ - value.id=matcher.group(1) - value.name=matcher.group(2) - } - break; - case 'ct1': - Matcher matcher = exp =~/^$dm\|(\d+)\|(\d+)\|(.+)$/ - if(matcher.find()){ - value.id=matcher.group(2) - value.name=ciMap[matcher.group(1)]+' >> '+matcher.group(3) - } - break; - case 'ct2': - Matcher matcher = exp =~/^$dm\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ - if(matcher.find()){ - def dispName=ciMap[matcher.group(1)] +' >> '+ct1Map[matcher.group(2)] +' >> '+ matcher.group(4) - value.id=matcher.group(3) - value.name=dispName - } - break; - case 'ct3': - Matcher matcher = exp =~/^$dm\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ - if(matcher.find()){ - def dispName= ciMap[matcher.group(1)] +' >> '+ct1Map[matcher.group(2)]+' >> '+ct1Map[matcher.group(3)] +' >> '+ matcher.group(5) - value.id=matcher.group(4) - value.name=dispName - } - break; - case 'ct4': - Matcher matcher = exp =~/^$dm\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ - if(matcher.find()){ - def dispName=ciMap[matcher.group(1)] +' >> '+ct1Map[matcher.group(2)]+' >> '+ct1Map[matcher.group(3)]+' >> '+ ct1Map[matcher.group(4)]+' >> '+ matcher.group(6) - value.id=matcher.group(5) - value.name=dispName - } - break; - case 'pr': - Matcher matcher = exp =~/^$dm\|(\d+)\|(.+)\|(\d+)\|(.+)$/ - if(matcher.find()){ - def dispName=matcher.group(2) +' >> '+ matcher.group(4) - value.id=matcher.group(3) - value.name=dispName - } - break; - default: - Matcher matcher = exp =~/^(\d)*\|(.+)$/ - if(matcher.find()){ - value.id=matcher.group(1) - value.name=matcher.group(2) - } - } + switch (facetFieldName) { + case 'ci': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(.+)$/ + if (matcher.find()) { + value.id = matcher.group(1) + value.name = matcher.group(2) + } + break + case 'ct1': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(\d+)\|(.+)$/ + if (matcher.find()) { + value.id = matcher.group(2) + value.name = ciMap[matcher.group(1)] + ' >> ' + matcher.group(3) + } + break + case 'ct2': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ + if (matcher.find()) { + def dispName = ciMap[matcher.group(1)] + ' >> ' + ct1Map[matcher.group(2)] + ' >> ' + matcher.group(4) + value.id = matcher.group(3) + value.name = dispName + } + break + case 'ct3': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ + if (matcher.find()) { + def dispName = ciMap[matcher.group(1)] + ' >> ' + ct1Map[matcher.group(2)] + ' >> ' + + ct1Map[matcher.group(3)] + ' >> ' + matcher.group(5) + value.id = matcher.group(4) + value.name = dispName + } + break + case 'ct4': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(.+)$/ + if (matcher.find()) { + def dispName = ciMap[matcher.group(1)] + ' >> ' + ct1Map[matcher.group(2)] + ' >> ' + + ct1Map[matcher.group(3)] + ' >> ' + ct1Map[matcher.group(4)] + ' >> ' + matcher.group(6) + value.id = matcher.group(5) + value.name = dispName + } + break + case 'pr': + Matcher matcher = exp =~ /^$dm\|(\d+)\|(.+)\|(\d+)\|(.+)$/ + if (matcher.find()) { + def dispName = matcher.group(2) + ' >> ' + matcher.group(4) + value.id = matcher.group(3) + value.name = dispName + } + break + default: + Matcher matcher = exp =~ /^(\d)*\|(.+)$/ + if (matcher.find()) { + value.id = matcher.group(1) + value.name = matcher.group(2) + } + } - if(value.id && value.id!= ''){ - parsedValues<