You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by sa...@apache.org on 2019/12/13 23:18:45 UTC

[metron] branch master updated: METRON-2292 [UI] Manual query can' t be saved on the Alerts UI (ruffle1986 via sardell) closes apache/metron#1533

This is an automated email from the ASF dual-hosted git repository.

sardell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metron.git


The following commit(s) were added to refs/heads/master by this push:
     new e57a795  METRON-2292 [UI] Manual query can't be saved on the Alerts UI (ruffle1986 via sardell) closes apache/metron#1533
e57a795 is described below

commit e57a795dc0f4781a9807bb08570b2b3948b79a97
Author: ruffle1986 <tf...@gmail.com>
AuthorDate: Fri Dec 13 18:18:23 2019 -0500

    METRON-2292 [UI] Manual query can&apos;t be saved on the Alerts UI (ruffle1986 via sardell) closes apache/metron#1533
---
 .../alerts-list/alerts-list.component.spec.ts      | 80 +++++++++++++++++++++-
 .../alerts/alerts-list/alerts-list.component.ts    | 22 +++++-
 .../src/app/alerts/alerts-list/query-builder.ts    |  4 ++
 .../alerts/save-search/save-search.component.ts    |  6 +-
 .../metron-alerts/src/app/model/save-search.ts     |  2 +
 5 files changed, 108 insertions(+), 6 deletions(-)

diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.spec.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.spec.ts
index 7238555..27db478 100644
--- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.spec.ts
+++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.spec.ts
@@ -42,7 +42,6 @@ import { SearchRequest } from 'app/model/search-request';
 import { query } from '@angular/core/src/render3';
 import { RestError } from 'app/model/rest-error';
 import { DialogType } from 'app/shared/metron-dialog/metron-dialog.component';
