Skip to content

Commit 954057b

Browse files
authored
Merge pull request #36 from AddSearch/support-multiple-sort-options
support sortOptions in array
2 parents f491d8a + 12edc61 commit 954057b

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,20 @@ Set page number, page size and sorting parameters. It's possible to order result
143143
- relevance (descending)
144144
- date (ascending or descending)
145145
- custom field value (ascending or descending. E.g. *custom_fields.price*)
146+
147+
Type of sortBy and sortOrder: `string` or `array`. They must have the same type, in case type is array, sortBy and sortOrder must have the same size.
148+
For example:
149+
```js
150+
sortBy = 'date';
151+
sortOrder = 'desc';
152+
153+
or
154+
155+
sortBy = ['date', 'custom_fields.price'];
156+
sortOrder = ['desc', 'asc'];
157+
```
158+
159+
146160
```js
147161
// Defaults: page "1", pageSize "10", sortBy "relevance", sortOrder "desc"
148162
client.setPaging(page, pageSize, sortBy, sortOrder);

src/apifetch.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ var executeApiFetch = function(apiHostname, sitekey, type, settings, cb, fuzzyRe
7575
settingToQueryParam(settings.dateTo, 'dateTo') +
7676
settingToQueryParam(settings.paging.page, 'page') +
7777
settingToQueryParam(settings.paging.pageSize, 'limit') +
78-
settingToQueryParam(settings.paging.sortBy, 'sort') +
79-
settingToQueryParam(settings.paging.sortOrder, 'order') +
8078
settingToQueryParam(settings.shuffleAndLimitTo, 'shuffleAndLimitTo') +
8179
settingToQueryParam(settings.jwt, 'jwt') +
8280
settingToQueryParam(settings.resultType, 'resultType') +
@@ -87,6 +85,17 @@ var executeApiFetch = function(apiHostname, sitekey, type, settings, cb, fuzzyRe
8785
settingToQueryParam(settings.analyticsTag, 'analyticsTag') +
8886
settingToQueryParam(settings.hierarchicalFacetSetting, 'hierarchicalFacets');
8987

88+
// Add sortBy and sortOrder
89+
if (Array.isArray(settings.paging.sortBy)) {
90+
settings.paging.sortBy.forEach(function(value, index) {
91+
qs = qs + settingToQueryParam(value, 'sort') +
92+
settingToQueryParam(settings.paging.sortOrder[index], 'order');
93+
});
94+
} else {
95+
qs = qs + settingToQueryParam(settings.paging.sortBy, 'sort') +
96+
settingToQueryParam(settings.paging.sortOrder, 'order');
97+
}
98+
9099
// Add custom field filters
91100
if (settings.customFieldFilters) {
92101
for (let i = 0; i < settings.customFieldFilters.length; i++) {

src/settings.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
var util = require('./util');
34
var settings = function() {
45
this.settings = {
56
keyword: '*',
@@ -203,15 +204,7 @@ var settings = function() {
203204

204205
this.setPaging = function(page, pageSize, sortBy, sortOrder) {
205206
// Validate
206-
if (page < 1) {
207-
throw "page must be 1 or bigger";
208-
}
209-
if (pageSize < 1 || pageSize > 300) {
210-
throw "pageSize must be 1-300";
211-
}
212-
if (sortOrder !== 'asc' && sortOrder !== 'desc') {
213-
throw "sortOrder must be asc or desc";
214-
}
207+
util.validateSetPagingParams(page, pageSize, sortBy, sortOrder);
215208

216209
this.settings.paging.page = page;
217210
this.settings.paging.pageSize = pageSize;

src/util.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,33 @@ const base64 = function(s) {
1414
}
1515
}
1616

17+
const validateSetPagingParams = function(page, pageSize, sortBy, sortOrder) {
18+
if (page < 1) {
19+
throw "page must be 1 or bigger";
20+
}
21+
if (pageSize < 1 || pageSize > 300) {
22+
throw "pageSize must be 1-300";
23+
}
24+
if (!sortBy || !sortOrder) {
25+
throw "invalid values for sortBy or sortOrder: " + sortBy + ", " + sortOrder;
26+
}
27+
if (!((typeof sortBy == 'string' && typeof sortOrder == 'string') || (Array.isArray(sortBy) && Array.isArray(sortOrder)))) {
28+
throw "sortBy and sortOrder must have the same type: string or Array";
29+
}
30+
if (Array.isArray(sortBy) && sortBy.length !== sortOrder.length) {
31+
throw "sortBy and sortOrder must have the same size";
32+
}
33+
if (typeof sortOrder == 'string' && sortOrder !== 'asc' && sortOrder !== 'desc') {
34+
throw "sortOrder must be asc or desc";
35+
}
36+
if (Array.isArray(sortOrder) &&
37+
sortOrder.filter(function(e) {return e !== 'desc' && e!=='asc'}).length > 0) {
38+
throw "all values of sortOrder array must be asc or desc";
39+
}
40+
}
41+
1742
module.exports = {
1843
isFunction,
19-
base64
44+
base64,
45+
validateSetPagingParams: validateSetPagingParams
2046
}

0 commit comments

Comments
 (0)