You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2022/08/23 08:08:44 UTC

[incubator-streampipes] 01/02: [hotfix] Optimize reloading of dashboard queries

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

riemer pushed a commit to branch STREAMPIPES-579
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git

commit 06d51d71c87e034a858c54f60bdf8544c93d0f11
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Mon Aug 22 21:09:23 2022 +0200

    [hotfix] Optimize reloading of dashboard queries
---
 .../src/lib/apis/datalake-rest.service.ts          |  2 +-
 .../widgets/area/area-widget.component.ts          |  1 -
 .../widgets/bar-race/bar-race-widget.component.ts  |  4 ++
 .../widgets/base/base-ngx-line-charts-widget.ts    |  4 ++
 .../components/widgets/base/base-widget.ts         | 49 ++++++++++++++++++----
 .../widgets/gauge/gauge-widget.component.ts        |  4 ++
 .../widgets/html/html-widget.component.ts          |  4 ++
 .../widgets/image/image-widget.component.ts        |  4 ++
 .../components/widgets/map/map-widget.component.ts |  4 ++
 .../widgets/number/number-widget.component.ts      |  6 ++-
 .../components/widgets/raw/raw-widget.component.ts |  4 ++
 .../stacked-line-chart-widget.component.ts         |  4 ++
 .../widgets/status/status-widget.component.ts      |  4 ++
 .../widgets/table/table-widget.component.ts        |  6 +++
 .../trafficlight/traffic-light-widget.component.ts |  3 ++
 .../wordcloud/wordcloud-widget.component.ts        |  4 ++
 16 files changed, 96 insertions(+), 11 deletions(-)

diff --git a/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts b/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts
index a4fedb77e..f83c5a2d7 100644
--- a/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts
+++ b/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts
@@ -58,7 +58,7 @@ export class DatalakeRestService {
       const url = this.dataLakeUrl + '/measurements/' + index;
       const headers = ignoreLoadingBar ? {ignoreLoadingBar: ''} : {};
       // @ts-ignore
-      return this.http.get<SpQueryResult>(url, {params: queryParams}, headers);
+      return this.http.get<SpQueryResult>(url, {params: queryParams, headers});
     }
   }
 
diff --git a/ui/src/app/dashboard/components/widgets/area/area-widget.component.ts b/ui/src/app/dashboard/components/widgets/area/area-widget.component.ts
index 1e7ea9d82..5331ea6b5 100644
--- a/ui/src/app/dashboard/components/widgets/area/area-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/area/area-widget.component.ts
@@ -39,5 +39,4 @@ export class AreaWidgetComponent extends BaseNgxLineChartsStreamPipesWidget impl
     ngOnDestroy(): void {
         super.ngOnDestroy();
     }
-
 }
diff --git a/ui/src/app/dashboard/components/widgets/bar-race/bar-race-widget.component.ts b/ui/src/app/dashboard/components/widgets/bar-race/bar-race-widget.component.ts
index 5f034f5ad..fa91d9e3c 100644
--- a/ui/src/app/dashboard/components/widgets/bar-race/bar-race-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/bar-race/bar-race-widget.component.ts
@@ -165,4 +165,8 @@ export class BarRaceWidgetComponent extends BaseStreamPipesWidget implements OnI
   protected getQueryLimit(extractor: StaticPropertyExtractor): number {
     return 1;
   }
+
+  getFieldsToQuery(): string[] {
+    return [this.partitionField, this.valueField];
+  }
 }
diff --git a/ui/src/app/dashboard/components/widgets/base/base-ngx-line-charts-widget.ts b/ui/src/app/dashboard/components/widgets/base/base-ngx-line-charts-widget.ts
index 55d608560..64f984caf 100644
--- a/ui/src/app/dashboard/components/widgets/base/base-ngx-line-charts-widget.ts
+++ b/ui/src/app/dashboard/components/widgets/base/base-ngx-line-charts-widget.ts
@@ -71,4 +71,8 @@ export abstract class BaseNgxLineChartsStreamPipesWidget extends BaseNgxChartsSt
     protected getQueryLimit(extractor: StaticPropertyExtractor): number {
         return extractor.integerParameter(WidgetConfigBuilder.QUERY_LIMIT_KEY);
     }
+
+    getFieldsToQuery(): string[] {
+        return [this.selectedNumberProperty];
+    }
 }
