Browse Source

UI: entity data query improvements

pull/3053/head
Igor Kulikov 6 years ago
parent
commit
f1e91d1d0c
  1. 31
      ui-ngx/src/app/core/api/entity-data-subscription.ts
  2. 2
      ui-ngx/src/app/core/api/entity-data.service.ts
  3. 2
      ui-ngx/src/app/core/api/widget-api.models.ts
  4. 61
      ui-ngx/src/app/core/api/widget-subscription.ts
  5. 8
      ui-ngx/src/app/modules/home/components/widget/widget.component.ts

31
ui-ngx/src/app/core/api/entity-data-subscription.ts

@ -136,9 +136,6 @@ export class EntityDataSubscription {
public addListener(listener: EntityDataListener) { public addListener(listener: EntityDataListener) {
this.listeners.push(listener); this.listeners.push(listener);
if (this.history) {
this.start();
}
} }
public hasListeners(): boolean { public hasListeners(): boolean {
@ -172,6 +169,7 @@ export class EntityDataSubscription {
} }
listener.dataLoaded(this.pageData, data, listener.configDatasourceIndex); listener.dataLoaded(this.pageData, data, listener.configDatasourceIndex);
} }
this.listeners.push(listener);
} }
public unsubscribe() { public unsubscribe() {
@ -195,9 +193,6 @@ export class EntityDataSubscription {
} }
public start() { public start() {
if (this.history && !this.hasListeners()) {
return;
}
this.subsTw = this.entityDataSubscriptionOptions.subscriptionTimewindow; this.subsTw = this.entityDataSubscriptionOptions.subscriptionTimewindow;
if (this.datasourceType === DatasourceType.entity) { if (this.datasourceType === DatasourceType.entity) {
const entityFields: Array<EntityKey> = const entityFields: Array<EntityKey> =
@ -350,16 +345,18 @@ export class EntityDataSubscription {
this.dataAggregators = []; this.dataAggregators = [];
this.entityIdToDataIndex = {}; this.entityIdToDataIndex = {};
let tsKeyNames; let tsKeyNames;
if (this.datasourceType === DatasourceType.function) { if (this.entityDataSubscriptionOptions.type === widgetType.timeseries) {
tsKeyNames = []; if (this.datasourceType === DatasourceType.function) {
for (const key of Object.keys(this.dataKeys)) { tsKeyNames = [];
const dataKeysList = this.dataKeys[key] as Array<SubscriptionDataKey>; for (const key of Object.keys(this.dataKeys)) {
dataKeysList.forEach((subscriptionDataKey) => { const dataKeysList = this.dataKeys[key] as Array<SubscriptionDataKey>;
tsKeyNames.push(`${subscriptionDataKey.name}_${subscriptionDataKey.index}`); dataKeysList.forEach((subscriptionDataKey) => {
}); tsKeyNames.push(`${subscriptionDataKey.name}_${subscriptionDataKey.index}`);
});
}
} else {
tsKeyNames = this.tsFields ? this.tsFields.map(field => field.key) : [];
} }
} else {
tsKeyNames = this.tsFields.map(field => field.key);
} }
for (let dataIndex = 0; dataIndex < pageData.data.length; dataIndex++) { for (let dataIndex = 0; dataIndex < pageData.data.length; dataIndex++) {
const entityData = pageData.data[dataIndex]; const entityData = pageData.data[dataIndex];
@ -405,6 +402,8 @@ export class EntityDataSubscription {
); );
} }
this.pageData = pageData;
this.listeners.forEach((listener) => { this.listeners.forEach((listener) => {
listener.dataLoaded(pageData, data, listener.dataLoaded(pageData, data,
listener.configDatasourceIndex); listener.configDatasourceIndex);
@ -505,7 +504,7 @@ export class EntityDataSubscription {
update = true; update = true;
} }
if (update) { if (update) {
this.datasourceData[datasourceKey].data = data; this.datasourceData[dataIndex][datasourceKey].data = data;
dataUpdatedCb(this.datasourceData[dataIndex][datasourceKey], dataIndex, dataKey.index, detectChanges); dataUpdatedCb(this.datasourceData[dataIndex][datasourceKey], dataIndex, dataKey.index, detectChanges);
} }
} }

2
ui-ngx/src/app/core/api/entity-data.service.ts

@ -86,9 +86,9 @@ export class EntityDataService {
subscription = new EntityDataSubscription(entityDataSubscriptionOptions, subscription = new EntityDataSubscription(entityDataSubscriptionOptions,
this.telemetryService, this.utils); this.telemetryService, this.utils);
this.subscriptions[listener.entityDataSubscriptionKey] = subscription; this.subscriptions[listener.entityDataSubscriptionKey] = subscription;
subscription.addListener(listener);
subscription.start(); subscription.start();
} }
subscription.addListener(listener);
} }
public unsubscribeFromDatasource(listener: EntityDataListener) { public unsubscribeFromDatasource(listener: EntityDataListener) {

2
ui-ngx/src/app/core/api/widget-api.models.ts

@ -264,7 +264,7 @@ export interface IWidgetSubscription {
onAliasesChanged(aliasIds: Array<string>): boolean; onAliasesChanged(aliasIds: Array<string>): boolean;
onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): void; onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): boolean;
updateDataVisibility(index: number): void; updateDataVisibility(index: number): void;

61
ui-ngx/src/app/core/api/widget-subscription.ts

@ -78,6 +78,7 @@ export class WidgetSubscription implements IWidgetSubscription {
entityDataListeners: Array<EntityDataListener>; entityDataListeners: Array<EntityDataListener>;
configuredDatasources: Array<Datasource>; configuredDatasources: Array<Datasource>;
initDataSubscriptionSubject: Subject<void>;
data: Array<DatasourceData>; data: Array<DatasourceData>;
datasources: Array<Datasource>; datasources: Array<Datasource>;
// datasourceListeners: Array<DatasourceListener>; // datasourceListeners: Array<DatasourceListener>;
@ -135,6 +136,8 @@ export class WidgetSubscription implements IWidgetSubscription {
targetDeviceName: string; targetDeviceName: string;
executingSubjects: Array<Subject<any>>; executingSubjects: Array<Subject<any>>;
subscribed = false;
constructor(subscriptionContext: WidgetSubscriptionContext, public options: WidgetSubscriptionOptions) { constructor(subscriptionContext: WidgetSubscriptionContext, public options: WidgetSubscriptionOptions) {
const subscriptionSubject = new ReplaySubject<IWidgetSubscription>(); const subscriptionSubject = new ReplaySubject<IWidgetSubscription>();
this.init$ = subscriptionSubject.asObservable(); this.init$ = subscriptionSubject.asObservable();
@ -345,32 +348,34 @@ export class WidgetSubscription implements IWidgetSubscription {
} }
private initDataSubscription(): Observable<any> { private initDataSubscription(): Observable<any> {
const initDataSubscriptionSubject = new ReplaySubject(1); this.initDataSubscriptionSubject = new ReplaySubject(1);
this.loadStDiff().subscribe(() => { this.loadStDiff().subscribe(() => {
if (!this.ctx.aliasController) { if (!this.ctx.aliasController) {
this.hasResolvedData = true; this.hasResolvedData = true;
// this.configureData(); // this.configureData();
initDataSubscriptionSubject.next(); // initDataSubscriptionSubject.next();
initDataSubscriptionSubject.complete(); // initDataSubscriptionSubject.complete();
this.subscribe();
} else { } else {
this.ctx.aliasController.resolveDatasources(this.configuredDatasources).subscribe( this.ctx.aliasController.resolveDatasources(this.configuredDatasources).subscribe(
(datasources) => { (datasources) => {
this.configuredDatasources = datasources; this.configuredDatasources = datasources;
if (datasources && datasources.length) { /* if (datasources && datasources.length) {
this.hasResolvedData = true; this.hasResolvedData = true;
} }*/
this.subscribe();
// this.configureData(); // this.configureData();
initDataSubscriptionSubject.next(); // initDataSubscriptionSubject.next();
initDataSubscriptionSubject.complete(); // initDataSubscriptionSubject.complete();
}, },
(err) => { (err) => {
this.notifyDataLoaded(); this.notifyDataLoaded();
initDataSubscriptionSubject.error(err); this.initDataSubscriptionSubject.error(err);
} }
); );
} }
}); });
return initDataSubscriptionSubject.asObservable(); return this.initDataSubscriptionSubject.asObservable();
} }
/* private initDataSubscriptionOld(): Observable<any> { /* private initDataSubscriptionOld(): Observable<any> {
@ -587,15 +592,18 @@ export class WidgetSubscription implements IWidgetSubscription {
}); });
} }
onDashboardTimewindowChanged(newDashboardTimewindow: Timewindow): void { onDashboardTimewindowChanged(newDashboardTimewindow: Timewindow): boolean {
if (this.type === widgetType.timeseries || this.type === widgetType.alarm) { if (this.type === widgetType.timeseries || this.type === widgetType.alarm) {
if (this.useDashboardTimewindow) { if (this.useDashboardTimewindow) {
if (!isEqual(this.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) { if (!isEqual(this.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) {
this.timeWindowConfig = deepClone(newDashboardTimewindow); // this.timeWindowConfig = deepClone(newDashboardTimewindow);
this.update(); // this.update();
// TODO:
return true;
} }
} }
} }
return false;
} }
private onAlarmSearchStatusChanged() { private onAlarmSearchStatusChanged() {
@ -782,13 +790,16 @@ export class WidgetSubscription implements IWidgetSubscription {
} }
subscribe(): void { subscribe(): void {
if (this.cafs.subscribe) { if (!this.subscribed) {
this.cafs.subscribe(); this.subscribed = true;
this.cafs.subscribe = null; if (this.cafs.subscribe) {
this.cafs.subscribe();
this.cafs.subscribe = null;
}
this.cafs.subscribe = this.ctx.raf.raf(() => {
this.doSubscribe();
});
} }
this.cafs.subscribe = this.ctx.raf.raf(() => {
this.doSubscribe();
});
} }
private doSubscribe() { private doSubscribe() {
@ -995,6 +1006,7 @@ export class WidgetSubscription implements IWidgetSubscription {
this.resetData(); this.resetData();
} }
} }
this.subscribed = false;
} }
/* unsubscribeOld() { /* unsubscribeOld() {
@ -1119,6 +1131,7 @@ export class WidgetSubscription implements IWidgetSubscription {
private dataLoaded(pageData: PageData<EntityData>, data: Array<Array<DataSetHolder>>, datasourceIndex: number) { private dataLoaded(pageData: PageData<EntityData>, data: Array<Array<DataSetHolder>>, datasourceIndex: number) {
const datasource = this.configuredDatasources[datasourceIndex]; const datasource = this.configuredDatasources[datasourceIndex];
datasource.dataReceived = true;
const datasources = pageData.data.map((entityData, index) => const datasources = pageData.data.map((entityData, index) =>
this.entityDataToDatasource(datasource, entityData, index) this.entityDataToDatasource(datasource, entityData, index)
); );
@ -1140,7 +1153,15 @@ export class WidgetSubscription implements IWidgetSubscription {
}; };
this.dataPages[datasourceIndex] = datasourceDataPage; this.dataPages[datasourceIndex] = datasourceDataPage;
this.configureLoadedData(); this.configureLoadedData();
this.notifyDataLoaded(); const readyCount = this.configuredDatasources.filter(d => d.dataReceived).length;
if (this.configuredDatasources.length === readyCount) {
this.hasResolvedData = true;
this.initDataSubscriptionSubject.next();
this.initDataSubscriptionSubject.complete();
this.configureLoadedData();
this.notifyDataLoaded();
this.onDataUpdated(true);
}
} }
private configureLoadedData() { private configureLoadedData() {
@ -1204,7 +1225,6 @@ export class WidgetSubscription implements IWidgetSubscription {
}); });
this.callbacks.legendDataUpdated(this, true); this.callbacks.legendDataUpdated(this, true);
} }
this.onDataUpdated(true);
} }
private entityDataToDatasourceData(datasource: Datasource, data: Array<DataSetHolder>): Array<DatasourceData> { private entityDataToDatasourceData(datasource: Datasource, data: Array<DataSetHolder>): Array<DatasourceData> {
@ -1224,7 +1244,6 @@ export class WidgetSubscription implements IWidgetSubscription {
private entityDataToDatasource(configDatasource: Datasource, entityData: EntityData, index: number): Datasource { private entityDataToDatasource(configDatasource: Datasource, entityData: EntityData, index: number): Datasource {
const newDatasource = deepClone(configDatasource); const newDatasource = deepClone(configDatasource);
newDatasource.dataReceived = true;
newDatasource.entity = {}; newDatasource.entity = {};
newDatasource.entityId = entityData.entityId.id; newDatasource.entityId = entityData.entityId.id;
newDatasource.entityType = entityData.entityId.entityType as EntityType; newDatasource.entityType = entityData.entityId.entityType as EntityType;

8
ui-ngx/src/app/modules/home/components/widget/widget.component.ts

@ -87,7 +87,6 @@ import { Timewindow } from '@shared/models/time/time.models';
import { AlarmSearchStatus } from '@shared/models/alarm.models'; import { AlarmSearchStatus } from '@shared/models/alarm.models';
import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; import { CancelAnimationFrame, RafService } from '@core/services/raf.service';
import { DashboardService } from '@core/http/dashboard.service'; import { DashboardService } from '@core/http/dashboard.service';
import { DatasourceService } from '@core/api/datasource.service';
import { WidgetSubscription } from '@core/api/widget-subscription'; import { WidgetSubscription } from '@core/api/widget-subscription';
import { EntityService } from '@core/http/entity.service'; import { EntityService } from '@core/http/entity.service';
import { ServicesMap } from '@home/models/services.map'; import { ServicesMap } from '@home/models/services.map';
@ -621,9 +620,14 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
this.rxSubscriptions.push(this.widgetContext.dashboard.dashboardTimewindowChanged.subscribe( this.rxSubscriptions.push(this.widgetContext.dashboard.dashboardTimewindowChanged.subscribe(
(dashboardTimewindow) => { (dashboardTimewindow) => {
// TODO:
let subscriptionChanged = false;
for (const id of Object.keys(this.widgetContext.subscriptions)) { for (const id of Object.keys(this.widgetContext.subscriptions)) {
const subscription = this.widgetContext.subscriptions[id]; const subscription = this.widgetContext.subscriptions[id];
subscription.onDashboardTimewindowChanged(dashboardTimewindow); subscriptionChanged = subscriptionChanged || subscription.onDashboardTimewindowChanged(dashboardTimewindow);
}
if (subscriptionChanged && !this.typeParameters.useCustomDatasources) {
this.reInit();
} }
} }
)); ));

Loading…
Cancel
Save