Skip to content

Commit

Permalink
feat: Support multiple queries per subscription (#39)
Browse files Browse the repository at this point in the history
Support multiple queries per subscription
  • Loading branch information
boweihan committed Jan 24, 2022
1 parent d165299 commit 67b7afa
Show file tree
Hide file tree
Showing 28 changed files with 453 additions and 232 deletions.
32 changes: 16 additions & 16 deletions packages/components/src/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,29 @@ export namespace Components {
interface IotBarChart {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
}
interface IotConnector {
"appKit": DataModule;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"renderFunc": ({ dataStreams }: { dataStreams: DataStream[] }) => unknown;
"request": TimeSeriesDataRequest;
}
interface IotKpi {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
}
interface IotLineChart {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
Expand All @@ -68,30 +68,30 @@ export namespace Components {
interface IotScatterChart {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
}
interface IotStatusGrid {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
}
interface IotStatusTimeline {
"appKit": DataModule;
"isEditing": boolean | undefined;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
}
interface IotTable {
"appKit": DataModule;
"query": AnyDataStreamQuery;
"queries": AnyDataStreamQuery[];
"settings": TimeSeriesDataRequestSettings | undefined;
"viewport": MinimalViewPortConfig;
"widgetId": string;
Expand Down Expand Up @@ -268,29 +268,29 @@ declare namespace LocalJSX {
interface IotBarChart {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
}
interface IotConnector {
"appKit"?: DataModule;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"renderFunc"?: ({ dataStreams }: { dataStreams: DataStream[] }) => unknown;
"request"?: TimeSeriesDataRequest;
}
interface IotKpi {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
}
interface IotLineChart {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
Expand All @@ -314,30 +314,30 @@ declare namespace LocalJSX {
interface IotScatterChart {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
}
interface IotStatusGrid {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
}
interface IotStatusTimeline {
"appKit"?: DataModule;
"isEditing"?: boolean | undefined;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
}
interface IotTable {
"appKit"?: DataModule;
"query"?: AnyDataStreamQuery;
"queries"?: AnyDataStreamQuery[];
"settings"?: TimeSeriesDataRequestSettings | undefined;
"viewport"?: MinimalViewPortConfig;
"widgetId"?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ const barChartSpecPage = async (propOverrides: Partial<Components.IotBarChart> =
appKit,
widgetId: 'test-bar-chart-widget',
isEditing: false,
query: {
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery,
queries: [
{
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery,
],
viewport,
...propOverrides,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const DEFAULT_VIEWPORT = { duration: 10 * 1000 * 60 };
export class IotBarChart {
@Prop() appKit: DataModule;

@Prop() query: AnyDataStreamQuery;
@Prop() queries: AnyDataStreamQuery[];

@Prop() viewport: MinimalViewPortConfig = DEFAULT_VIEWPORT;

Expand All @@ -36,7 +36,7 @@ export class IotBarChart {
return (
<iot-connector
appKit={this.appKit}
query={this.query}
queries={this.queries}
request={{
settings,
viewport: this.viewport,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { IotConnector } from './iot-connector';
import { createMockSource } from '../../testing/createMockSource';
import { update } from '../../testing/update';
import { CustomHTMLElement } from '../../testing/types';
import { DATA_STREAM } from '../../testing/mockWidgetProperties';
import { DATA_STREAM, DATA_STREAM_2 } from '../../testing/mockWidgetProperties';
import { toSiteWiseAssetProperty } from '../../testing/dataStreamId';
import { Components } from '../../components';

Expand All @@ -17,7 +17,7 @@ const viewport: MinimalLiveViewport = {
const connectorSpecPage = async (propOverrides: Partial<Components.IotConnector> = {}) => {
/** Initialize data source and register mock data source */
const appKit = initialize({ registerDataSources: false });
registerDataSource(appKit, createMockSource([DATA_STREAM]));
registerDataSource(appKit, createMockSource([DATA_STREAM, DATA_STREAM_2]));

const page = await newSpecPage({
components: [IotConnector],
Expand All @@ -27,10 +27,12 @@ const connectorSpecPage = async (propOverrides: Partial<Components.IotConnector>
const connector = page.doc.createElement('iot-connector') as CustomHTMLElement<Components.IotConnector>;
const props: Partial<Components.IotConnector> = {
appKit,
query: {
source: 'test-mock',
assets: [],
} as SiteWiseDataStreamQuery, // static casting because of legacy sw
queries: [
{
source: 'test-mock',
assets: [],
} as SiteWiseDataStreamQuery,
], // static casting because of legacy sw
request: { viewport, settings: { fetchMostRecentBeforeEnd: true } },
...propOverrides,
};
Expand All @@ -52,14 +54,21 @@ it('renders', async () => {

it('provides data streams', async () => {
const renderFunc = jest.fn();
const { assetId, propertyId } = toSiteWiseAssetProperty(DATA_STREAM.id);
const { assetId: assetId_1, propertyId: propertyId_1 } = toSiteWiseAssetProperty(DATA_STREAM.id);
const { assetId: assetId_2, propertyId: propertyId_2 } = toSiteWiseAssetProperty(DATA_STREAM_2.id);

await connectorSpecPage({
renderFunc,
query: {
source: 'test-mock',
assets: [{ assetId, properties: [{ propertyId }] }],
} as SiteWiseDataStreamQuery,
queries: [
{
source: 'test-mock',
assets: [{ assetId: assetId_1, properties: [{ propertyId: propertyId_1 }] }],
} as SiteWiseDataStreamQuery,
{
source: 'test-mock',
assets: [{ assetId: assetId_2, properties: [{ propertyId: propertyId_2 }] }],
} as SiteWiseDataStreamQuery,
],
});

await flushPromises();
Expand All @@ -69,26 +78,39 @@ it('provides data streams', async () => {
expect.objectContaining({
id: DATA_STREAM.id,
}),
expect.objectContaining({
id: DATA_STREAM_2.id,
}),
],
});
});

it('updates with new query', async () => {
const { assetId, propertyId } = toSiteWiseAssetProperty(DATA_STREAM.id);
it('updates with new queries', async () => {
const { assetId: assetId_1, propertyId: propertyId_1 } = toSiteWiseAssetProperty(DATA_STREAM.id);
const { assetId: assetId_2, propertyId: propertyId_2 } = toSiteWiseAssetProperty(DATA_STREAM_2.id);

const renderFunc = jest.fn();
const { connector, page } = await connectorSpecPage({
renderFunc,
query: {
source: 'test-mock',
assets: [],
} as SiteWiseDataStreamQuery,
queries: [
{
source: 'test-mock',
assets: [],
} as SiteWiseDataStreamQuery,
],
});
await flushPromises();

connector.query = {
source: 'test-mock',
assets: [{ assetId, properties: [{ propertyId }] }],
} as SiteWiseDataStreamQuery;
connector.queries = [
{
source: 'test-mock',
assets: [{ assetId: assetId_1, properties: [{ propertyId: propertyId_1 }] }],
} as SiteWiseDataStreamQuery,
{
source: 'test-mock',
assets: [{ assetId: assetId_2, properties: [{ propertyId: propertyId_2 }] }],
} as SiteWiseDataStreamQuery,
];

await page.waitForChanges();
await flushPromises();
Expand All @@ -98,6 +120,9 @@ it('updates with new query', async () => {
expect.objectContaining({
id: DATA_STREAM.id,
}),
expect.objectContaining({
id: DATA_STREAM_2.id,
}),
],
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
export class IotConnector {
@Prop() appKit: DataModule;

@Prop() query: AnyDataStreamQuery;
@Prop() queries: AnyDataStreamQuery[];

@Prop() request: TimeSeriesDataRequest;

Expand All @@ -33,7 +33,7 @@ export class IotConnector {
const { update, unsubscribe } = subscribeToDataStreams(
this.appKit,
{
query: this.query,
queries: this.queries,
request: this.request,
},
(dataStreams: DataStream[]) => {
Expand All @@ -54,11 +54,11 @@ export class IotConnector {
* Sync subscription to change in queried data
*/
@Watch('request')
@Watch('query')
@Watch('queries')
onUpdateProp(newProp: unknown, oldProp: unknown) {
if (!isEqual(newProp, oldProp) && this.update != null) {
this.update({
query: this.query,
queries: this.queries,
request: this.request,
});
}
Expand Down
10 changes: 6 additions & 4 deletions packages/components/src/components/iot-kpi/iot-kpi.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ const kpiSpecPage = async (propOverrides: Partial<Components.IotKpi> = {}) => {
appKit,
widgetId: 'test-kpi-widget',
isEditing: false,
query: {
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery, // static casting because of legacy sw
queries: [
{
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery,
], // static casting because of legacy sw
viewport,
...propOverrides,
};
Expand Down
4 changes: 2 additions & 2 deletions packages/components/src/components/iot-kpi/iot-kpi.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const DEFAULT_VIEWPORT = { duration: 10 * 1000 };
export class IotKpi {
@Prop() appKit: DataModule;

@Prop() query: AnyDataStreamQuery;
@Prop() queries: AnyDataStreamQuery[];

@Prop() viewport: MinimalViewPortConfig = DEFAULT_VIEWPORT;

Expand All @@ -36,7 +36,7 @@ export class IotKpi {
return (
<iot-connector
appKit={this.appKit}
query={this.query}
queries={this.queries}
request={{
settings,
viewport: this.viewport,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ const lineChartSpecPage = async (propOverrides: Partial<Components.IotKpi> = {})
appKit,
widgetId: 'test-line-chart-widget',
isEditing: false,
query: {
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery, // static casting because of legacy sw
queries: [
{
source: 'test-mock',
assets: [{ assetId: 'some-asset-id', properties: [{ propertyId: 'some-property-id' }] }],
} as SiteWiseDataStreamQuery,
], // static casting because of legacy sw
viewport,
...propOverrides,
};
Expand Down
Loading

0 comments on commit 67b7afa

Please sign in to comment.