diff --git a/ui/src/app/dashboard/components/widgets/base/base-widget.ts b/ui/src/app/dashboard/components/widgets/base/base-widget.ts
index 71f418673..4a202c2b0 100644
--- a/ui/src/app/dashboard/components/widgets/base/base-widget.ts
+++ b/ui/src/app/dashboard/components/widgets/base/base-widget.ts
@@ -18,18 +18,19 @@
 
 import { Directive, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
 import { StaticPropertyExtractor } from '../../../sdk/extractor/static-property-extractor';
-import { BehaviorSubject, interval, Observable, Subscription } from 'rxjs';
+import { BehaviorSubject, interval, Observable, Subscription, timer } from 'rxjs';
 import { WidgetConfigBuilder } from '../../../registry/widget-config-builder';
 import { ResizeService } from '../../../services/resize.service';
 import {
   DashboardWidgetModel,
   DataLakeMeasure,
   DatalakeQueryParameterBuilder,
-  DatalakeRestService,
+  DatalakeRestService, EventPropertyPrimitive, EventPropertyUnion, FieldConfig,
   SpQueryResult
 } from '@streampipes/platform-services';
-import { map, switchMap } from 'rxjs/operators';
+import { exhaustMap, map, switchMap } from 'rxjs/operators';
 import { GridsterItemComponent } from 'angular-gridster2';
+import { query } from '@angular/animations';
 
 @Directive()
 export abstract class BaseStreamPipesWidget implements OnInit, OnChanges, OnDestroy {
@@ -87,10 +88,9 @@ export abstract class BaseStreamPipesWidget implements OnInit, OnChanges, OnDest
     this.intervalSubject = new BehaviorSubject<number>(this.refreshIntervalInSeconds);
     this.subscription = this.intervalSubject.pipe(
       switchMap(val => interval(val * 1000)))
-      .subscribe(() => {
-        this.fireQuery().subscribe(result => {
-          this.processQueryResult(result);
-        });
+      .pipe(exhaustMap(() => this.fireQuery()))
+      .subscribe((result) => {
+        this.processQueryResult(result);
       });
   }
 
@@ -122,6 +122,7 @@ export abstract class BaseStreamPipesWidget implements OnInit, OnChanges, OnDest
 
   ngOnDestroy(): void {
     this.subscription.unsubscribe();
+    this.intervalSubject.unsubscribe();
     this.resizeSub.unsubscribe();
   }
 
@@ -184,6 +185,38 @@ export abstract class BaseStreamPipesWidget implements OnInit, OnChanges, OnDest
 
   buildQuery() {
     const queryBuilder = DatalakeQueryParameterBuilder.create();
-    return queryBuilder.withLimit(this.queryLimit).withOrdering('DESC').build();
+    const columns = this.getFieldsToQuery();
+    if (columns) {
+      if (this.hasOnlyDimensionFields(this.widgetDataConfig.eventSchema.eventProperties, columns)) {
+        const firstMeasurementField = this.getAnyMeasurementField(this.widgetDataConfig.eventSchema.eventProperties);
+        columns.push(firstMeasurementField);
+      }
+      const fields: FieldConfig[] = columns.map(f => {
+        return {runtimeName: f, selected: false, numeric: false};
+      });
+      queryBuilder.withColumnFilter(fields, false);
+    }
+
+    return queryBuilder
+      .withLimit(this.queryLimit)
+      .withOrdering('DESC')
+      .build();
   }
+
+  getAnyMeasurementField(eventProperties: EventPropertyUnion[]): string {
+    return eventProperties
+      .filter(ep => ep instanceof EventPropertyPrimitive)
+      .find(ep => ep.propertyScope === 'MEASUREMENT_PROPERTY').runtimeName;
+  }
+
+  hasOnlyDimensionFields(eventProperties: EventPropertyUnion[],
+                         columns: string[]): boolean {
+    return columns
+      .map(column => eventProperties
+        .find(ep => ep.runtimeName === column))
+      .filter(ep => ep instanceof EventPropertyPrimitive)
+      .every(ep => (ep as EventPropertyPrimitive).propertyScope === 'DIMENSION_PROPERTY');
+  }
+
+  abstract getFieldsToQuery(): string[];
 }
diff --git a/ui/src/app/dashboard/components/widgets/gauge/gauge-widget.component.ts b/ui/src/app/dashboard/components/widgets/gauge/gauge-widget.component.ts
index f1993ed9a..14d351b22 100644
--- a/ui/src/app/dashboard/components/widgets/gauge/gauge-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/gauge/gauge-widget.component.ts
@@ -68,4 +68,8 @@ export class GaugeWidgetComponent extends BaseNgxChartsStreamPipesWidget impleme
         return 1;
     }
 
+    getFieldsToQuery(): string[] {
+        return [this.selectedProperty];
+    }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/html/html-widget.component.ts b/ui/src/app/dashboard/components/widgets/html/html-widget.component.ts
index bce9eff02..6e4f759e4 100644
--- a/ui/src/app/dashboard/components/widgets/html/html-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/html/html-widget.component.ts
@@ -66,4 +66,8 @@ export class HtmlWidgetComponent extends BaseStreamPipesWidget implements OnInit
         return 1;
     }
 
