Index: grails-app/controllers/com/lemans/ds/solr/DsSolrQueueController.groovy =================================================================== diff -u -r4de017e5153c785456a1392c7744bea5a8e9cc6c -r8f0a759a3f8ea695385f5c1f9f17f76c3b17f7e0 --- grails-app/controllers/com/lemans/ds/solr/DsSolrQueueController.groovy (.../DsSolrQueueController.groovy) (revision 4de017e5153c785456a1392c7744bea5a8e9cc6c) +++ grails-app/controllers/com/lemans/ds/solr/DsSolrQueueController.groovy (.../DsSolrQueueController.groovy) (revision 8f0a759a3f8ea695385f5c1f9f17f76c3b17f7e0) @@ -126,6 +126,10 @@ QC_PART_REJECTED('Number of Parts Rejected', QueueMode.PART), QC_PRODUCT_PENDING_APPROVAL('Number of Products Pending Approval', QueueMode.PRODUCT), QC_PRODUCT_REJECTED('Number of Products Rejected', QueueMode.PRODUCT), + PART_LATEST_GO_LIVE_DATE('Part Latest GoLive Date', QueueMode.PART), + PART_EARLIEST_GO_LIVE_DATE('Part Earliest GoLive Date', QueueMode.PART), + PART_LAST_UPDATED('Part Last Updated', QueueMode.PART), + PRODUCT_LAST_UPDATED('Product Last Updated', QueueMode.PRODUCT), PART_ATTR_RESEARCH_VALUE_NONE('None', QueueMode.PART), PART_ATTR_RESEARCH_VALUE_LEVEL1('Level 1', QueueMode.PART), Index: grails-app/services/com/lemans/ds/solr/SolrQueryService.groovy =================================================================== diff -u -r4de017e5153c785456a1392c7744bea5a8e9cc6c -r8f0a759a3f8ea695385f5c1f9f17f76c3b17f7e0 --- grails-app/services/com/lemans/ds/solr/SolrQueryService.groovy (.../SolrQueryService.groovy) (revision 4de017e5153c785456a1392c7744bea5a8e9cc6c) +++ grails-app/services/com/lemans/ds/solr/SolrQueryService.groovy (.../SolrQueryService.groovy) (revision 8f0a759a3f8ea695385f5c1f9f17f76c3b17f7e0) @@ -128,7 +128,11 @@ queueCountsForQcPartPendingApproval(payload, pool), queueCountsForQcPartRejected(payload, pool), queueCountsForQCProductPendingApproval(payload, pool), - queueCountsForQCProductRejected(payload, pool) + queueCountsForQCProductRejected(payload, pool), + latestGoliveDate(payload, pool), + earliestGoliveDate(payload, pool), + partLastUpdated(payload, pool), + productLastUpdated(payload, pool) ] List queueCounts = futures.stream().map { CompletableFuture future -> future.join() }.collect(Collectors.toList()) injectPastWeekCounts(queueCounts) @@ -240,6 +244,63 @@ }, executor) } + + private CompletableFuture latestGoliveDate(QueuePayload payload, Executor executor) { + CompletableFuture.supplyAsync(new Supplier() { + @Override + Map get() { + QueuePayload queuePayload = copyWithQueueType(payload, QueueType.PART_LATEST_GO_LIVE_DATE) + SolrQuery query = new SolrQuery() + .addFilterQuery('(categoryId:[* TO *])') + query.add('json.facet', '{uniqueVals:{type:terms,field:userName,missing:true,mincount:1,limit:10,facet:{date:"min(goliveDate)"}}}') + addFacetFilters(query, queuePayload) + buildResponseDate(dsQueueSolrClient.request(new QueryRequest(query)), queuePayload) + } + }, executor) + } + + private CompletableFuture earliestGoliveDate(QueuePayload payload, Executor executor) { + CompletableFuture.supplyAsync(new Supplier() { + @Override + Map get() { + QueuePayload queuePayload = copyWithQueueType(payload, QueueType.PART_EARLIEST_GO_LIVE_DATE) + + SolrQuery query = new SolrQuery() + .addFilterQuery('(categoryId:[* TO *])') + query.add('json.facet', '{uniqueVals:{type:terms,field:userName,missing:true,mincount:1,limit:10,facet:{date:"max(goliveDate)"}}}') + addFacetFilters(query, queuePayload) + buildResponseDate(dsQueueSolrClient.request(new QueryRequest(query)), queuePayload)} + }, executor) + } + + private CompletableFuture partLastUpdated(QueuePayload payload, Executor executor) { + CompletableFuture.supplyAsync(new Supplier() { + @Override + Map get() { + QueuePayload queuePayload = copyWithQueueType(payload, QueueType.PART_LAST_UPDATED) + SolrQuery query = new SolrQuery() + .addFilterQuery('(categoryId:[* TO *])') + query.add('json.facet', '{uniqueVals:{type:terms,field:productId,missing:true,mincount:1,limit:10,facet:{date:"max(lastUpdated)"}}}') + addFacetFilters(query, queuePayload) + buildResponseDate(dsQueueSolrClient.request(new QueryRequest(query)), queuePayload) + } + }, executor) + } + + private CompletableFuture productLastUpdated(QueuePayload payload, Executor executor) { + CompletableFuture.supplyAsync(new Supplier() { + @Override + Map get() { + QueuePayload queuePayload = copyWithQueueType(payload, QueueType.PRODUCT_LAST_UPDATED) + SolrQuery query = new SolrQuery() + .addFilterQuery('(categoryId:[* TO *])') + query.add('json.facet', '{uniqueVals:{type:terms,field:productId,missing:true,mincount:1,limit:10,facet:{date:"max(productLastUpdated)"}}}') + addFacetFilters(query, queuePayload) + buildResponseDate(dsQueueSolrClient.request(new QueryRequest(query)), queuePayload) + } + }, executor) + } + private CompletableFuture categoryFacetsForProducts(QueuePayload payload, Executor executor) { CompletableFuture.supplyAsync(new Supplier() { @Override @@ -597,7 +658,6 @@ } private Map buildResponse(NamedList response, QueuePayload payload) { - SimpleOrderedMap facets = response.get('facets') SimpleOrderedMap uniqueVals = facets ? facets.get('uniqueVals') : [:] SimpleOrderedMap missing = uniqueVals?.get('missing') @@ -628,8 +688,41 @@ values } - private Map buildResponse(QueryResponse response, QueuePayload payload) { + private Map buildResponseDate(NamedList response, QueuePayload payload) { + SimpleOrderedMap facets = response.get('facets') + SimpleOrderedMap uniqueVals = facets ? facets.get('uniqueVals') : [:] + SimpleOrderedMap missing = uniqueVals?.get('missing') + List buckets = uniqueVals?.get('buckets') + List values = populateCardinalityValuesForDate(buckets, missing, payload) + Optional> optionalResult = values.stream() + .max{ obj1, obj2 -> obj1.date.compareTo(obj2.date) }.orElse(null) + Date totalDate = optionalResult.isPresent() ? optionalResult.get()['date'] : null + [type: payload.queueType.name(), displayName: payload.queueType.value, drillDowns: values ?: [], date: totalDate] + } + + + private List populateCardinalityValuesForDate(List buckets, SimpleOrderedMap missing, QueuePayload payload) { + List values + if (payload.viewType == ViewType.ADMIN) { + values = buckets?.collect { SimpleOrderedMap fieldStatsInfo -> + [userName: fieldStatsInfo.get('val'), date: fieldStatsInfo.get('date')] + } + if (missing?.get('date')) { + values.add([userName: 'No User Assigned', date: missing.get('date')]) + } + } else { + values = buckets?.collect { SimpleOrderedMap fieldStatsInfo -> + [categoryId: (fieldStatsInfo.get('val') ?: '')?.toInteger(), date: fieldStatsInfo.get('date')] + } + if (missing?.get('date')) { + values.add([categoryId: -1, date: missing.get('date')]) + } + } + values + } + + private Map buildResponse(QueryResponse response, QueuePayload payload) { Map facets = response.facetFields.collectEntries { FacetField facetField -> String key = treatedName(facetField.name) [(key): [values: populateValues(facetField.values, payload)]]