Skip to content

Commit 40520b2

Browse files
Merge pull request #15 from SimpliField/feat/query-sorting
[Feat] query sorting
2 parents f6c4dec + 43f6e64 commit 40520b2

File tree

5 files changed

+84
-217
lines changed

5 files changed

+84
-217
lines changed

angular-sql-query.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,11 @@
9898
*
9999
* @param {Object} params - Request Params
100100
* @param {Object} limitParams - Limit params of the query
101+
* @param {Array} sortParams - Sort params of the query
101102
* @return {Promise} - Request result
102103
* @this SqlQueryService
103104
*/
104-
function queryBackUp(params, limitParams) {
105+
function queryBackUp(params, limitParams, sortParams) {
105106
var _this = this;
106107
var indexedFields = _this.helpers.indexed_fields;
107108
var castedParams = castParamsForQuery(params || {});
@@ -114,7 +115,7 @@
114115
var batchPromise = tmpTablesQueries.length ? _this.batch(tmpTablesQueries) : $q.when();
115116

116117
return batchPromise.then(function onceCreated() {
117-
var query = prepareSimpleQuery(_this.backUpName, organizedIndexedParams, limitParams);
118+
var query = prepareSimpleQuery(_this.backUpName, organizedIndexedParams, limitParams, sortParams);
118119

119120
return _this.execute(query.query, query.params).then(function (docs) {
120121
var datas = transformResults(docs);
@@ -367,7 +368,7 @@
367368
// QUERY HELPERS
368369
//
369370
// -----------------
370-
function prepareSimpleQuery(tableName, queryAsObject, limitParams) {
371+
function prepareSimpleQuery(tableName, queryAsObject, limitParams, sortParams) {
371372
return {
372373
query: getSimpleQuery(queryAsObject),
373374
params: Object.keys(queryAsObject.self).reduce(function (arr, column) {
@@ -382,7 +383,8 @@
382383
var andDefinition = queries.join(' AND ');
383384
var dataDefinition = '' + whereDefinition + andDefinition;
384385
var query = statement + dataDefinition;
385-
var limitDefinition = applyLimitQuery(query, limitParams);
386+
var sortedQuery = applySortQuery(query, sortParams);
387+
var limitDefinition = applyLimitQuery(sortedQuery, limitParams);
386388

387389
return limitDefinition + ';';
388390
}
@@ -451,6 +453,22 @@
451453

452454
return paramsQuery ? query + ' WHERE ' + paramsQuery : query;
453455
}
456+
function applySortQuery(query) {
457+
var sortParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
458+
459+
if (sortParams.length === 0) {
460+
return query;
461+
};
462+
463+
// const sort = sortParams.map((p) => `${p.key}`).join(',')
464+
var queryOrder = ' ORDER BY ' + sortParams.map(function (_ref) {
465+
var key = _ref.key,
466+
desc = _ref.desc;
467+
return key + ' ' + (desc && 'DESC');
468+
}).join(',');
469+
470+
return query + queryOrder;
471+
}
454472
function applyLimitQuery(query) {
455473
var limitParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
456474

angular-sql-query.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/angular-sql-query.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,11 @@
9999
*
100100
* @param {Object} params - Request Params
101101
* @param {Object} limitParams - Limit params of the query
102+
* @param {Array} sortParams - Sort params of the query
102103
* @return {Promise} - Request result
103104
* @this SqlQueryService
104105
*/
105-
function queryBackUp(params, limitParams) {
106+
function queryBackUp(params, limitParams, sortParams) {
106107
const _this = this;
107108
const indexedFields = _this.helpers.indexed_fields;
108109
const castedParams = castParamsForQuery(params || {});
@@ -120,7 +121,7 @@
120121

121122
return batchPromise
122123
.then(function onceCreated() {
123-
var query = prepareSimpleQuery(_this.backUpName, organizedIndexedParams, limitParams);
124+
var query = prepareSimpleQuery(_this.backUpName, organizedIndexedParams, limitParams, sortParams);
124125

125126
return _this.execute(query.query, query.params)
126127
.then((docs) => {
@@ -392,7 +393,7 @@
392393
// QUERY HELPERS
393394
//
394395
// -----------------
395-
function prepareSimpleQuery(tableName, queryAsObject, limitParams) {
396+
function prepareSimpleQuery(tableName, queryAsObject, limitParams, sortParams) {
396397
return {
397398
query: getSimpleQuery(queryAsObject),
398399
params: Object.keys(queryAsObject.self)
@@ -411,7 +412,8 @@
411412
const andDefinition = queries.join(' AND ');
412413
const dataDefinition = `${whereDefinition}${andDefinition}`;
413414
const query = statement + dataDefinition;
414-
const limitDefinition = applyLimitQuery(query, limitParams);
415+
const sortedQuery = applySortQuery(query, sortParams);
416+
const limitDefinition = applyLimitQuery(sortedQuery, limitParams);
415417

416418
return `${limitDefinition};`;
417419
}
@@ -480,6 +482,17 @@
480482
`${query} WHERE ${paramsQuery}` :
481483
query;
482484
}
485+
function applySortQuery(query, sortParams = []) {
486+
if(0 === sortParams.length) {
487+
return query;
488+
}
489+
490+
const queryOrder = ` ORDER BY ${
491+
sortParams.map(({ key, desc }) => `${key} ${desc && 'DESC'}`).join(',')
492+
}`;
493+
494+
return query + queryOrder;
495+
}
483496
function applyLimitQuery(query, limitParams = {}) {
484497
let queryLimit = (limitParams.limit) ? ` LIMIT ${limitParams.limit}` : '';
485498

src/angular-sql-query.spec.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,41 @@
202202
expect(data[1].id).equal(2);
203203
}));
204204

205+
it('should query Backup datas with sort', inject(($q, $timeout) => {
206+
var data;
207+
208+
executeStub.yields('test', backupDatas);
209+
210+
// Common param
211+
backUp.queryBackUp({
212+
test: 'test1',
213+
isOk: false,
214+
}, { limit: 10 }, [{ key: 'name', desc: true }]).then((_data_) => {
215+
data = _data_;
216+
});
217+
218+
$timeout.flush();
219+
220+
// expect(executeStub.callCount).equal(1);
221+
expect(executeStub.args[0][0]).equal('SELECT * FROM test ORDER BY name DESC LIMIT 10;');
222+
223+
expect(data).lengthOf(1);
224+
expect(data[0].id).equal(1);
225+
226+
// Array param
227+
data = null;
228+
backUp.queryBackUp({
229+
test: ['test1', 'test2'],
230+
}).then((_data_) => {
231+
data = _data_;
232+
});
233+
$timeout.flush();
234+
235+
expect(data).lengthOf(2);
236+
expect(data[0].id).equal(1);
237+
expect(data[1].id).equal(2);
238+
}));
239+
205240
it('should query Backup datas with indexed fields', inject(($q, $timeout) => {
206241
var data;
207242

0 commit comments

Comments
 (0)