+    getFieldsToQuery(): string[] {
+        return [this.selectedHtmlField];
+    }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/image/image-widget.component.ts b/ui/src/app/dashboard/components/widgets/image/image-widget.component.ts
index f2129ad30..9423732e5 100644
--- a/ui/src/app/dashboard/components/widgets/image/image-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/image/image-widget.component.ts
@@ -74,4 +74,8 @@ export class ImageWidgetComponent extends BaseNgxChartsStreamPipesWidget impleme
         return 1;
     }
 
+    getFieldsToQuery(): string[] {
+        return [this.selectedProperty];
+    }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/map/map-widget.component.ts b/ui/src/app/dashboard/components/widgets/map/map-widget.component.ts
index 37fc54216..ee0f7e820 100644
--- a/ui/src/app/dashboard/components/widgets/map/map-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/map/map-widget.component.ts
@@ -83,6 +83,10 @@ export class MapWidgetComponent extends BaseStreamPipesWidget implements OnInit,
         this.centerMap = extractor.selectedSingleValue(MapConfig.CENTER_MAP_KEY) === 'Center';
     }
 
+    getFieldsToQuery(): string[] {
+        return [this.selectedLatitudeField, this.selectedLongitudeField, ...this.idsToDisplay];
+    }
+
     markerImage(selectedMarker: string): string {
         return selectedMarker === 'Default' ? 'assets/img/marker-icon.png' : 'assets/img/pe_icons/car.png';
     }
diff --git a/ui/src/app/dashboard/components/widgets/number/number-widget.component.ts b/ui/src/app/dashboard/components/widgets/number/number-widget.component.ts
index fd5cba492..a05edab6a 100644
--- a/ui/src/app/dashboard/components/widgets/number/number-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/number/number-widget.component.ts
@@ -65,7 +65,7 @@ export class NumberWidgetComponent extends BaseStreamPipesWidget implements OnIn
 
   protected onEvent(events: any[]) {
     let value = events[0][this.selectedProperty];
-    if (!isNaN(value)) {
+    if (typeof value === 'number') {
       value = value.toFixed(2);
     }
     this.item = value;
@@ -78,4 +78,8 @@ export class NumberWidgetComponent extends BaseStreamPipesWidget implements OnIn
     return 1;
   }
 
+  getFieldsToQuery(): string[] {
+    return [this.selectedProperty];
+  }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/raw/raw-widget.component.ts b/ui/src/app/dashboard/components/widgets/raw/raw-widget.component.ts
index d4f67088e..d7e6288dd 100644
--- a/ui/src/app/dashboard/components/widgets/raw/raw-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/raw/raw-widget.component.ts
@@ -65,4 +65,8 @@ export class RawWidgetComponent extends BaseStreamPipesWidget implements OnInit,
         return extractor.integerParameter(WidgetConfigBuilder.QUERY_LIMIT_KEY);
     }
 
+    getFieldsToQuery(): string[] {
+        return undefined;
+    }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/stacked-line-chart/stacked-line-chart-widget.component.ts b/ui/src/app/dashboard/components/widgets/stacked-line-chart/stacked-line-chart-widget.component.ts
index 90c471696..3bf42bc77 100644
--- a/ui/src/app/dashboard/components/widgets/stacked-line-chart/stacked-line-chart-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/stacked-line-chart/stacked-line-chart-widget.component.ts
@@ -91,6 +91,10 @@ export class StackedLineChartWidgetComponent extends BaseEchartsWidget implement
     this.chartOption.yAxis.axisLabel.textStyle.color = this.selectedPrimaryTextColor;
   }
 
