nodester 0.4.5 → 0.4.7
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.
|
@@ -13,6 +13,10 @@ const { decodeQueryString } = require('./decoder');
|
|
|
13
13
|
const QueryLexer = require('./interpreter/QueryLexer');
|
|
14
14
|
const { createErrorResponse } = require('nodester/factories/responses/rest');
|
|
15
15
|
|
|
16
|
+
const {
|
|
17
|
+
AST_ModelsTree
|
|
18
|
+
} = require('nodester/tools/nql');
|
|
19
|
+
|
|
16
20
|
|
|
17
21
|
module.exports = function initNodesterQL() {
|
|
18
22
|
return nqlHandle;
|
|
@@ -38,6 +42,10 @@ function nqlHandle(req, res, next) {
|
|
|
38
42
|
const decoded = decodeQueryString(queryString);
|
|
39
43
|
const lexer = new QueryLexer(decoded);
|
|
40
44
|
|
|
45
|
+
console.log(
|
|
46
|
+
AST_ModelsTree(lexer.tree)
|
|
47
|
+
);
|
|
48
|
+
|
|
41
49
|
// Go on!
|
|
42
50
|
req.nquery = lexer.query;
|
|
43
51
|
return next();
|
|
@@ -289,7 +289,7 @@ module.exports = class QueryLexer {
|
|
|
289
289
|
debug('char', char, { token, node: tree.node });
|
|
290
290
|
|
|
291
291
|
// Vertical include:
|
|
292
|
-
if (!!previousActive) {
|
|
292
|
+
if (!!previousActive && token.length === 0) {
|
|
293
293
|
tree.use(previousActive);
|
|
294
294
|
tree.node.activeParam = PARAM_TOKENS.INCLUDES;
|
|
295
295
|
token = '';
|
package/lib/tools/nql.tool.js
CHANGED
|
@@ -42,13 +42,17 @@ function _AST_ModelsTreeNode(node, spacing=0) {
|
|
|
42
42
|
ast += `${ spaces }┣ model: ${ node.model }\n`;
|
|
43
43
|
ast += `${ spaces }┃\n`;
|
|
44
44
|
|
|
45
|
+
if (!!node.fields) {
|
|
45
46
|
ast += `${ spaces }┣ fields (${ node.fields.length }): [\n${ node.fields.map(f => ` • ${ f },\n`) }`;
|
|
46
47
|
ast += `${ spaces }┃ ]\n`;
|
|
47
48
|
ast += `${ spaces }┃\n`;
|
|
49
|
+
}
|
|
48
50
|
|
|
51
|
+
if (!!node.functions) {
|
|
49
52
|
ast += `${ spaces }┣ functions (${ node.functions.length }): [\n${ node.functions.map(f => ` • ${ f },\n`) }`;
|
|
50
53
|
ast += `${ spaces }┃ ]\n`;
|
|
51
54
|
ast += `${ spaces }┃\n`;
|
|
55
|
+
}
|
|
52
56
|
|
|
53
57
|
ast += `${ spaces }┣ where: ${ JSON.stringify(node.where) }\n`;
|
|
54
58
|
ast += `${ spaces }┃\n`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodester",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.7",
|
|
4
4
|
"description": "A versatile REST framework for Node.js",
|
|
5
5
|
"directories": {
|
|
6
6
|
"docs": "docs",
|
|
@@ -65,6 +65,8 @@
|
|
|
65
65
|
"./stacks/markers": "./lib/stacks/MarkersStack.js",
|
|
66
66
|
"./stacks/middlewares": "./lib/stacks/MiddlewaresStack.js",
|
|
67
67
|
|
|
68
|
+
"./tools/nql": "./lib/tools/nql.tool.js",
|
|
69
|
+
|
|
68
70
|
"./utils/dates": "./lib/utils/dates.js",
|
|
69
71
|
"./utils/sql": "./lib/utils/sql.util.js",
|
|
70
72
|
"./utils/strings": "./lib/utils/strings.util.js",
|
package/tests/index.test.js
CHANGED
package/tests/nql.test.js
CHANGED
|
@@ -64,26 +64,30 @@ describe('nodester Query Language', () => {
|
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
describe('includes', () => {
|
|
67
|
-
const queryStrings =
|
|
67
|
+
const queryStrings = {
|
|
68
68
|
// Simple includes.
|
|
69
|
-
'includes=comments&id=7',
|
|
70
|
-
// Include with
|
|
71
|
-
'includes=comments(id=10&position=4&limit=3&skip=10&order=desc&order_by=index&a=id,content,position)',
|
|
72
|
-
|
|
73
|
-
// 2 horizontals
|
|
74
|
-
'includes=comments,users&id=1000',
|
|
69
|
+
'simple-includes': 'includes=comments&id=7',
|
|
70
|
+
// Include with params.
|
|
71
|
+
'include-with-params': 'includes=comments(id=10&position=4&limit=3&skip=10&order=desc&order_by=index&a=id,content,position)',
|
|
72
|
+
|
|
73
|
+
// 2 horizontals.
|
|
74
|
+
'2-horizontals': 'includes=comments,users&id=1000',
|
|
75
|
+
// 4 horizontals with subquery.
|
|
76
|
+
'4-horizontals': 'in=categories,replies.users,comments(order_by=position&order=desc),users.avatars',
|
|
75
77
|
|
|
76
78
|
// Horizontals queried.
|
|
77
|
-
'includes=comments(order=desc),users,likes(order=rand),reposts&id=1000',
|
|
79
|
+
'horizontals-queried': 'includes=comments(order=desc),users,likes(order=rand),reposts&id=1000',
|
|
78
80
|
// Horizontals queried №2.
|
|
79
|
-
'in=comments(order_by=index&order=asc).users.karma',
|
|
81
|
+
'horizontals-queried-2': 'in=comments(order_by=index&order=asc).users.karma',
|
|
80
82
|
// Horizontals queried №3.
|
|
81
|
-
'in=reactions,comments(user_id=gte(4)&skip=10&limit=2).users,likes,reposts',
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
'horizontals-queried-3': 'in=reactions,comments(user_id=gte(4)&skip=10&limit=2).users,likes,reposts',
|
|
84
|
+
|
|
85
|
+
// Separated includes.
|
|
86
|
+
'separated-includes': 'includes=comments(order=rand)&id=7&limit=3&includes=users(a=id,content)',
|
|
87
|
+
};
|
|
84
88
|
|
|
85
89
|
test('Simple includes', () => {
|
|
86
|
-
const lexer = new QueryLexer( queryStrings[
|
|
90
|
+
const lexer = new QueryLexer( queryStrings['simple-includes'] );
|
|
87
91
|
const result = lexer.query;
|
|
88
92
|
|
|
89
93
|
|
|
@@ -96,7 +100,7 @@ describe('nodester Query Language', () => {
|
|
|
96
100
|
});
|
|
97
101
|
|
|
98
102
|
test('Include with all possible params', () => {
|
|
99
|
-
const lexer = new QueryLexer( queryStrings[
|
|
103
|
+
const lexer = new QueryLexer( queryStrings['include-with-params'] );
|
|
100
104
|
const result = lexer.query;
|
|
101
105
|
|
|
102
106
|
const tree = new ModelsTree();
|
|
@@ -113,7 +117,7 @@ describe('nodester Query Language', () => {
|
|
|
113
117
|
});
|
|
114
118
|
|
|
115
119
|
test('2 horizontals', () => {
|
|
116
|
-
const lexer = new QueryLexer( queryStrings[2] );
|
|
120
|
+
const lexer = new QueryLexer( queryStrings['2-horizontals'] );
|
|
117
121
|
const result = lexer.query;
|
|
118
122
|
|
|
119
123
|
|
|
@@ -126,8 +130,39 @@ describe('nodester Query Language', () => {
|
|
|
126
130
|
expect(result).toMatchObject(expected);
|
|
127
131
|
});
|
|
128
132
|
|
|
133
|
+
test('4 horizontals', () => {
|
|
134
|
+
// in=categories,replies.users,comments(order_by=position&order=desc),users.avatars
|
|
135
|
+
|
|
136
|
+
const lexer = new QueryLexer( queryStrings['4-horizontals'] );
|
|
137
|
+
const result = lexer.query;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
const tree = new ModelsTree();
|
|
141
|
+
tree.include('categories');
|
|
142
|
+
tree.include('replies');
|
|
143
|
+
tree.include('comments');
|
|
144
|
+
tree.include('users');
|
|
145
|
+
|
|
146
|
+
tree.use('replies');
|
|
147
|
+
tree.include('users');
|
|
148
|
+
|
|
149
|
+
tree.up();
|
|
150
|
+
|
|
151
|
+
tree.use('comments');
|
|
152
|
+
tree.node.order = 'desc';
|
|
153
|
+
tree.node.order_by = 'position';
|
|
154
|
+
|
|
155
|
+
tree.up();
|
|
156
|
+
tree.use('users');
|
|
157
|
+
tree.include('avatars');
|
|
158
|
+
|
|
159
|
+
const expected = tree.root.toObject();
|
|
160
|
+
|
|
161
|
+
expect(result).toMatchObject(expected);
|
|
162
|
+
});
|
|
163
|
+
|
|
129
164
|
test('Horizontals queried', () => {
|
|
130
|
-
const lexer = new QueryLexer( queryStrings[
|
|
165
|
+
const lexer = new QueryLexer( queryStrings['horizontals-queried'] );
|
|
131
166
|
const result = lexer.query;
|
|
132
167
|
|
|
133
168
|
|
|
@@ -147,7 +182,7 @@ describe('nodester Query Language', () => {
|
|
|
147
182
|
});
|
|
148
183
|
|
|
149
184
|
test('Horizontals queried №2', () => {
|
|
150
|
-
const lexer = new QueryLexer( queryStrings[
|
|
185
|
+
const lexer = new QueryLexer( queryStrings['horizontals-queried-2'] );
|
|
151
186
|
const result = lexer.query;
|
|
152
187
|
|
|
153
188
|
const tree = new ModelsTree();
|
|
@@ -165,7 +200,7 @@ describe('nodester Query Language', () => {
|
|
|
165
200
|
});
|
|
166
201
|
|
|
167
202
|
test('Horizontals queried №3', () => {
|
|
168
|
-
const lexer = new QueryLexer( queryStrings[
|
|
203
|
+
const lexer = new QueryLexer( queryStrings['horizontals-queried-3'] );
|
|
169
204
|
const result = lexer.query;
|
|
170
205
|
|
|
171
206
|
const tree = new ModelsTree();
|
|
@@ -192,7 +227,7 @@ describe('nodester Query Language', () => {
|
|
|
192
227
|
});
|
|
193
228
|
|
|
194
229
|
test('Separated includes"', () => {
|
|
195
|
-
const lexer = new QueryLexer( queryStrings[
|
|
230
|
+
const lexer = new QueryLexer( queryStrings['separated-includes'] );
|
|
196
231
|
const result = lexer.query;
|
|
197
232
|
|
|
198
233
|
const tree = new ModelsTree();
|