README.md

# RankEx

A ranking/leaderboard library for Elixir based on ETS.

It maps score (integer or float) to a integer id or UUID along with any other 
data (name of the ranker). 

It's leveraged on ETS ordered set once it can also order some kinds of records 
with a tuple as key.

This way all operations regarding sorting is given for granted within a bulletproof cache.

For performance reasons, update and delete operations require the previous score which 
allows this mapping (id->score) to be stored in users cache without duplicity.

Supports:

  - Fast insertion
  - Fast update
  - Fast delete
  - Position by score (thousand reads in 300ms) or id 
  - Detail field that might be used for rank names or other info 
  - All with operation for tied score
  - Multiple tables
  - Top N results in different formats:
    - :tuples : [{{score, id}, detail}, ...]
    - :map_list : [%{id: id, detail: detail, score: score}, ...]
    - :position_map : %{1: %{id: id, detail: detail, score: score}, 2: ...}
    - :score_position_map : %{score_value => %{id: id, detail: detail, position: position}, ...}
  
# Benchmarking

insert/3 for 10000 items: 30ms

After inserting one million records:

 delete/2 for 10000 items: 7ms
 update/4 for 10000 items: 37ms
 position_in/2 for 1000 items: 272ms

Running on Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz and DDR4 2400 MT/s

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `benchmarking` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:rankex, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/benchmarking](https://hexdocs.pm/benchmarking).