Skip to content

Commit

Permalink
feat(asset): add group by vendor, assetType, busType (#84)
Browse files Browse the repository at this point in the history
Co-authored-by: Robert Aradei <[email protected]>
  • Loading branch information
saradei-ni and Robert Aradei authored Oct 15, 2024
1 parent 9db5027 commit 0e30e6a
Show file tree
Hide file tree
Showing 4 changed files with 431 additions and 12 deletions.
136 changes: 135 additions & 1 deletion src/datasources/asset-calibration/AssetCalibrationDataSource.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import {
AssetCalibrationPropertyGroupByType,
AssetCalibrationQuery,
AssetCalibrationTimeBasedGroupByType,
AssetType,
BusType,
CalibrationForecastResponse,
ColumnDescriptorType,
} from "./types";
Expand Down Expand Up @@ -132,6 +134,36 @@ const workspaceGroupCalibrationForecastResponseMock: CalibrationForecastResponse
}
}

const vendorGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: [1], columnDescriptors: [{ value: "Vendor1", type: ColumnDescriptorType.StringValue }] },
{ name: "", values: [2], columnDescriptors: [{ value: "Vendor2", type: ColumnDescriptorType.StringValue }] }
]
}
}

const assetTypeGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: [1], columnDescriptors: [{ value: AssetType.GENERIC, type: ColumnDescriptorType.AssetType }] },
{ name: "", values: [2], columnDescriptors: [{ value: AssetType.DEVICE_UNDER_TEST, type: ColumnDescriptorType.AssetType }] }
]
}
}

const busTypeGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: [1], columnDescriptors: [{ value: BusType.BUILT_IN_SYSTEM, type: ColumnDescriptorType.BusType }] },
{ name: "", values: [2], columnDescriptors: [{ value: BusType.FIRE_WIRE, type: ColumnDescriptorType.BusType }] }
]
}
}

const modelWorkspaceGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
Expand All @@ -154,6 +186,42 @@ const monthWorkspaceGroupCalibrationForecastResponseMock: CalibrationForecastRes
}
}

const monthVendorGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: ["2022-01-01T00:00:00.0000000Z", "2022-02-01T00:00:00.0000000Z", "2022-03-01T00:00:00.0000000Z"], columnDescriptors: [{ value: "Month", type: ColumnDescriptorType.Time }] },
{ name: "", values: [1, 2, 3], columnDescriptors: [{ value: "Vendor1", type: ColumnDescriptorType.StringValue }] },
{ name: "", values: [2, 4, 1], columnDescriptors: [{ value: "Vendor2", type: ColumnDescriptorType.StringValue }] },
{ name: "", values: [4, 3, 1], columnDescriptors: [{ value: "Vendor3", type: ColumnDescriptorType.StringValue }] }
]
}
}

const monthAssetTypeGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: ["2022-01-01T00:00:00.0000000Z", "2022-02-01T00:00:00.0000000Z", "2022-03-01T00:00:00.0000000Z"], columnDescriptors: [{ value: "Month", type: ColumnDescriptorType.Time }] },
{ name: "", values: [1, 2, 3], columnDescriptors: [{ value: AssetType.DEVICE_UNDER_TEST, type: ColumnDescriptorType.AssetType }] },
{ name: "", values: [2, 4, 1], columnDescriptors: [{ value: AssetType.FIXTURE, type: ColumnDescriptorType.AssetType }] },
{ name: "", values: [4, 3, 1], columnDescriptors: [{ value: AssetType.GENERIC, type: ColumnDescriptorType.AssetType }] }
]
}
}

const monthBusTypeGroupCalibrationForecastResponseMock: CalibrationForecastResponse =
{
calibrationForecast: {
columns: [
{ name: "", values: ["2022-01-01T00:00:00.0000000Z", "2022-02-01T00:00:00.0000000Z", "2022-03-01T00:00:00.0000000Z"], columnDescriptors: [{ value: "Month", type: ColumnDescriptorType.Time }] },
{ name: "", values: [1, 2, 3], columnDescriptors: [{ value: BusType.BUILT_IN_SYSTEM, type: ColumnDescriptorType.BusType }] },
{ name: "", values: [2, 4, 1], columnDescriptors: [{ value: BusType.ACCESSORY, type: ColumnDescriptorType.BusType }] },
{ name: "", values: [4, 3, 1], columnDescriptors: [{ value: BusType.SERIAL, type: ColumnDescriptorType.BusType }] }
]
}
}

