-
Notifications
You must be signed in to change notification settings - Fork 33
/
Neo4jResultMapper.ts
74 lines (67 loc) · 2.1 KB
/
Neo4jResultMapper.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
import { Integer } from 'neo4j-driver';
import { GraphResultMapper } from '@/mapper/GraphResultMapper';
import neo4j from "neo4j-driver";
export class Neo4jResultMapper extends GraphResultMapper {
keys(record: any): string[] {
return record.keys;
}
itemAtIndex(record: any, index: number): any {
return record.get(index);
}
toNative(val: any): any {
if (val == undefined) {
return val;
}
if (val instanceof neo4j.types.Node) {
return this.toNative(val.properties);
}
if (val instanceof neo4j.types.Relationship) {
return this.toNative(val.properties);
}
if (val instanceof neo4j.types.Point) {
return val;
}
if (neo4j.isInt(val)) {
return this.toNumberOrThrow(<Integer>val);
}
if (Array.isArray(val)) {
return val.map((a) => this.toNative(a));
}
if (this.isRecord(val)) {
return this.toNative(this.recordToNative(val));
}
if (val instanceof neo4j.types.Date) {
return val.toStandardDate();
}
if (val instanceof neo4j.types.DateTime) {
return val.toStandardDate();
}
if (typeof val === 'object') {
return this.mapObj(this.toNative.bind(this), val);
}
return val;
}
private recordToNative(rec: any): any {
const out = {};
rec.keys.forEach((key: string, index: number) => {
out[key] = rec._fields[index];
});
return out;
}
private isRecord(obj: any): boolean {
return typeof obj._fields !== 'undefined' && typeof obj.keys !== 'undefined';
}
private mapObj(fn: Function, obj: any): any {
const out = {};
Object.keys(obj).forEach((key) => {
out[key] = fn(obj[key]);
});
return out;
}
private toNumberOrThrow(val: Integer): number {
if (val.inSafeRange()) {
return val.toNumber();
}
throw new Error(`${val} is not in safe range to convert to number`);
}
}