@steedos/odata-v4-sql 2.2.52-beta.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Steedos Licensing
2
+
3
+ SOFTWARE LICENSING
4
+
5
+ To determine under which license you may use a file from the Steedos source code,
6
+ please resort to the header of that file.
7
+
8
+ If the file has no header, the following rules apply
9
+ 1. enterprise features are licensed under Steedos Enterprise Terms, see License.enterprise.txt
10
+ 2. source code that is neither (1) is licensed under MIT, see https://opensource.org/licenses/MIT
11
+
12
+ On request, licenses under different terms are available.
13
+
14
+ Source code of enterprise features are files that
15
+ * are in folders named "ee" or start with "ee_", or in subfolders of such folders.
16
+ * contain the strings "ee_" in its filename name.
17
+ The files can be found by running the command `find . -iname ee -or -iname "*_ee*" -or -iname "*ee_*"`
18
+
19
+ STEEDOS TRADEMARK GUIDELINES
20
+
21
+ Your use of the mark Steedos is subject to Steedos, Inc's prior written approval. For trademark approval or any questions
22
+ you have about using these trademarks, please email zhuangjianguo@steedos.com
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ <!--
2
+ * @Author: baozhoutao@steedos.com
3
+ * @Date: 2022-07-05 15:03:38
4
+ * @LastEditors: baozhoutao@steedos.com
5
+ * @LastEditTime: 2022-07-05 15:14:04
6
+ * @Description:
7
+ -->
8
+ # OData V4 Service modules - SQL Connector
9
+
10
+ Service OData v4 requests from an SQL data store.
11
+
12
+ ## Synopsis
13
+ The OData V4 SQL Connector provides functionality to convert the various types of OData segments
14
+ into SQL query statements, that you can execute over an SQL database.
15
+
16
+ ## Potential usage scenarios
17
+
18
+ - Create high speed, standard compliant data sharing APIs
19
+
20
+ ## Usage as server - TypeScript
21
+ ```javascript
22
+ import { createFilter } from '@steedos/odata-v4-sql'
23
+
24
+ //example request: GET /api/Users?$filter=Id eq 42
25
+ app.get("/api/Users", (req: Request, res: Response) => {
26
+ const filter = createFilter(req.query.$filter);
27
+ // request instance from mssql module
28
+ request.query(`SELECT * FROM Users WHERE ${filter.where}`, function(err, data){
29
+ res.json({
30
+ '@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
31
+ value: data
32
+ });
33
+ });
34
+ });
35
+ ```
36
+
37
+ Advanced TypeScript example available [here](https://raw.githubusercontent.com/jaystack/odata-v4-sql/master/src/example/sql.ts).
38
+
39
+ ## Usage ES5
40
+ ```javascript
41
+ var createFilter = require('@steedos/odata-v4-sql').createFilter;
42
+
43
+ app.get("/api/Users", function(req, res) {
44
+ var filter = createFilter(req.query.$filter);
45
+ // request instance from mssql module
46
+ request.query(filter.from("Users"), function(err, data){
47
+ res.json({
48
+ '@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
49
+ value: data
50
+ });
51
+ });
52
+ })
53
+ ```
54
+
55
+ ## Supported OData segments
56
+
57
+ * $filter
58
+ * $select
59
+ * $skip
60
+ * $top
61
+ * $orderby
62
+ * $expand
package/lib/index.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { Visitor, SQLLang } from "./visitor";
2
+ export { SQLLang } from "./visitor";
3
+ import { Token } from "odata-v4-parser/lib/lexer";
4
+ export interface SqlOptions {
5
+ useParameters?: boolean;
6
+ type?: SQLLang;
7
+ }
8
+ /**
9
+ * Creates an SQL query descriptor from an OData query string
10
+ * @param {string} odataQuery - An OData query string
11
+ * @return {string} SQL query descriptor
12
+ * @example
13
+ * const filter = createQuery("$filter=Size eq 4 and Age gt 18");
14
+ * let sqlQuery = `SELECT * FROM table WHERE ${filter.where}`;
15
+ */
16
+ export declare function createQuery(odataQuery: string, options?: SqlOptions): Visitor;
17
+ export declare function createQuery(odataQuery: string, options?: SqlOptions, type?: SQLLang): Visitor;
18
+ export declare function createQuery(odataQuery: Token, options?: SqlOptions): Visitor;
19
+ export declare function createQuery(odataQuery: Token, options?: SqlOptions, type?: SQLLang): Visitor;
20
+ /**
21
+ * Creates an SQL WHERE clause from an OData filter expression string
22
+ * @param {string} odataFilter - A filter expression in OData $filter format
23
+ * @return {string} SQL WHERE clause
24
+ * @example
25
+ * const filter = createFilter("Size eq 4 and Age gt 18");
26
+ * let sqlQuery = `SELECT * FROM table WHERE ${filter}`;
27
+ */
28
+ export declare function createFilter(odataFilter: string, options?: SqlOptions): Visitor;
29
+ export declare function createFilter(odataFilter: string, options?: SqlOptions, type?: SQLLang): Visitor;
30
+ export declare function createFilter(odataFilter: Token, options?: SqlOptions): Visitor;
31
+ export declare function createFilter(odataFilter: Token, options?: SqlOptions, type?: SQLLang): Visitor;
package/lib/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFilter = exports.createQuery = exports.SQLLang = void 0;
4
+ const visitor_1 = require("./visitor");
5
+ var visitor_2 = require("./visitor");
6
+ Object.defineProperty(exports, "SQLLang", { enumerable: true, get: function () { return visitor_2.SQLLang; } });
7
+ const odata_v4_parser_1 = require("odata-v4-parser");
8
+ function createQuery(odataQuery, options = {}, type) {
9
+ if (typeof type != "undefined" && type)
10
+ options.type = type;
11
+ let ast = (typeof odataQuery == "string" ? (0, odata_v4_parser_1.query)(odataQuery) : odataQuery);
12
+ return new visitor_1.Visitor(options).Visit(ast).asType();
13
+ }
14
+ exports.createQuery = createQuery;
15
+ function createFilter(odataFilter, options = {}, type) {
16
+ if (typeof type != "undefined" && type)
17
+ options.type = type;
18
+ let ast = (typeof odataFilter == "string" ? (0, odata_v4_parser_1.filter)(odataFilter) : odataFilter);
19
+ return new visitor_1.Visitor(options).Visit(ast).asType();
20
+ }
21
+ exports.createFilter = createFilter;
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA6C;AAC7C,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,qDAAgD;AAoBhD,SAAgB,WAAW,CAAC,UAAyB,EAAE,UAAsB,EAAE,EAAE,IAAa;IAC1F,IAAI,OAAO,IAAI,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,GAAG,GAAgB,CAAC,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAA,uBAAK,EAAS,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChG,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAJD,kCAIC;AAcD,SAAgB,YAAY,CAAC,WAA0B,EAAE,UAAsB,EAAE,EAAE,IAAa;IAC5F,IAAI,OAAO,IAAI,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,GAAG,GAAgB,CAAC,OAAO,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAA,wBAAM,EAAS,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpG,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAJD,oCAIC"}
@@ -0,0 +1,72 @@
1
+ import { Token } from "odata-v4-parser/lib/lexer";
2
+ import { Literal } from "odata-v4-literal";
3
+ import { SqlOptions } from "./index";
4
+ export declare class SQLLiteral extends Literal {
5
+ static convert(type: string, value: string): any;
6
+ 'Edm.String'(value: string): string;
7
+ 'Edm.Guid'(value: string): string;
8
+ 'Edm.Date'(value: string): string;
9
+ 'Edm.DateTimeOffset'(value: string): any;
10
+ 'Edm.Boolean'(value: string): any;
11
+ 'null'(value: string): string;
12
+ }
13
+ export declare enum SQLLang {
14
+ ANSI = 0,
15
+ MsSql = 1,
16
+ MySql = 2,
17
+ PostgreSql = 3,
18
+ Oracle = 4
19
+ }
20
+ export declare class Visitor {
21
+ protected options: SqlOptions;
22
+ type: SQLLang;
23
+ select: string;
24
+ where: string;
25
+ orderby: string;
26
+ skip: number;
27
+ limit: number;
28
+ inlinecount: boolean;
29
+ navigationProperty: string;
30
+ includes: Visitor[];
31
+ parameters: any;
32
+ protected parameterSeed: number;
33
+ protected originalWhere: string;
34
+ ast: Token;
35
+ constructor(options?: SqlOptions);
36
+ from(table: string): string;
37
+ asMsSql(): this;
38
+ asOracleSql(): this;
39
+ asAnsiSql(): this;
40
+ asType(): this;
41
+ Visit(node: Token, context?: any): this;
42
+ protected VisitODataUri(node: Token, context: any): void;
43
+ protected VisitExpand(node: Token, context: any): void;
44
+ protected VisitExpandItem(node: Token, context: any): void;
45
+ protected VisitExpandPath(node: Token, context: any): void;
46
+ protected VisitQueryOptions(node: Token, context: any): void;
47
+ protected VisitInlineCount(node: Token, context: any): void;
48
+ protected VisitFilter(node: Token, context: any): void;
49
+ protected VisitOrderBy(node: Token, context: any): void;
50
+ protected VisitOrderByItem(node: Token, context: any): void;
51
+ protected VisitSkip(node: Token, context: any): void;
52
+ protected VisitTop(node: Token, context: any): void;
53
+ protected VisitSelect(node: Token, context: any): void;
54
+ protected VisitSelectItem(node: Token, context: any): void;
55
+ protected VisitAndExpression(node: Token, context: any): void;
56
+ protected VisitOrExpression(node: Token, context: any): void;
57
+ protected VisitBoolParenExpression(node: Token, context: any): void;
58
+ protected VisitCommonExpression(node: Token, context: any): void;
59
+ protected VisitFirstMemberExpression(node: Token, context: any): void;
60
+ protected VisitMemberExpression(node: Token, context: any): void;
61
+ protected VisitPropertyPathExpression(node: Token, context: any): void;
62
+ protected VisitSingleNavigationExpression(node: Token, context: any): void;
63
+ protected VisitODataIdentifier(node: Token, context: any): void;
64
+ protected VisitEqualsExpression(node: Token, context: any): void;
65
+ protected VisitNotEqualsExpression(node: Token, context: any): void;
66
+ protected VisitLesserThanExpression(node: Token, context: any): void;
67
+ protected VisitLesserOrEqualsExpression(node: Token, context: any): void;
68
+ protected VisitGreaterThanExpression(node: Token, context: any): void;
69
+ protected VisitGreaterOrEqualsExpression(node: Token, context: any): void;
70
+ protected VisitLiteral(node: Token, context: any): void;
71
+ protected VisitMethodCallExpression(node: Token, context: any): void;
72
+ }
package/lib/visitor.js ADDED
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Visitor = exports.SQLLang = exports.SQLLiteral = void 0;
4
+ const odata_v4_literal_1 = require("odata-v4-literal");
5
+ class SQLLiteral extends odata_v4_literal_1.Literal {
6
+ static convert(type, value) {
7
+ return (new SQLLiteral(type, value)).valueOf();
8
+ }
9
+ 'Edm.String'(value) { return "'" + decodeURIComponent(value).slice(1, -1).replace(/''/g, "'") + "'"; }
10
+ 'Edm.Guid'(value) { return "'" + decodeURIComponent(value) + "'"; }
11
+ 'Edm.Date'(value) { return "'" + value + "'"; }
12
+ 'Edm.DateTimeOffset'(value) { return "'" + value.replace("T", " ").replace("Z", " ").trim() + "'"; }
13
+ 'Edm.Boolean'(value) {
14
+ value = value || '';
15
+ switch (value.toLowerCase()) {
16
+ case 'true': return 1;
17
+ case 'false': return 0;
18
+ default: return "NULL";
19
+ }
20
+ }
21
+ 'null'(value) { return "NULL"; }
22
+ }
23
+ exports.SQLLiteral = SQLLiteral;
24
+ var SQLLang;
25
+ (function (SQLLang) {
26
+ SQLLang[SQLLang["ANSI"] = 0] = "ANSI";
27
+ SQLLang[SQLLang["MsSql"] = 1] = "MsSql";
28
+ SQLLang[SQLLang["MySql"] = 2] = "MySql";
29
+ SQLLang[SQLLang["PostgreSql"] = 3] = "PostgreSql";
30
+ SQLLang[SQLLang["Oracle"] = 4] = "Oracle";
31
+ })(SQLLang = exports.SQLLang || (exports.SQLLang = {}));
32
+ class Visitor {
33
+ constructor(options = {}) {
34
+ this.select = "";
35
+ this.where = "";
36
+ this.orderby = "";
37
+ this.includes = [];
38
+ this.parameters = new Map();
39
+ this.parameterSeed = 0;
40
+ this.options = options;
41
+ if (this.options.useParameters != false)
42
+ this.options.useParameters = true;
43
+ this.type = options.type || SQLLang.ANSI;
44
+ }
45
+ from(table) {
46
+ let sql = `SELECT ${this.select} FROM [${table}] WHERE ${this.where} ORDER BY ${this.orderby}`;
47
+ switch (this.type) {
48
+ case SQLLang.Oracle:
49
+ case SQLLang.MsSql:
50
+ if (typeof this.skip == "number")
51
+ sql += ` OFFSET ${this.skip} ROWS`;
52
+ if (typeof this.limit == "number") {
53
+ if (typeof this.skip != "number")
54
+ sql += " OFFSET 0 ROWS";
55
+ sql += ` FETCH NEXT ${this.limit} ROWS ONLY`;
56
+ }
57
+ break;
58
+ case SQLLang.MySql:
59
+ case SQLLang.PostgreSql:
60
+ default:
61
+ if (typeof this.limit == "number")
62
+ sql += ` LIMIT ${this.limit}`;
63
+ if (typeof this.skip == "number")
64
+ sql += ` OFFSET ${this.skip}`;
65
+ break;
66
+ }
67
+ return sql;
68
+ }
69
+ asMsSql() {
70
+ this.type = SQLLang.MsSql;
71
+ let rx = new RegExp("\\?", "g");
72
+ let keys = this.parameters.keys();
73
+ this.originalWhere = this.where;
74
+ this.where = this.where.replace(rx, () => `@${keys.next().value}`);
75
+ this.includes.forEach((item) => item.asMsSql());
76
+ return this;
77
+ }
78
+ asOracleSql() {
79
+ this.type = SQLLang.Oracle;
80
+ let rx = new RegExp("\\?", "g");
81
+ let keys = this.parameters.keys();
82
+ this.originalWhere = this.where;
83
+ this.where = this.where.replace(rx, () => `:${keys.next().value}`);
84
+ this.includes.forEach((item) => item.asOracleSql());
85
+ return this;
86
+ }
87
+ asAnsiSql() {
88
+ this.type = SQLLang.ANSI;
89
+ this.where = this.originalWhere || this.where;
90
+ this.includes.forEach((item) => item.asAnsiSql());
91
+ return this;
92
+ }
93
+ asType() {
94
+ switch (this.type) {
95
+ case SQLLang.MsSql: return this.asMsSql();
96
+ case SQLLang.ANSI:
97
+ case SQLLang.MySql:
98
+ case SQLLang.PostgreSql: return this.asAnsiSql();
99
+ case SQLLang.Oracle: return this.asOracleSql();
100
+ default: return this;
101
+ }
102
+ }
103
+ Visit(node, context) {
104
+ this.ast = this.ast || node;
105
+ context = context || { target: "where" };
106
+ if (node) {
107
+ var visitor = this[`Visit${node.type}`];
108
+ if (visitor)
109
+ visitor.call(this, node, context);
110
+ else
111
+ console.log(`Unhandled node type: ${node.type}`, node);
112
+ }
113
+ if (node == this.ast) {
114
+ if (!this.select)
115
+ this.select = `*`;
116
+ if (!this.where)
117
+ this.where = "1 = 1";
118
+ if (!this.orderby)
119
+ this.orderby = "1";
120
+ }
121
+ return this;
122
+ }
123
+ VisitODataUri(node, context) {
124
+ this.Visit(node.value.resource, context);
125
+ this.Visit(node.value.query, context);
126
+ }
127
+ VisitExpand(node, context) {
128
+ node.value.items.forEach((item) => {
129
+ let expandPath = item.value.path.raw;
130
+ let visitor = this.includes.filter(v => v.navigationProperty == expandPath)[0];
131
+ if (!visitor) {
132
+ visitor = new Visitor(this.options);
133
+ visitor.parameterSeed = this.parameterSeed;
134
+ this.includes.push(visitor);
135
+ }
136
+ visitor.Visit(item);
137
+ this.parameterSeed = visitor.parameterSeed;
138
+ });
139
+ }
140
+ VisitExpandItem(node, context) {
141
+ this.Visit(node.value.path, context);
142
+ if (node.value.options)
143
+ node.value.options.forEach((item) => this.Visit(item, context));
144
+ }
145
+ VisitExpandPath(node, context) {
146
+ this.navigationProperty = node.raw;
147
+ }
148
+ VisitQueryOptions(node, context) {
149
+ node.value.options.forEach((option) => this.Visit(option, context));
150
+ }
151
+ VisitInlineCount(node, context) {
152
+ this.inlinecount = odata_v4_literal_1.Literal.convert(node.value.value, node.value.raw);
153
+ }
154
+ VisitFilter(node, context) {
155
+ context.target = "where";
156
+ this.Visit(node.value, context);
157
+ if (!this.where)
158
+ this.where = "1 = 1";
159
+ }
160
+ VisitOrderBy(node, context) {
161
+ context.target = "orderby";
162
+ node.value.items.forEach((item, i) => {
163
+ this.Visit(item, context);
164
+ if (i < node.value.items.length - 1)
165
+ this.orderby += ", ";
166
+ });
167
+ }
168
+ VisitOrderByItem(node, context) {
169
+ this.Visit(node.value.expr, context);
170
+ this.orderby += node.value.direction > 0 ? " ASC" : " DESC";
171
+ }
172
+ VisitSkip(node, context) {
173
+ this.skip = +node.value.raw;
174
+ }
175
+ VisitTop(node, context) {
176
+ this.limit = +node.value.raw;
177
+ }
178
+ VisitSelect(node, context) {
179
+ context.target = "select";
180
+ node.value.items.forEach((item, i) => {
181
+ this.Visit(item, context);
182
+ if (i < node.value.items.length - 1)
183
+ this.select += ", ";
184
+ });
185
+ }
186
+ VisitSelectItem(node, context) {
187
+ let item = node.raw.replace(/\//g, '.');
188
+ this.select += `[${item}]`;
189
+ }
190
+ VisitAndExpression(node, context) {
191
+ this.Visit(node.value.left, context);
192
+ this.where += " AND ";
193
+ this.Visit(node.value.right, context);
194
+ }
195
+ VisitOrExpression(node, context) {
196
+ this.Visit(node.value.left, context);
197
+ this.where += " OR ";
198
+ this.Visit(node.value.right, context);
199
+ }
200
+ VisitBoolParenExpression(node, context) {
201
+ this.where += "(";
202
+ this.Visit(node.value, context);
203
+ this.where += ")";
204
+ }
205
+ VisitCommonExpression(node, context) {
206
+ this.Visit(node.value, context);
207
+ }
208
+ VisitFirstMemberExpression(node, context) {
209
+ this.Visit(node.value, context);
210
+ }
211
+ VisitMemberExpression(node, context) {
212
+ this.Visit(node.value, context);
213
+ }
214
+ VisitPropertyPathExpression(node, context) {
215
+ if (node.value.current && node.value.next) {
216
+ this.Visit(node.value.current, context);
217
+ context.identifier += ".";
218
+ this.Visit(node.value.next, context);
219
+ }
220
+ else
221
+ this.Visit(node.value, context);
222
+ }
223
+ VisitSingleNavigationExpression(node, context) {
224
+ if (node.value.current && node.value.next) {
225
+ this.Visit(node.value.current, context);
226
+ this.Visit(node.value.next, context);
227
+ }
228
+ else
229
+ this.Visit(node.value, context);
230
+ }
231
+ VisitODataIdentifier(node, context) {
232
+ this[context.target] += `[${node.value.name}]`;
233
+ context.identifier = node.value.name;
234
+ }
235
+ VisitEqualsExpression(node, context) {
236
+ this.Visit(node.value.left, context);
237
+ this.where += " = ";
238
+ this.Visit(node.value.right, context);
239
+ if (this.options.useParameters && context.literal == null) {
240
+ this.where = this.where.replace(/= \?$/, "IS NULL").replace(new RegExp(`\\? = \\[${context.identifier}\\]$`), `[${context.identifier}] IS NULL`);
241
+ }
242
+ else if (context.literal == "NULL") {
243
+ this.where = this.where.replace(/= NULL$/, "IS NULL").replace(new RegExp(`NULL = \\[${context.identifier}\\]$`), `[${context.identifier}] IS NULL`);
244
+ }
245
+ }
246
+ VisitNotEqualsExpression(node, context) {
247
+ this.Visit(node.value.left, context);
248
+ this.where += " <> ";
249
+ this.Visit(node.value.right, context);
250
+ if (this.options.useParameters && context.literal == null) {
251
+ this.where = this.where.replace(/<> \?$/, "IS NOT NULL").replace(new RegExp(`\\? <> \\[${context.identifier}\\]$`), `[${context.identifier}] IS NOT NULL`);
252
+ }
253
+ else if (context.literal == "NULL") {
254
+ this.where = this.where.replace(/<> NULL$/, "IS NOT NULL").replace(new RegExp(`NULL <> \\[${context.identifier}\\]$`), `[${context.identifier}] IS NOT NULL`);
255
+ }
256
+ }
257
+ VisitLesserThanExpression(node, context) {
258
+ this.Visit(node.value.left, context);
259
+ this.where += " < ";
260
+ this.Visit(node.value.right, context);
261
+ }
262
+ VisitLesserOrEqualsExpression(node, context) {
263
+ this.Visit(node.value.left, context);
264
+ this.where += " <= ";
265
+ this.Visit(node.value.right, context);
266
+ }
267
+ VisitGreaterThanExpression(node, context) {
268
+ this.Visit(node.value.left, context);
269
+ this.where += " > ";
270
+ this.Visit(node.value.right, context);
271
+ }
272
+ VisitGreaterOrEqualsExpression(node, context) {
273
+ this.Visit(node.value.left, context);
274
+ this.where += " >= ";
275
+ this.Visit(node.value.right, context);
276
+ }
277
+ VisitLiteral(node, context) {
278
+ if (this.options.useParameters) {
279
+ let name = `p${this.parameterSeed++}`;
280
+ let value = odata_v4_literal_1.Literal.convert(node.value, node.raw);
281
+ context.literal = value;
282
+ this.parameters.set(name, value);
283
+ this.where += "?";
284
+ }
285
+ else
286
+ this.where += (context.literal = SQLLiteral.convert(node.value, node.raw));
287
+ }
288
+ VisitMethodCallExpression(node, context) {
289
+ var method = node.value.method;
290
+ var params = node.value.parameters || [];
291
+ switch (method) {
292
+ case "contains":
293
+ this.Visit(params[0], context);
294
+ if (this.options.useParameters) {
295
+ let name = `p${this.parameterSeed++}`;
296
+ let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
297
+ this.parameters.set(name, `%${value}%`);
298
+ this.where += " like ?";
299
+ }
300
+ else
301
+ this.where += ` like '%${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}%'`;
302
+ break;
303
+ case "endswith":
304
+ this.Visit(params[0], context);
305
+ if (this.options.useParameters) {
306
+ let name = `p${this.parameterSeed++}`;
307
+ let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
308
+ this.parameters.set(name, `%${value}`);
309
+ this.where += " like ?";
310
+ }
311
+ else
312
+ this.where += ` like '%${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}'`;
313
+ break;
314
+ case "startswith":
315
+ this.Visit(params[0], context);
316
+ if (this.options.useParameters) {
317
+ let name = `p${this.parameterSeed++}`;
318
+ let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
319
+ this.parameters.set(name, `${value}%`);
320
+ this.where += " like ?";
321
+ }
322
+ else
323
+ this.where += ` like '${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}%'`;
324
+ break;
325
+ case "indexof":
326
+ let fn = "";
327
+ switch (this.type) {
328
+ case SQLLang.MsSql:
329
+ fn = "CHARINDEX";
330
+ break;
331
+ case SQLLang.ANSI:
332
+ case SQLLang.MySql:
333
+ case SQLLang.PostgreSql:
334
+ default:
335
+ fn = "INSTR";
336
+ break;
337
+ }
338
+ if (fn === "CHARINDEX") {
339
+ const tmp = params[0];
340
+ params[0] = params[1];
341
+ params[1] = tmp;
342
+ }
343
+ this.where += `${fn}(`;
344
+ this.Visit(params[0], context);
345
+ this.where += ', ';
346
+ this.Visit(params[1], context);
347
+ this.where += ") - 1";
348
+ break;
349
+ case "round":
350
+ this.where += "ROUND(";
351
+ this.Visit(params[0], context);
352
+ this.where += ")";
353
+ break;
354
+ case "length":
355
+ this.where += "LEN(";
356
+ this.Visit(params[0], context);
357
+ this.where += ")";
358
+ break;
359
+ case "tolower":
360
+ this.where += "LCASE(";
361
+ this.Visit(params[0], context);
362
+ this.where += ")";
363
+ break;
364
+ case "toupper":
365
+ this.where += "UCASE(";
366
+ this.Visit(params[0], context);
367
+ this.where += ")";
368
+ break;
369
+ case "floor":
370
+ case "ceiling":
371
+ case "year":
372
+ case "month":
373
+ case "day":
374
+ case "hour":
375
+ case "minute":
376
+ case "second":
377
+ this.where += `${method.toUpperCase()}(`;
378
+ this.Visit(params[0], context);
379
+ this.where += ")";
380
+ break;
381
+ case "now":
382
+ this.where += "NOW()";
383
+ break;
384
+ case "trim":
385
+ this.where += "TRIM(' ' FROM ";
386
+ this.Visit(params[0], context);
387
+ this.where += ")";
388
+ break;
389
+ }
390
+ }
391
+ }
392
+ exports.Visitor = Visitor;
393
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}