An open API service indexing awesome lists of open source software.

https://github.com/makeomatic/redis-filtered-sort

Exports LUA script, which is able to perform multi filter operations, as well as sorts
https://github.com/makeomatic/redis-filtered-sort

redis sorts

Last synced: 3 months ago
JSON representation

Exports LUA script, which is able to perform multi filter operations, as well as sorts

Awesome Lists containing this project

README

          

# redis-filtered-sort

[![Build Status](https://travis-ci.org/makeomatic/redis-filtered-sort.svg)](https://travis-ci.org/makeomatic/redis-filtered-sort)

Exports LUA script, which is able to perform multi filter operations, as well as sorts

This basically replicates `http://redis.io/commands/sort` but with extra features and ability to run it in clustered mode with
hashed keys, which resolve to the same slot

## Installation

`npm i redis-filtered-sort -S`

## Usage

```js
const { filter: strFilter, attach } = require('redis-filtered-sort');
const Redis = require('ioredis');
const redis = new Redis();

// adds redis.sortedFilteredList command to redis instance
attach(redis, 'fsort');

// raw Buffer of lua script
// filteredSort.script

const filter = strFilter({
// only ids with `!mamba%` in them will be presented. Internally it uses lua string.find, so regexp is possible. Escape special chars
// with % or use escape helper for that
'#': '!mamba%',
priority: {
gte: 10, // only ids, which have priority greater or equal to 10 will be returned
},
name: 'love', // only ids, which have 'name' containing 'love' in their metadata will be returned
});
const offset = 10;
const limit = 20;
const sortBy = 'priority';
const expiration = 30000; // ms

// perform op
const currentTime = Date.now();

redis
.fsort('set-of-ids', 'metadata*', sortBy, 'DESC', filter, currentTime, offset, limit, expiration)
.then(data => {
// how many items in the complete list
// rest of the data is ids from the 'set-of-ids'
const sortedListLength = parseInt(data.pop(), 10);

// at this point you might want to populate ids with actual data about them
// for instance, like this:
return Promise.map(data, function populateData(id) {
return Promise.props({
id,
data: redis.hgetall('metadata' + id),
});
});
});
```

### Aggregate functions

1. use fsort to generate list of ids
2. pass that id to aggregate function and receive results back

```js
redis
.fsortAggregate(ID_LIST_KEY, META_KEY_PATTERN, mod.filter({
age: 'sum'
}))
.then(JSON.parse)
.get('age')
```