AMBARI-20300. LogSearch Portal UI Fails on Last Page selection if logs were 
deleted in the meantime (Miklos Gergely via oleewere)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9f7ad270
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9f7ad270
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9f7ad270

Branch: refs/heads/branch-feature-AMBARI-12556
Commit: 9f7ad270b51d97da7eee5d59367bbe82093b562f
Parents: 630ffb3
Author: Miklos Gergely <mgerg...@hortonworks.com>
Authored: Fri Mar 10 14:44:15 2017 +0100
Committer: oleewere <oleew...@gmail.com>
Committed: Wed Mar 22 13:47:57 2017 +0100

----------------------------------------------------------------------
 .../AbstractSearchRequestQueryConverter.java    | 31 +++++++++++++++++---
 .../logsearch/manager/AuditLogsManager.java     | 20 +++++++++++--
 .../ambari/logsearch/manager/ManagerBase.java   | 11 ++++---
 .../logsearch/manager/ServiceLogsManager.java   | 13 ++++++--
 .../scripts/collections/BaseCollection.js       |  4 +--
 .../webapp/scripts/views/common/TableLayout.js  |  2 +-
 6 files changed, 64 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java
index d44b866..d4fc48b 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java
@@ -18,10 +18,15 @@
  */
 package org.apache.ambari.logsearch.converter;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ambari.logsearch.model.request.LastPageParamDefinition;
 import org.apache.ambari.logsearch.model.request.impl.CommonSearchRequest;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.solr.core.query.Criteria;
 import org.springframework.data.solr.core.query.Query;
 import org.springframework.data.solr.core.query.SimpleStringCriteria;
@@ -32,14 +37,32 @@ public abstract class 
AbstractSearchRequestQueryConverter<REQUEST_TYPE extends C
   @Override
   public QUERY_TYPE convert(REQUEST_TYPE request) {
     QUERY_TYPE query = createQuery();
-    int page = StringUtils.isNumeric(request.getPage()) ? new 
Integer(request.getPage()) : 0;
-    int pageSize = StringUtils.isNumeric(request.getPageSize()) ? new 
Integer(request.getPageSize()) : 99999;
-    PageRequest pageRequest = new PageRequest(page, pageSize, sort(request));
-    query.setPageRequest(pageRequest);
+    addPageRequest(request, query);
     Criteria criteria = new SimpleStringCriteria("*:*");
     query.addCriteria(criteria);
     return extendSolrQuery(request, query);
   }
+  
+  private void addPageRequest(REQUEST_TYPE request, QUERY_TYPE query) {
+    int page = StringUtils.isNumeric(request.getPage()) ? new 
Integer(request.getPage()) : 0;
+    int pageSize = StringUtils.isNumeric(request.getPageSize()) ? new 
Integer(request.getPageSize()) : 99999;
+    Sort sort = sort(request);
+    
+    boolean isLastPage = (request instanceof LastPageParamDefinition) ?
+        ((LastPageParamDefinition)request).isLastPage() :
+        false;
+    if (isLastPage) {
+      page = 0;
+      List<Sort.Order> newOrders = new ArrayList<>();
+      for (Sort.Order order : sort) {
+        newOrders.add(new Sort.Order(order.getDirection() == Direction.ASC ? 
Direction.DESC : Direction.ASC, order.getProperty()));
+      }
+      sort = new Sort(newOrders);
+    }
+    
+    PageRequest pageRequest = new PageRequest(page, pageSize, sort);
+    query.setPageRequest(pageRequest);
+  }
 
   public abstract QUERY_TYPE extendSolrQuery(REQUEST_TYPE request, QUERY_TYPE 
query);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/AuditLogsManager.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/AuditLogsManager.java
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/AuditLogsManager.java
index 2a18415..49465d5 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/AuditLogsManager.java
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/AuditLogsManager.java
@@ -58,6 +58,7 @@ import 
org.apache.ambari.logsearch.solr.model.SolrAuditLogData;
 import org.apache.ambari.logsearch.solr.model.SolrComponentTypeLogData;
 import org.apache.ambari.logsearch.util.DownloadUtil;
 import org.apache.ambari.logsearch.util.RESTErrorUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.ambari.logsearch.common.VResponse;
 import org.apache.log4j.Logger;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -87,8 +88,23 @@ public class AuditLogsManager extends 
ManagerBase<SolrAuditLogData, AuditLogResp
   @Inject
   private SolrSchemaFieldDao solrSchemaFieldDao;
 
