2020-06-19 18:13:57 +03:00
|
|
|
///
|
|
|
|
|
/// Copyright © 2016-2020 The Thingsboard Authors
|
|
|
|
|
///
|
|
|
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
/// you may not use this file except in compliance with the License.
|
|
|
|
|
/// You may obtain a copy of the License at
|
|
|
|
|
///
|
|
|
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
///
|
|
|
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
/// See the License for the specific language governing permissions and
|
|
|
|
|
/// limitations under the License.
|
|
|
|
|
///
|
|
|
|
|
|
|
|
|
|
import { AliasFilterType, EntityFilters } from '@shared/models/alias.models';
|
|
|
|
|
import { EntityId } from '@shared/models/id/entity-id';
|
2020-06-22 18:55:15 +03:00
|
|
|
import { SortDirection } from '@angular/material/sort';
|
2020-06-23 17:47:34 +03:00
|
|
|
import { DataKeyType } from '@shared/models/telemetry/telemetry.models';
|
|
|
|
|
import { EntityInfo } from '@shared/models/entity.models';
|
|
|
|
|
import { EntityType } from '@shared/models/entity-type.models';
|
2020-06-19 18:13:57 +03:00
|
|
|
|
|
|
|
|
export enum EntityKeyType {
|
|
|
|
|
ATTRIBUTE = 'ATTRIBUTE',
|
|
|
|
|
CLIENT_ATTRIBUTE = 'CLIENT_ATTRIBUTE',
|
|
|
|
|
SHARED_ATTRIBUTE = 'SHARED_ATTRIBUTE',
|
|
|
|
|
SERVER_ATTRIBUTE = 'SERVER_ATTRIBUTE',
|
|
|
|
|
TIME_SERIES = 'TIME_SERIES',
|
|
|
|
|
ENTITY_FIELD = 'ENTITY_FIELD'
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 17:47:34 +03:00
|
|
|
export function entityKeyTypeToDataKeyType(entityKeyType: EntityKeyType): DataKeyType {
|
|
|
|
|
switch (entityKeyType) {
|
|
|
|
|
case EntityKeyType.ATTRIBUTE:
|
|
|
|
|
case EntityKeyType.CLIENT_ATTRIBUTE:
|
|
|
|
|
case EntityKeyType.SHARED_ATTRIBUTE:
|
|
|
|
|
case EntityKeyType.SERVER_ATTRIBUTE:
|
|
|
|
|
return DataKeyType.attribute
|
|
|
|
|
case EntityKeyType.TIME_SERIES:
|
|
|
|
|
return DataKeyType.timeseries;
|
|
|
|
|
case EntityKeyType.ENTITY_FIELD:
|
|
|
|
|
return DataKeyType.entityField;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-19 18:13:57 +03:00
|
|
|
export interface EntityKey {
|
|
|
|
|
type: EntityKeyType;
|
|
|
|
|
key: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum FilterPredicateType {
|
|
|
|
|
STRING = 'STRING',
|
|
|
|
|
NUMERIC = 'NUMERIC',
|
|
|
|
|
BOOLEAN = 'BOOLEAN',
|
|
|
|
|
COMPLEX = 'COMPLEX'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum StringOperation {
|
|
|
|
|
EQUAL = 'EQUAL',
|
|
|
|
|
NOT_EQUAL = 'NOT_EQUAL',
|
|
|
|
|
STARTS_WITH = 'STARTS_WITH',
|
|
|
|
|
ENDS_WITH = 'ENDS_WITH',
|
|
|
|
|
CONTAINS = 'CONTAINS',
|
|
|
|
|
NOT_CONTAIN = 'NOT_CONTAIN'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum NumericOperation {
|
|
|
|
|
EQUAL = 'EQUAL',
|
|
|
|
|
NOT_EQUAL = 'NOT_EQUAL',
|
|
|
|
|
GREATER = 'GREATER',
|
|
|
|
|
LESS = 'LESS',
|
|
|
|
|
GREATER_OR_EQUAL = 'GREATER_OR_EQUAL',
|
|
|
|
|
LESS_OR_EQUAL = 'LESS_OR_EQUAL'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum BooleanOperation {
|
|
|
|
|
EQUAL = 'EQUAL',
|
|
|
|
|
NOT_EQUAL = 'NOT_EQUAL'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum ComplexOperation {
|
|
|
|
|
AND = 'AND',
|
|
|
|
|
OR = 'OR'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface StringFilterPredicate {
|
|
|
|
|
operation: StringOperation;
|
|
|
|
|
value: string;
|
|
|
|
|
ignoreCase: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface NumericFilterPredicate {
|
|
|
|
|
operation: NumericOperation;
|
|
|
|
|
value: number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface BooleanFilterPredicate {
|
|
|
|
|
operation: BooleanOperation;
|
|
|
|
|
value: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ComplexFilterPredicate {
|
|
|
|
|
operation: ComplexOperation;
|
|
|
|
|
predicates: Array<KeyFilterPredicate>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type KeyFilterPredicates = StringFilterPredicate &
|
|
|
|
|
NumericFilterPredicate &
|
|
|
|
|
BooleanFilterPredicate &
|
|
|
|
|
ComplexFilterPredicate;
|
|
|
|
|
|
|
|
|
|
export interface KeyFilterPredicate extends KeyFilterPredicates {
|
|
|
|
|
type?: FilterPredicateType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface KeyFilter {
|
|
|
|
|
key: EntityKey;
|
|
|
|
|
predicate: KeyFilterPredicate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface EntityFilter extends EntityFilters {
|
|
|
|
|
type?: AliasFilterType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export enum Direction {
|
|
|
|
|
ASC = 'ASC',
|
|
|
|
|
DESC = 'DESC'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface EntityDataSortOrder {
|
|
|
|
|
key: EntityKey;
|
|
|
|
|
direction: Direction;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface EntityDataPageLink {
|
|
|
|
|
pageSize: number;
|
|
|
|
|
page: number;
|
|
|
|
|
textSearch?: string;
|
|
|
|
|
sortOrder?: EntityDataSortOrder;
|
2020-06-24 18:07:47 +03:00
|
|
|
dynamic?: boolean;
|
2020-06-19 18:13:57 +03:00
|
|
|
}
|
|
|
|
|
|
2020-06-22 18:55:15 +03:00
|
|
|
export function entityDataPageLinkSortDirection(pageLink: EntityDataPageLink): SortDirection {
|
|
|
|
|
if (pageLink.sortOrder) {
|
|
|
|
|
return (pageLink.sortOrder.direction + '').toLowerCase() as SortDirection;
|
|
|
|
|
} else {
|
|
|
|
|
return '' as SortDirection;
|
2020-06-19 18:13:57 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-22 18:55:15 +03:00
|
|
|
export function createDefaultEntityDataPageLink(pageSize: number): EntityDataPageLink {
|
|
|
|
|
return {
|
|
|
|
|
pageSize,
|
|
|
|
|
page: 0,
|
|
|
|
|
sortOrder: {
|
|
|
|
|
key: {
|
|
|
|
|
type: EntityKeyType.ENTITY_FIELD,
|
|
|
|
|
key: 'createdTime'
|
|
|
|
|
},
|
|
|
|
|
direction: Direction.DESC
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const defaultEntityDataPageLink: EntityDataPageLink = createDefaultEntityDataPageLink(1024);
|
|
|
|
|
|
2020-06-19 18:13:57 +03:00
|
|
|
export interface EntityCountQuery {
|
|
|
|
|
entityFilter: EntityFilter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface EntityDataQuery extends EntityCountQuery {
|
|
|
|
|
pageLink: EntityDataPageLink;
|
|
|
|
|
entityFields?: Array<EntityKey>;
|
|
|
|
|
latestValues?: Array<EntityKey>;
|
|
|
|
|
keyFilters?: Array<KeyFilter>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface TsValue {
|
|
|
|
|
ts: number;
|
|
|
|
|
value: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface EntityData {
|
|
|
|
|
entityId: EntityId;
|
|
|
|
|
latest: {[entityKeyType: string]: {[key: string]: TsValue}};
|
|
|
|
|
timeseries: {[key: string]: Array<TsValue>};
|
|
|
|
|
}
|
2020-06-23 17:47:34 +03:00
|
|
|
|
|
|
|
|
export function entityDataToEntityInfo(entityData: EntityData): EntityInfo {
|
|
|
|
|
const entityInfo: EntityInfo = {
|
|
|
|
|
id: entityData.entityId.id,
|
|
|
|
|
entityType: entityData.entityId.entityType as EntityType
|
|
|
|
|
};
|
|
|
|
|
if (entityData.latest && entityData.latest[EntityKeyType.ENTITY_FIELD]) {
|
|
|
|
|
const fields = entityData.latest[EntityKeyType.ENTITY_FIELD];
|
|
|
|
|
if (fields.name) {
|
|
|
|
|
entityInfo.name = fields.name.value;
|
|
|
|
|
} else {
|
|
|
|
|
entityInfo.name = '';
|
|
|
|
|
}
|
|
|
|
|
if (fields.label) {
|
|
|
|
|
entityInfo.label = fields.label.value;
|
|
|
|
|
} else {
|
|
|
|
|
entityInfo.label = '';
|
|
|
|
|
}
|
|
|
|
|
entityInfo.entityDescription = 'TODO: Not implemented';
|
|
|
|
|
}
|
|
|
|
|
return entityInfo;
|
|
|
|
|
}
|