Skip to content

Commit 61efad8

Browse files
Custom Aggregations sorting #101 with tests (#109)
* Update aggregations sort this update add the ability to sort aggregations using custom array, it remove the sorting limitiation by the predefined 'selected', 'key', 'doc_count' ... no you can Use something like ''sort['key', 'doc_count']" in aggresgations. * added tests and info in readme Co-authored-by: Houcine Cherif <31718137+lhoucinecherif@users.noreply.github.com>
1 parent ad5ada6 commit 61efad8

File tree

6 files changed

+104
-6
lines changed

6 files changed

+104
-6
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ Responsible for defining global configuration. Look for full example here - [con
182182

183183
- **`title`** Human readable filter name
184184
- **`size`** Number of values provided for this filter (Default: `10`)
185-
- **`sort`** Values sorted by `count` (Default) or `term` for the value name
186-
- **`order`** `asc` | `desc`
185+
- **`sort`** Values sorted by `count` (Default) or `term` for the value name. This can be also an array of keys which define the sorting priority
186+
- **`order`** `asc` | `desc`. This can be also an array of orders (if `sort` is also array)
187187
- **`show_facet_stats`** `true` | `false` (Default) to retrieve the min, max, avg, sum rating values from the whole filtered dataset
188188
- **`conjunction`** `true` (Default) stands for an _AND_ query (results have to fit all selected facet-values), `false` for an _OR_ query (results have to fit one of the selected facet-values)
189189

dist/itemsjs.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20280,7 +20280,9 @@ var getBuckets = function getBuckets(data, input, aggregations) {
2028020280
};
2028120281
}).value();
2028220282

20283-
if (sort === 'term') {
20283+
if (_.isArray(sort)) {
20284+
buckets = _.orderBy(buckets, sort || ['key'], order || ['asc']);
20285+
} else if (sort === 'term') {
2028420286
buckets = _.orderBy(buckets, ['selected', 'key'], ['desc', order || 'asc']);
2028520287
} else {
2028620288
buckets = _.orderBy(buckets, ['selected', 'doc_count', 'key'], ['desc', order || 'desc', 'asc']);

dist/itemsjs.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.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "itemsjs",
3-
"version": "2.1.14",
3+
"version": "2.1.15",
44
"description": "Created to perform fast search on small json dataset (up to 1000 elements).",
55
"main": "lib/index.js",
66
"scripts": {

src/helpers.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,9 @@ const getBuckets = function(data, input, aggregations) {
291291
})
292292
.value();
293293

294-
if (sort === 'term') {
294+
if (_.isArray(sort)) {
295+
buckets = _.orderBy(buckets, sort || ['key'], order || ['asc']);
296+
} else if (sort === 'term') {
295297
buckets = _.orderBy(buckets, ['selected', 'key'], ['desc', order || 'asc']);
296298
} else {
297299
buckets = _.orderBy(buckets, ['selected', 'doc_count', 'key'], ['desc', order || 'desc', 'asc']);

tests/facetSortingSpec.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
'use strict';
2+
3+
const assert = require('assert');
4+
const items = [{
5+
genres: 'Western'
6+
}, {
7+
genres: 'Western'
8+
}, {
9+
genres: 'Comedy'
10+
}, {
11+
genres: 'Drama'
12+
}, {
13+
genres: 'Horror'
14+
}, {
15+
genres: 'Romance'
16+
}, {
17+
genres: 'Western'
18+
}];
19+
20+
describe('facet sorting', function() {
21+
22+
it('sort by key', function test(done) {
23+
24+
const result = require('./../index')(items, {
25+
aggregations: {
26+
genres: {
27+
sort: ['key'],
28+
}
29+
}
30+
}).aggregation({
31+
name: 'genres',
32+
});
33+
34+
assert.deepEqual(result.data.buckets.map(v => v.key), ['Comedy', 'Drama', 'Horror', 'Romance', 'Western']);
35+
36+
done();
37+
});
38+
39+
it('sort by key descending', function test(done) {
40+
41+
const result = require('./../index')(items, {
42+
aggregations: {
43+
genres: {
44+
sort: ['key'],
45+
order: ['desc']
46+
}
47+
}
48+
}).aggregation({
49+
name: 'genres',
50+
});
51+
52+
assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Romance', 'Horror', 'Drama', 'Comedy']);
53+
54+
done();
55+
});
56+
57+
it('sort by doc_count', function test(done) {
58+
59+
const result = require('./../index')(items, {
60+
aggregations: {
61+
genres: {
62+
sort: ['doc_count'],
63+
order: ['desc'],
64+
}
65+
}
66+
}).aggregation({
67+
name: 'genres',
68+
});
69+
70+
assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Comedy', 'Drama', 'Horror', 'Romance']);
71+
72+
done();
73+
});
74+
75+
it('sort by doc_count and key and order key desc', function test(done) {
76+
77+
const result = require('./../index')(items, {
78+
aggregations: {
79+
genres: {
80+
sort: ['doc_count', 'key'],
81+
order: ['desc', 'desc'],
82+
}
83+
}
84+
}).aggregation({
85+
name: 'genres',
86+
});
87+
88+
assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Romance', 'Horror', 'Drama', 'Comedy']);
89+
90+
done();
91+
});
92+
93+
});
94+

0 commit comments

Comments
 (0)