-import { DateFilterValue } from 'app/model/date-filter-value';
 import { SaveSearch } from 'app/model/save-search';
 
 @Component({
@@ -179,7 +178,7 @@ describe('AlertsListComponent', () => {
           fireLoadSavedSearch: (savedSearch: any) => {
             this.loadSavedSearch$.next(savedSearch);
           },
-          saveAsRecentSearches: (savedSearch: any) => of(),
+          saveAsRecentSearches: () => of(null),
         } } },
         { provide: MetaAlertService, useClass: () => { return {
           alertChanged$: new Observable(),
@@ -202,6 +201,7 @@ describe('AlertsListComponent', () => {
           setManualQuery: () => {},
           getFilteringMode: () => {},
           setFilteringMode: () => {},
+          generateNameForSearchRequest: () => '',
           setSearch: () => {},
         } } },
         { provide: AutoPollingService, useClass: () => { return {
@@ -781,4 +781,80 @@ describe('AlertsListComponent', () => {
       expect(component.search).toHaveBeenCalled();
     });
   });
+
+  describe('save/load manual query search', () => {
+
+    it('should switch to manual mode if the saved search is manual', () => {
+
+      const saveSearchSvc = TestBed.get(SaveSearchService);
+      const savedSearch = new SaveSearch();
+      savedSearch.isManual = true;
+      savedSearch.searchRequest = new SearchRequest();
+      savedSearch.searchRequest.query = 'foo:bar';
+      savedSearch.filters = [];
+
+      saveSearchSvc.loadSavedSearch$ = of(savedSearch);
+
+      const spySetFilteringMode = spyOn(component.queryBuilder, 'setFilteringMode');
+      const spySetManualQuery = spyOn(component.queryBuilder, 'setManualQuery');
+
+      component.addLoadSavedSearchListener();
+
+      expect(spySetFilteringMode).toHaveBeenCalledTimes(1);
+      expect(spySetFilteringMode).toHaveBeenCalledWith(FilteringMode.MANUAL);
+
+      expect(spySetManualQuery).toHaveBeenCalledWith('foo:bar');
+    });
+
+    it('should switch to builder mode if the saved search is not manual', () => {
+      const saveSearchSvc = TestBed.get(SaveSearchService);
+      const savedSearch = new SaveSearch();
+      savedSearch.isManual = false;
+      savedSearch.searchRequest = new SearchRequest();
+      savedSearch.searchRequest.query = 'foo:bar';
+      savedSearch.filters = [];
+
+      saveSearchSvc.loadSavedSearch$ = of(savedSearch);
+
+      const spySetFilteringMode = spyOn(component.queryBuilder, 'setFilteringMode');
+      const spySetManualQuery = spyOn(component.queryBuilder, 'setManualQuery');
+
+      component.addLoadSavedSearchListener();
+
+      expect(spySetFilteringMode).toHaveBeenCalledTimes(1);
+      expect(spySetFilteringMode).toHaveBeenCalledWith(FilteringMode.BUILDER);
+
+      expect(spySetManualQuery).not.toHaveBeenCalledWith('foo:bar');
+    });
+
+    it('should save the search filter mode (manual)', (done) => {
+      const saveSearchSvc = TestBed.get(SaveSearchService);
+
+      saveSearchSvc.saveAsRecentSearches = (saveSearch) => {
+        expect(saveSearch.isManual).toBe(true);
+        expect(saveSearch.searchRequest.query).toBe('foo:bar');
+        done();
+        return of(null);
+      };
+
+      component.queryBuilder.getFilteringMode = () => FilteringMode.MANUAL;
+      component.queryBuilder.query = 'foo:bar';
+      component.saveCurrentSearch();
+    });
+
+    it('should save the search filter mode (builder)', (done) => {
+      const saveSearchSvc = TestBed.get(SaveSearchService);
+
+      saveSearchSvc.saveAsRecentSearches = (saveSearch) => {
+        expect(saveSearch.isManual).toBe(false);
+        expect(saveSearch.searchRequest.query).toBe('');
+        done();
+        return of(null);
+      };
+
+      component.queryBuilder.getFilteringMode = () => FilteringMode.BUILDER;
+      component.queryBuilder.query = 'foo:bar';
+      component.saveCurrentSearch();
+    });
+  });
 });
diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
index 66c0f0f..f525b24 100755
--- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
+++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
@@ -147,6 +147,13 @@ export class AlertsListComponent implements OnInit, OnDestroy {
 
   addLoadSavedSearchListener() {
     this.saveSearchService.loadSavedSearch$.subscribe((savedSearch: SaveSearch) => {
+      if (savedSearch.isManual === true) {
+        this.queryBuilder.setFilteringMode(FilteringMode.MANUAL);
+        this.queryBuilder.setManualQuery(savedSearch.searchRequest.query);
+      } else {
+        this.queryBuilder.setFilteringMode(FilteringMode.BUILDER);
+      }
+
       this.queryBuilder.searchRequest = savedSearch.searchRequest;
       this.queryBuilder.filters = savedSearch.filters;
       this.setSelectedTimeRange(savedSearch.filters);
@@ -433,10 +440,19 @@ export class AlertsListComponent implements OnInit, OnDestroy {
     }
   }
 
-  saveCurrentSearch(savedSearch: SaveSearch) {
+  saveCurrentSearch(savedSearch?: SaveSearch) {
+    const isManual = () => this.queryBuilder.getFilteringMode() === FilteringMode.MANUAL;
     if (this.queryBuilder.query !== '*') {
-      this.saveSearchService.saveAsRecentSearches(savedSearch).subscribe(() => {
-      });
+      if (!savedSearch) {
+        savedSearch = new SaveSearch();
+        savedSearch.searchRequest = this.queryBuilder.searchRequest;
+        savedSearch.tableColumns = this.alertsColumns;
+        savedSearch.filters = this.queryBuilder.filters;
+        savedSearch.searchRequest.query = isManual() ? this.queryBuilder.query : '';
+        savedSearch.name = this.queryBuilder.generateNameForSearchRequest();
+        savedSearch.isManual = isManual();
+      }
+      this.saveSearchService.saveAsRecentSearches(savedSearch).subscribe();
     }
   }
 
diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/query-builder.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/query-builder.ts
index 500cbb5..5f3e3fc 100644
--- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/query-builder.ts
+++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/query-builder.ts
@@ -43,6 +43,10 @@ export class QueryBuilder {
     return this.searchRequest.query;
   }
 
+  set query(value: string) {
+    this.searchRequest.query = value;
+  }
+
   get displayQuery(): string {
     return this.generateSelectForDisplay();
   }
diff --git a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
index 276cb9b..57dd94f 100644
--- a/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
+++ b/metron-interface/metron-alerts/src/app/alerts/save-search/save-search.component.ts
@@ -22,6 +22,7 @@ import {SaveSearchService} from '../../service/save-search.service';
 import {SaveSearch} from '../../model/save-search';
 import { DialogService } from 'app/service/dialog.service';
 import { ConfirmationType } from 'app/model/confirmation-type';
+import { FilteringMode } from '../alerts-list/query-builder';
 
 @Component({
   selector: 'app-save-search',
@@ -46,10 +47,13 @@ export class SaveSearchComponent implements OnInit {
   }
 
   save() {
+    const isManual = () => this.saveSearchService.queryBuilder.getFilteringMode() === FilteringMode.MANUAL;
+
     this.saveSearch.searchRequest = this.saveSearchService.queryBuilder.searchRequest;
     this.saveSearch.tableColumns = this.saveSearchService.tableColumns;
     this.saveSearch.filters = this.saveSearchService.queryBuilder.filters;
-    this.saveSearch.searchRequest.query = '';
+    this.saveSearch.searchRequest.query = isManual() ? this.saveSearchService.queryBuilder.query : '';
+    this.saveSearch.isManual = isManual()
 
     this.saveSearchService.saveSearch(this.saveSearch).subscribe(() => {
       this.goBack();
diff --git a/metron-interface/metron-alerts/src/app/model/save-search.ts b/metron-interface/metron-alerts/src/app/model/save-search.ts
index 173f60e..f185de7 100644
--- a/metron-interface/metron-alerts/src/app/model/save-search.ts
+++ b/metron-interface/metron-alerts/src/app/model/save-search.ts
@@ -27,6 +27,7 @@ export class SaveSearch {
   searchRequest: SearchRequest;
   tableColumns: ColumnMetadata[];
   filters: Filter[];
+  isManual = false
 
   public static fromJSON(obj: SaveSearch): SaveSearch {
     let saveSearch = new SaveSearch();
@@ -35,6 +36,7 @@ export class SaveSearch {
     saveSearch.searchRequest = obj.searchRequest;
     saveSearch.filters = Filter.fromJSON(obj.filters);
     saveSearch.tableColumns = ColumnMetadata.fromJSON(obj.tableColumns);
+    saveSearch.isManual = obj.isManual;
 
     return saveSearch;
   }