/
FindOperator.ts
130 lines (111 loc) · 4.25 KB
/
FindOperator.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import {FindOperatorType} from "./FindOperatorType";
import {Connection} from "../";
import {OracleDriver} from "../driver/oracle/OracleDriver";
/**
* Find Operator used in Find Conditions.
*/
export class FindOperator<T> {
// -------------------------------------------------------------------------
// Private Properties
// -------------------------------------------------------------------------
/**
* Operator type.
*/
private _type: FindOperatorType;
/**
* Parameter value.
*/
private _value: T|FindOperator<T>;
/**
* Indicates if parameter is used or not for this operator.
*/
private _useParameter: boolean;
/**
* Indicates if multiple parameters must be used for this operator.
*/
private _multipleParameters: boolean;
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(type: FindOperatorType, value: T|FindOperator<T>, useParameter: boolean = true, multipleParameters: boolean = false) {
this._type = type;
this._value = value;
this._useParameter = useParameter;
this._multipleParameters = multipleParameters;
}
// -------------------------------------------------------------------------
// Accessors
// -------------------------------------------------------------------------
/**
* Indicates if parameter is used or not for this operator.
* Extracts final value if value is another find operator.
*/
get useParameter(): boolean {
if (this._value instanceof FindOperator)
return this._value.useParameter;
return this._useParameter;
}
/**
* Indicates if multiple parameters must be used for this operator.
* Extracts final value if value is another find operator.
*/
get multipleParameters(): boolean {
if (this._value instanceof FindOperator)
return this._value.multipleParameters;
return this._multipleParameters;
}
/**
* Gets the final value needs to be used as parameter value.
*/
get value(): T {
if (this._value instanceof FindOperator)
return this._value.value;
return this._value;
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Gets SQL needs to be inserted into final query.
*/
toSql(connection: Connection, aliasPath: string, parameters: string[]): string {
switch (this._type) {
case "not":
if (this._value instanceof FindOperator) {
return `NOT(${this._value.toSql(connection, aliasPath, parameters)})`;
} else {
return `${aliasPath} != ${parameters[0]}`;
}
case "lessThan":
return `${aliasPath} < ${parameters[0]}`;
case "lessThanOrEqual":
return `${aliasPath} <= ${parameters[0]}`;
case "moreThan":
return `${aliasPath} > ${parameters[0]}`;
case "moreThanOrEqual":
return `${aliasPath} >= ${parameters[0]}`;
case "equal":
return `${aliasPath} = ${parameters[0]}`;
case "like":
return `${aliasPath} LIKE ${parameters[0]}`;
case "between":
return `${aliasPath} BETWEEN ${parameters[0]} AND ${parameters[1]}`;
case "in":
if (connection.driver instanceof OracleDriver && parameters.length === 0) {
return `${aliasPath} IN (null)`;
}
return `${aliasPath} IN (${parameters.join(", ")})`;
case "any":
return `${aliasPath} = ANY(${parameters[0]})`;
case "isNull":
return `${aliasPath} IS NULL`;
case "raw":
if (this.value instanceof Function) {
return this.value(aliasPath);
} else {
return `${aliasPath} = ${this.value}`;
}
}
return "";
}
}