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) {
this.listeners.push(listener);
if (this.history) {
this.start();
}
}
public hasListeners(): boolean {
@ -172,6 +169,7 @@ export class EntityDataSubscription {
}
listener.dataLoaded(this.pageData, data, listener.configDatasourceIndex);
}
this.listeners.push(listener);
}
public unsubscribe() {
@ -195,9 +193,6 @@ export class EntityDataSubscription {
}
public start() {
if (this.history && !this.hasListeners()) {
return;
}
this.subsTw = this.entityDataSubscriptionOptions.subscriptionTimewindow;
if (this.datasourceType === DatasourceType.entity) {
const entityFields: Array<EntityKey> =
@ -350,16 +345,18 @@ export class EntityDataSubscription {
this.dataAggregators = [];
this.entityIdToDataIndex = {};
let tsKeyNames;
if (this.datasourceType === DatasourceType.function) {
tsKeyNames = [];
for (const key of Object.keys(this.dataKeys)) {
const dataKeysList = this.dataKeys[key] as Array<SubscriptionDataKey>;
dataKeysList.forEach((subscriptionDataKey) => {
tsKeyNames.push(`${subscriptionDataKey.name}_${subscriptionDataKey.index}`);
});
if (this.entityDataSubscriptionOptions.type === widgetType.timeseries) {
if (this.datasourceType === DatasourceType.function) {
tsKeyNames = [];
for (const key of Object.keys(this.dataKeys)) {
const dataKeysList = this.dataKeys[key] as Array<SubscriptionDataKey>;
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++) {
const entityData = pageData.data[dataIndex];
@ -405,6 +402,8 @@ export class EntityDataSubscription {
);
}
this.pageData = pageData;
this.listeners.forEach((listener) => {
listener.dataLoaded(pageData, data,
listener.configDatasourceIndex);
@ -505,7 +504,7 @@ export class EntityDataSubscription {
update = true;
}
if (update) {
this.datasourceData[datasourceKey].data = data;
this.datasourceData[dataIndex][datasourceKey].data = data;
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,
this.telemetryService, this.utils);
this.subscriptions[listener.entityDataSubscriptionKey] = subscription;
subscription.addListener(listener);
subscription.start();
}
subscription.addListener(listener);
}
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;
onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): void;
onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): boolean;
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>;
configuredDatasources: Array<Datasource>;
initDataSubscriptionSubject: Subject<void>;
data: Array<DatasourceData>;
datasources: Array<Datasource>;
// datasourceListeners: Array<DatasourceListener>;
@ -135,6 +136,8 @@ export class WidgetSubscription implements IWidgetSubscription {
targetDeviceName: string;
executingSubjects: Array<Subject<any>>;
subscribed = false;
constructor(subscriptionContext: WidgetSubscriptionContext, public options: WidgetSubscriptionOptions) {
const subscriptionSubject = new ReplaySubject<IWidgetSubscription>();
this.init$ = subscriptionSubject.asObservable();
@ -345,32 +348,34 @@ export class WidgetSubscription implements IWidgetSubscription {
}
private initDataSubscription(): Observable<any> {
const initDataSubscriptionSubject = new ReplaySubject(1);
this.initDataSubscriptionSubject = new ReplaySubject(1);
this.loadStDiff().subscribe(() => {
if (!this.ctx.aliasController) {
this.hasResolvedData = true;
// this.configureData();
initDataSubscriptionSubject.next();
initDataSubscriptionSubject.complete();
// initDataSubscriptionSubject.next();
// initDataSubscriptionSubject.complete();
this.subscribe();
} else {
this.ctx.aliasController.resolveDatasources(this.configuredDatasources).subscribe(
(datasources) => {
this.configuredDatasources = datasources;
if (datasources && datasources.length) {
/* if (datasources && datasources.length) {
this.hasResolvedData = true;
}
}*/
this.subscribe();
// this.configureData();
initDataSubscriptionSubject.next();
initDataSubscriptionSubject.complete();
// initDataSubscriptionSubject.next();
// initDataSubscriptionSubject.complete();
},
(err) => {
this.notifyDataLoaded();
initDataSubscriptionSubject.error(err);
this.initDataSubscriptionSubject.error(err);
}
);
}
});
return initDataSubscriptionSubject.asObservable();
return this.initDataSubscriptionSubject.asObservable();
}
/* 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.useDashboardTimewindow) {
if (!isEqual(this.timeWindowConfig, newDashboardTimewindow) && newDashboardTimewindow) {
this.timeWindowConfig = deepClone(newDashboardTimewindow);
this.update();
// this.timeWindowConfig = deepClone(newDashboardTimewindow);
// this.update();
// TODO:
return true;
}
}
}
return false;
}
private onAlarmSearchStatusChanged() {
@ -782,13 +790,16 @@ export class WidgetSubscription implements IWidgetSubscription {
}
subscribe(): void {
if (this.cafs.subscribe) {
this.cafs.subscribe();
this.cafs.subscribe = null;
if (!this.subscribed) {
this.subscribed = true;
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() {
@ -995,6 +1006,7 @@ export class WidgetSubscription implements IWidgetSubscription {
this.resetData();
}
}
this.subscribed = false;
}
/* unsubscribeOld() {
@ -1119,6 +1131,7 @@ export class WidgetSubscription implements IWidgetSubscription {
private dataLoaded(pageData: PageData<EntityData>, data: Array<Array<DataSetHolder>>, datasourceIndex: number) {
const datasource = this.configuredDatasources[datasourceIndex];
datasource.dataReceived = true;
const datasources = pageData.data.map((entityData, index) =>
this.entityDataToDatasource(datasource, entityData, index)
);
@ -1140,7 +1153,15 @@ export class WidgetSubscription implements IWidgetSubscription {
};
this.dataPages[datasourceIndex] = datasourceDataPage;
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() {
@ -1204,7 +1225,6 @@ export class WidgetSubscription implements IWidgetSubscription {
});
this.callbacks.legendDataUpdated(this, true);
}
this.onDataUpdated(true);
}
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 {
const newDatasource = deepClone(configDatasource);
newDatasource.dataReceived = true;
newDatasource.entity = {};
newDatasource.entityId = entityData.entityId.id;
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 { CancelAnimationFrame, RafService } from '@core/services/raf.service';
import { DashboardService } from '@core/http/dashboard.service';
import { DatasourceService } from '@core/api/datasource.service';
import { WidgetSubscription } from '@core/api/widget-subscription';
import { EntityService } from '@core/http/entity.service';
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(
(dashboardTimewindow) => {
// TODO:
let subscriptionChanged = false;
for (const id of Object.keys(this.widgetContext.subscriptions)) {
const subscription = this.widgetContext.subscriptions[id];
subscription.onDashboardTimewindowChanged(dashboardTimewindow);
subscriptionChanged = subscriptionChanged || subscription.onDashboardTimewindowChanged(dashboardTimewindow);
}
if (subscriptionChanged && !this.typeParameters.useCustomDatasources) {
this.reInit();
}
}
));

Loading…
Cancel
Save