-  public AuditLogResponse getLogs(AuditLogRequest auditLogRequest) {
-    return 
getLogAsPaginationProvided(conversionService.convert(auditLogRequest, 
SimpleQuery.class), auditSolrDao, "/audit/logs");
+  public AuditLogResponse getLogs(AuditLogRequest request) {
+    String event = "/audit/logs";
+    SimpleQuery solrQuery = conversionService.convert(request, 
SimpleQuery.class);
+    if (request.isLastPage()) {
+      return getLastPage(auditSolrDao, solrQuery, event);
+    } else {
+      AuditLogResponse response = getLogAsPaginationProvided(solrQuery, 
auditSolrDao, event);
+      if (response.getTotalCount() > 0 && 
CollectionUtils.isEmpty(response.getLogList())) {
+        request.setLastPage(true);
+        solrQuery = conversionService.convert(request, SimpleQuery.class);
+        AuditLogResponse lastResponse = getLastPage(auditSolrDao, solrQuery, 
event);
+        if (lastResponse != null){
+          response = lastResponse;
+        }
+      }
+      return response;
+    }
   }
 
   private List<LogData> getComponents(AuditComponentRequest request) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ManagerBase.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ManagerBase.java
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ManagerBase.java
index 89873f3..6b40cb5 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ManagerBase.java
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ManagerBase.java
@@ -26,7 +26,6 @@ import java.util.List;
 import org.apache.ambari.logsearch.model.response.LogData;
 import org.apache.ambari.logsearch.model.response.LogSearchResponse;
 import org.apache.ambari.logsearch.dao.SolrDaoBase;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -45,9 +44,9 @@ public abstract class ManagerBase<LOG_DATA_TYPE extends 
LogData, SEARCH_RESPONSE
   protected SEARCH_RESPONSE getLastPage(SolrDaoBase solrDoaBase, SimpleQuery 
lastPageQuery, String event) {
     int maxRows = lastPageQuery.getRows();
     SEARCH_RESPONSE logResponse = getLogAsPaginationProvided(lastPageQuery, 
solrDoaBase, event);
-    Long totalLogs = solrDoaBase.count(lastPageQuery);
-    int startIndex = Integer.parseInt("" + ((totalLogs / maxRows) * maxRows));
-    int numberOfLogsOnLastPage = Integer.parseInt("" + (totalLogs - 
startIndex));
+    Long totalLogs = logResponse.getTotalCount();
+    int startIndex = (int)(totalLogs - totalLogs % maxRows);
+    int numberOfLogsOnLastPage = (int)(totalLogs - startIndex);
     logResponse.setStartIndex(startIndex);
     logResponse.setTotalCount(totalLogs);
     logResponse.setPageSize(maxRows);
@@ -75,11 +74,11 @@ public abstract class ManagerBase<LOG_DATA_TYPE extends 
LogData, SEARCH_RESPONSE
     QueryResponse response = solrDaoBase.process(solrQuery, event);
     SEARCH_RESPONSE logResponse = createLogSearchResponse();
     SolrDocumentList docList = response.getResults();
+    logResponse.setTotalCount(docList.getNumFound());
     List<LOG_DATA_TYPE> serviceLogDataList = convertToSolrBeans(response);
-    if (CollectionUtils.isNotEmpty(docList)) {
+    if (!docList.isEmpty()) {
       logResponse.setLogList(serviceLogDataList);
       logResponse.setStartIndex((int) docList.getStart());
-      logResponse.setTotalCount(docList.getNumFound());
       Integer rowNumber = solrQuery.getRows();
       if (rowNumber == null) {
         logger.error("No RowNumber was set in solrQuery");

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ServiceLogsManager.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ServiceLogsManager.java
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ServiceLogsManager.java
index 157335a..9ce209b 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ServiceLogsManager.java
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/java/org/apache/ambari/logsearch/manager/ServiceLogsManager.java
@@ -139,12 +139,21 @@ public class ServiceLogsManager extends 
ManagerBase<SolrServiceLogData, ServiceL
       }
     } else if (isLastPage) {
       ServiceLogResponse logResponse = getLastPage(serviceLogsSolrDao, 
solrQuery, event);
-      if(logResponse == null){
+      if (logResponse == null){
         logResponse = new ServiceLogResponse();
       }
       return logResponse;
     } else {
-      return getLogAsPaginationProvided(solrQuery, serviceLogsSolrDao, event);
+      ServiceLogResponse response = getLogAsPaginationProvided(solrQuery, 
serviceLogsSolrDao, event);
+      if (response.getTotalCount() > 0 && 
CollectionUtils.isEmpty(response.getLogList())) {
+        request.setLastPage(true);
+        solrQuery = conversionService.convert(request, SimpleQuery.class);
+        ServiceLogResponse lastResponse = getLastPage(serviceLogsSolrDao, 
solrQuery, event);
+        if (lastResponse != null){
+          response = lastResponse;
+        }
+      }
+      return response;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/collections/BaseCollection.js
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/collections/BaseCollection.js
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/collections/BaseCollection.js
index c175397..82fe6a9 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/collections/BaseCollection.js
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/collections/BaseCollection.js
@@ -129,9 +129,9 @@ define(['require',
            },
            getPage : function(index, options){
                if(index === "last"){
-                       this.queryParams.isLastPage = true;
+                       this.queryParams.lastPage = true;
                }else{
-                       delete this.queryParams.isLastPage;
+                       delete this.queryParams.lastPage;
                }
                var fn = Backbone.PageableCollection.prototype.getPage;
                fn.apply(this,arguments);

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f7ad270/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/views/common/TableLayout.js
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/views/common/TableLayout.js
 
b/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/views/common/TableLayout.js
index 1066510..b2f0871 100644
--- 
a/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/views/common/TableLayout.js
+++ 
b/ambari-logsearch/ambari-logsearch-portal/src/main/webapp/scripts/views/common/TableLayout.js
@@ -392,7 +392,7 @@ define(['require',
                        this.collection.state.pageSize = parseInt(pagesize,10);
 
                        this.collection.state.currentPage = 
this.collection.state.firstPage;
-                       delete this.collection.queryParams.isLastPage;
+                       delete this.collection.queryParams.lastPage;
                        this.collection.fetch({
                                sort: false,
                                reset: true,

Reply via email to