const monthBasedCalibrationForecastQueryMock: AssetCalibrationQuery = {
refId: '',
groupBy: [AssetCalibrationTimeBasedGroupByType.Month],
Expand Down Expand Up @@ -355,6 +423,72 @@ describe('queries', () => {
expect(result.data).toMatchSnapshot()
})

test('calibration forecast with vendor groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(vendorGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({ groupBy: [AssetCalibrationPropertyGroupByType.Vendor] }))

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with month and vendor groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(monthVendorGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({
groupBy: [AssetCalibrationTimeBasedGroupByType.Month, AssetCalibrationPropertyGroupByType.Vendor]
}));

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with assetType groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(assetTypeGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({ groupBy: [AssetCalibrationPropertyGroupByType.AssetType] }))

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with month and assetType groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(monthAssetTypeGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({
groupBy: [AssetCalibrationTimeBasedGroupByType.Month, AssetCalibrationPropertyGroupByType.AssetType]
}));

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with busType groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(busTypeGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({ groupBy: [AssetCalibrationPropertyGroupByType.BusType] }))

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with month and busType groupBy', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
.mockReturnValue(createFetchResponse(monthBusTypeGroupCalibrationForecastResponseMock as CalibrationForecastResponse))

const result = await datastore.query(buildCalibrationForecastQuery({
groupBy: [AssetCalibrationTimeBasedGroupByType.Month, AssetCalibrationPropertyGroupByType.BusType]
}));

expect(result.data).toMatchSnapshot();
})

test('calibration forecast with month groupBy returns empty results', async () => {
backendServer.fetch
.calledWith(requestMatching({ url: '/niapm/v1/assets/calibration-forecast' }))
Expand All @@ -372,7 +506,7 @@ describe('queries', () => {

await expect(datastore.query(buildCalibrationForecastQuery(monthBasedCalibrationForecastQueryMock))).rejects.toThrow()
})

test('validate DAY grouping', async () => {
const request = buildCalibrationForecastQuery(dayBasedCalibrationForecastQueryMock);
const numberOfDays = 31 * 3 + 1;
Expand Down
32 changes: 21 additions & 11 deletions src/datasources/asset-calibration/AssetCalibrationDataSource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ import {
AssetCalibrationForecastKey,
AssetCalibrationQuery,
AssetCalibrationTimeBasedGroupByType,
AssetType,
AssetTypeOptions,
BusType,
BusTypeOptions,
CalibrationForecastResponse,
ColumnDescriptorType,
FieldDTOWithDescriptor,
Expand Down Expand Up @@ -40,6 +44,12 @@ export class AssetCalibrationDataSource extends DataSourceBase<AssetCalibrationQ

public readonly systemAliasCache: TTLCache<string, SystemMetadata> = new TTLCache<string, SystemMetadata>({ ttl: metadataCacheTTL });
public readonly workspacesCache: TTLCache<string, Workspace> = new TTLCache<string, Workspace>({ ttl: metadataCacheTTL });
public readonly busTypeCache = new Map<BusType, string>([
...BusTypeOptions.map(busType => [busType.value, busType.label]) as Array<[BusType, string]>
]);
public readonly assetTypeCache = new Map<AssetType, string>([
...AssetTypeOptions.map(assetType => [assetType.value, assetType.label]) as Array<[AssetType, string]>
]);

private readonly baseUrl = this.instanceSettings.url + '/niapm/v1';

Expand Down Expand Up @@ -179,18 +189,18 @@ export class AssetCalibrationDataSource extends DataSourceBase<AssetCalibrationQ

createColumnNameFromDescriptor(field: FieldDTOWithDescriptor): string {
return field.columnDescriptors.map(descriptor => {
if (descriptor.type === ColumnDescriptorType.MinionId && this.systemAliasCache) {
const system = this.systemAliasCache.get(descriptor.value);

return system?.alias || descriptor.value;
}

if (descriptor.type === ColumnDescriptorType.WorkspaceId && this.workspacesCache) {
const workspace = this.workspacesCache.get(descriptor.value);

return workspace?.name || descriptor.value
switch (descriptor.type) {
case ColumnDescriptorType.MinionId:
return this.systemAliasCache.get(descriptor.value)?.alias || descriptor.value;
case ColumnDescriptorType.WorkspaceId:
return this.workspacesCache.get(descriptor.value)?.name || descriptor.value
case ColumnDescriptorType.AssetType:
return this.assetTypeCache.get(descriptor.value as AssetType) || descriptor.value;
case ColumnDescriptorType.BusType:
return this.busTypeCache.get(descriptor.value as BusType) || descriptor.value;
default:
return descriptor.value;
}
return descriptor.value
}).join(' - ');
}

Expand Down
Loading

0 comments on commit 0e30e6a

Please sign in to comment.