+  getFieldsToQuery(): string[] {
+    return this.valueFields;
+  }
+
   protected onEvent(events: any) {
     this.dynamicData = this.chartOption;
     this.dynamicData.series = [];
diff --git a/ui/src/app/dashboard/components/widgets/status/status-widget.component.ts b/ui/src/app/dashboard/components/widgets/status/status-widget.component.ts
index 6d08ddf0e..c8658c81b 100644
--- a/ui/src/app/dashboard/components/widgets/status/status-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/status/status-widget.component.ts
@@ -72,4 +72,8 @@ export class StatusWidgetComponent extends BaseStreamPipesWidget implements OnIn
     return 1;
   }
 
+  getFieldsToQuery(): string[] {
+    return undefined;
+  }
+
 }
diff --git a/ui/src/app/dashboard/components/widgets/table/table-widget.component.ts b/ui/src/app/dashboard/components/widgets/table/table-widget.component.ts
index d291899fe..65360b0b0 100644
--- a/ui/src/app/dashboard/components/widgets/table/table-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/table/table-widget.component.ts
@@ -34,6 +34,7 @@ import { WidgetConfigBuilder } from '../../../registry/widget-config-builder';
 export class TableWidgetComponent extends BaseStreamPipesWidget implements OnInit, OnDestroy {
 
     selectedProperties: string[];
+    fields: string[];
 
     displayedColumns: string[] = [];
     dataSource = new MatTableDataSource();
@@ -61,9 +62,14 @@ export class TableWidgetComponent extends BaseStreamPipesWidget implements OnIni
 
     extractConfig(extractor: StaticPropertyExtractor) {
         this.selectedProperties = extractor.mappingPropertyValues(TableConfig.SELECTED_PROPERTIES_KEYS);
+        this.fields = extractor.mappingPropertyValues(TableConfig.SELECTED_PROPERTIES_KEYS);
         this.selectedProperties.push(BaseStreamPipesWidget.TIMESTAMP_KEY);
     }
 
+    getFieldsToQuery(): string[] {
+        return this.fields;
+    }
+
     protected onEvent(events: any[]) {
         this.dataSource.data = events.map(ev => this.createTableObject(ev)).reverse();
         this.dataSource.data = [...this.dataSource.data];
diff --git a/ui/src/app/dashboard/components/widgets/trafficlight/traffic-light-widget.component.ts b/ui/src/app/dashboard/components/widgets/trafficlight/traffic-light-widget.component.ts
index 868135721..c008362e9 100644
--- a/ui/src/app/dashboard/components/widgets/trafficlight/traffic-light-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/trafficlight/traffic-light-widget.component.ts
@@ -80,6 +80,9 @@ export class TrafficLightWidgetComponent extends BaseStreamPipesWidget implement
         this.selectedLimitGreaterThan = extractor.selectedSingleValue(TrafficLightConfig.CRITICAL_VALUE_LIMIT) === 'Upper Limit';
     }
 
+    getFieldsToQuery(): string[] {
+        return [this.selectedFieldToObserve];
+    }
 
     protected onEvent(events: any[]) {
         const item = events[0][this.selectedFieldToObserve];
diff --git a/ui/src/app/dashboard/components/widgets/wordcloud/wordcloud-widget.component.ts b/ui/src/app/dashboard/components/widgets/wordcloud/wordcloud-widget.component.ts
index 0a086344a..aa8a237f8 100644
--- a/ui/src/app/dashboard/components/widgets/wordcloud/wordcloud-widget.component.ts
+++ b/ui/src/app/dashboard/components/widgets/wordcloud/wordcloud-widget.component.ts
@@ -106,6 +106,10 @@ export class WordcloudWidgetComponent extends BaseStreamPipesWidget implements O
     this.windowSize = extractor.integerParameter(WordCloudConfig.WINDOW_SIZE_KEY);
   }
 
+  getFieldsToQuery(): string[] {
+    return [this.countProperty, this.nameProperty];
+  }
+
   protected onEvent(event: any) {
     const value = event[this.countProperty];
     const name = event[this.nameProperty];