Skip to content

Commit

Permalink
Custom Aggregations sorting #101 with tests (#109)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
cigolpl and lhoucinecherif authored May 15, 2022
1 parent ad5ada6 commit 61efad8
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 6 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ Responsible for defining global configuration. Look for full example here - [con

- **`title`** Human readable filter name
- **`size`** Number of values provided for this filter (Default: `10`)
- **`sort`** Values sorted by `count` (Default) or `term` for the value name
- **`order`** `asc` | `desc`
- **`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
- **`order`** `asc` | `desc`. This can be also an array of orders (if `sort` is also array)
- **`show_facet_stats`** `true` | `false` (Default) to retrieve the min, max, avg, sum rating values from the whole filtered dataset
- **`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)

Expand Down
4 changes: 3 additions & 1 deletion dist/itemsjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -20280,7 +20280,9 @@ var getBuckets = function getBuckets(data, input, aggregations) {
};
}).value();

if (sort === 'term') {
if (_.isArray(sort)) {
buckets = _.orderBy(buckets, sort || ['key'], order || ['asc']);
} else if (sort === 'term') {
buckets = _.orderBy(buckets, ['selected', 'key'], ['desc', order || 'asc']);
} else {
buckets = _.orderBy(buckets, ['selected', 'doc_count', 'key'], ['desc', order || 'desc', 'asc']);
Expand Down
2 changes: 1 addition & 1 deletion dist/itemsjs.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "itemsjs",
"version": "2.1.14",
"version": "2.1.15",
"description": "Created to perform fast search on small json dataset (up to 1000 elements).",
"main": "lib/index.js",
"scripts": {
Expand Down
4 changes: 3 additions & 1 deletion src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,9 @@ const getBuckets = function(data, input, aggregations) {
})
.value();

if (sort === 'term') {
if (_.isArray(sort)) {
buckets = _.orderBy(buckets, sort || ['key'], order || ['asc']);
} else if (sort === 'term') {
buckets = _.orderBy(buckets, ['selected', 'key'], ['desc', order || 'asc']);
} else {
buckets = _.orderBy(buckets, ['selected', 'doc_count', 'key'], ['desc', order || 'desc', 'asc']);
Expand Down
94 changes: 94 additions & 0 deletions tests/facetSortingSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
'use strict';

const assert = require('assert');
const items = [{
genres: 'Western'
}, {
genres: 'Western'
}, {
genres: 'Comedy'
}, {
genres: 'Drama'
}, {
genres: 'Horror'
}, {
genres: 'Romance'
}, {
genres: 'Western'
}];

describe('facet sorting', function() {

it('sort by key', function test(done) {

const result = require('./../index')(items, {
aggregations: {
genres: {
sort: ['key'],
}
}
}).aggregation({
name: 'genres',
});

assert.deepEqual(result.data.buckets.map(v => v.key), ['Comedy', 'Drama', 'Horror', 'Romance', 'Western']);

done();
});

it('sort by key descending', function test(done) {

const result = require('./../index')(items, {
aggregations: {
genres: {
sort: ['key'],
order: ['desc']
}
}
}).aggregation({
name: 'genres',
});

assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Romance', 'Horror', 'Drama', 'Comedy']);

done();
});

it('sort by doc_count', function test(done) {

const result = require('./../index')(items, {
aggregations: {
genres: {
sort: ['doc_count'],
order: ['desc'],
}
}
}).aggregation({
name: 'genres',
});

assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Comedy', 'Drama', 'Horror', 'Romance']);

done();
});

it('sort by doc_count and key and order key desc', function test(done) {

const result = require('./../index')(items, {
aggregations: {
genres: {
sort: ['doc_count', 'key'],
order: ['desc', 'desc'],
}
}
}).aggregation({
name: 'genres',
});

assert.deepEqual(result.data.buckets.map(v => v.key), ['Western', 'Romance', 'Horror', 'Drama', 'Comedy']);

done();
});

});

0 comments on commit 61efad8

Please sign in to comment.