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];