JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • 0
  • Score
    100M100P100Q13126F
  • License MIT

A declarative way to express queries with reselect

Package Exports

  • relational-reselect

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (relational-reselect) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

relational-reselect

Build Status Coverage Status Codacy Badge npm bundle size NPM npm

With its decarative style, this library aims to facilitate creation of complex selectors on a normalized store that imposes to perform joins, lookups, relationships, or whatever you call it !

import { createSelector } from 'reselect';
import Query from 'relational-reselect';

// my selectors
const a = createSelector(
  aSelector,
  aFn,
);
const b = createSelector(
  bSelector,
  bFn,
);
const c = createSelector(
  cSelector,
  cFn,
);

// define my query
const myQuery = new Query()
  .from(a, 'a')
  .leftJoin(b, 'b')
  .on(row => row.getIn(['a', 'id']) === row.getIn(['b', 'aRef']))
  .leftJoin(c, 'c')
  .on(row => row.getIn(['c', 'id']) >= row.getIn(['a', 'cId']));

// get generated selector
const mySelector = myQuery.get();

// or directly run it
const myData = myQuery.run(state);

other examples are available on dedicated CodeSandbox

Install

npm install --save relational-reselect

How to write a query ?

State Machine diagram

API

Query bloc

new Query()

Create a new query

get(): Selector

generate selector for this query

run(state: State): Collection

run this query (= execute its selector) and return result

Select bloc

select(selectSpec: SpecificationForTuple): Select

Optional operation if you need to process data coming from From bloc.

From bloc

In this bloc, any dataSource can be a selector (a simple one or a reselect one) or another valid query if you need to nest them. Aliases are required for naming dataSources, except when you use except, intersect, and union joins

from(dataSource: DataSource, alias: string): From

Required operation.

Joins

Optional operation. You can join as much data sources as you want as long as you specify how to join them. Supported join types are :

  • innerJoin(dataSource: DataSource, alias: string): IncompleteJoin
  • leftJoin(dataSource: DataSource, alias: string): IncompleteJoin
  • rightJoin(dataSource: DataSource, alias: string): IncompleteJoin
  • fullJoin(dataSource: DataSource, alias: string): IncompleteJoin
  • except(dataSource: DataSource): CompleteJoin
  • intersect(dataSource: DataSource): CompleteJoin
  • union(dataSource: DataSource): CompleteJoin
  • cartesian(dataSource: DataSource, alias: string): CompleteJoin

Incomplete joins need to be completed with a on(specification: SpecificationForMatchingTuple): CompleteJoin

Where bloc

where(whereSpec: SpecificationForMatchingTuple): Where

Optional operation. This filter will be applied over data coming from From or Select (if exists) bloc

Ordering bloc

orderBy(orderBySpec: SpecificationForOrderingTuples): OrderBy

Optional operation. This sort will be applied over data coming from From, or Select (if exists), or Where (if exists) bloc

Grouping bloc

TODO !

Specification Types

type Tuple = Map<string, any>;
type SpecificationForTuple = (tuple: Tuple) => Tuple;
type SpecificationForMatchingTuple = (tuple: Tuple) => boolean;
type SpecificationForOrderingTuples = (left: Tuple, right: Tuple) => number;

Class Diagram

Class diagram