-
Notifications
You must be signed in to change notification settings - Fork 1
/
DataService.ts
100 lines (86 loc) · 2.76 KB
/
DataService.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { Serializable, SerializableMember, SerializableObject } from '../data/decorators';
import { DataServiceDriver } from './DataServiceDriver';
import { FilterQuery } from './FilterQuery';
import { FindOptions } from './FindOptions';
import { Service } from './Service';
/**
* DataService
*
* ## Usage
*
* ### Finding a DataService
* ```typescript
* import { Node, DataFrame } from '@openhps/core';
*
* export class CustomNode extends Node<DataFrame> {
* // Data services can be found in any function inside a node
* // that is added to a model
* functionInsideNode(): void {
* // Get a service by its type
* let service = this.model.findDataService(DataObject);
* let service = this.model.findDataServiceByName("DataObject");
* }
* }
* ```
*/
@SerializableObject()
export abstract class DataService<I, T> extends Service {
@SerializableMember()
protected driver: DataServiceDriver<I, T>;
@SerializableMember()
priority = -1;
constructor(dataServiceDriver?: DataServiceDriver<I, T>) {
super();
this.driver = dataServiceDriver;
if (this.driver) {
this.uid = this.driver.dataType.name;
}
this.once('build', this._buildDriver.bind(this));
this.once('destroy', () => this.driver.emitAsync('destroy'));
}
private _buildDriver(): Promise<boolean> {
return new Promise((resolve, reject) => {
this.driver.model = this.model;
this.driver.logger = this.logger;
this.driver.emitAsync('build').then(resolve).catch(reject);
});
}
get dataType(): Serializable<T> {
if (this.driver) {
return this.driver.dataType;
}
return undefined;
}
/**
* Set the priority of the data service
* a higher number means a higher priority.
*
* @param {number} value Priority value
* @returns {DataService} data service instance
*/
setPriority(value: number): this {
this.priority = value;
return this;
}
findByUID(uid: I): Promise<T> {
return this.driver.findByUID(uid);
}
findOne(query?: FilterQuery<T>, options?: FindOptions): Promise<T> {
return this.driver.findOne(query, options);
}
findAll(query?: FilterQuery<T>, options?: FindOptions): Promise<T[]> {
return this.driver.findAll(query, options);
}
insert(id: I, object: T): Promise<T> {
return this.driver.insert(id, object);
}
count(query?: FilterQuery<T>): Promise<number> {
return this.driver.count(query);
}
delete(id: I): Promise<void> {
return this.driver.delete(id);
}
deleteAll(filter?: FilterQuery<T>): Promise<void> {
return this.driver.deleteAll(filter);
}
}