0.0.15 • Published 3 years ago

@breadman/entity-query v0.0.15

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

Entity Query

Filtering & searching records is one of the most common (and tedious) tasks in web-development. Entity Query allows you to retrieve records from your store w/simple & perfomant queries.

Demo & Query-Builder

Table of Contents

Features

  • Perform queries on serialized (i.e. { [record.id]: record }) state entities
  • Simple query language w/RegEx support
  • Advanced query conditions
  • All internal cache is memory safe

Install

yarn add @breadman/entity-query

Usage

Simple Query

EQ(presidents).search({ party: "Democratic" });

RegExp

EQ(presidents).search({ party: "/Democrat/gi" });

Nested Queries

EQ(presidents).search({ vice: { lastName: "Johnson" } });
EQ(presidents).search({ vice: { "/(.*?)/gi": "/John/" } });

Multiple Query Properties

EQ(presidents).search({ term: { startDay: "Thursday", endDay: "Saturday" } });

Conditions

EQ(presidents).search(
  [{ term: { startDay: "Thursday" } }, { term: { endDay: "Saturday" } }],
  { conditions: "all" }
);

EQ(presidents).search(
  [{ term: { startDay: "Thursday" } }, { term: { endDay: "Saturday" } }],
  { conditions: "any" }
);

EQ(presidents).search([{ party: "/Democrat/gi" }, { party: "Democratic" }], {
  conditions: "diff",
});

EQ(presidents).search([{ party: "Republican" }, { party: "Democratic" }], {
  conditions: "none",
});

With Redux

import EQ from "@breadman/entity-query";
import { useSelector } from "react-redux";

function PresidentsList({ name = "Theodore Roosevelt" }) {
  const eq = EQ(useSelector((state) => state.entities.presidents));
  const presidents = eq.filter({ name });

  return (
    <ul>
      {presidents.map((record) => (
        <li key={record.id}>
          {record.firstName} {record.lastName}
        </li>
      ))}
    </ul>
  );
}

With React Query

import EQ from "@breadman/entity-query";
import { useQuery } from "react-query";

function PresidentsList({ lastName = "Roosevelt" }) {
  const { isLoading, data } = useQuery("presidents", () =>
    fetch("https://example.com/api/us-presidents")
      .then((res) => res.json())
      // must serialize entities
      .then((arr) => arr.reduce((acc, cur) => ({ ...acc, [cur.id]: cur }), {}))
  );

  const eq = EQ(isLoading ? {} : data);
  const presidents = eq.filter({ lastName });

  return (
    <ul>
      {presidents.map((record) => (
        <li key={record.id}>
          {record.firstName} {record.lastName}
        </li>
      ))}
    </ul>
  );
}

Examples

Copy-Paste Example

import EQ from "@breadman/entity-query";

const state = {
  entities: {
    presidents: {
      16: {
        firstName: "Abraham",
        id: "16",
        lastName: "Lincoln",
        party: "Republican Party",
      },
      26: {
        firstName: "Theodore",
        id: "26",
        lastName: "Roosevelt",
        party: "Republican Party",
      },
      32: {
        firstName: "Franklin",
        id: "32",
        lastName: "Roosevelt",
        party: "Democratic Party",
      },
    },
  },
};

const eq = EQ(state.entities.presidents);

console.log(eq.search({ lastName: "/roosevelt/gi" }));
// ["26","32"]

console.log(eq.filter({ party: "Republican Party" }));
// [
//   {
//     firstName: "Abraham",
//     id: "16",
//     lastName: "Lincoln",
//     party: "Republican Party",
//   },
//   {
//     firstName: "Theodore",
//     id: "26",
//     lastName: "Roosevelt",
//     party: "Republican Party",
//   },
// ];
0.0.11

3 years ago

0.0.12

3 years ago

0.0.13

3 years ago

0.0.14

3 years ago

0.0.15

3 years ago

0.0.10

3 years ago

0.0.9

3 years ago

0.0.8

3 years ago

0.0.5

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago

0.0.0

3 years ago