UNPKG

@tanstack/db-ivm

Version:

Incremental View Maintenance for TanStack DB based on Differential Dataflow

59 lines (45 loc) 1.9 kB
# IVM implementation for TanStack DB based on Differential Dataflow This is an implementation of differential dataflow used by TanStack DB, forked from [@electric-sql/d2ts](https://github.com/electric-sql/d2ts), but simplified and without the complexities of multi-dimensional versioning. It is used internally by the TanStack DB with the live queries compiled to a D2 graph. This library doesn't depend on the TanStack DB and so could be used in other projects. The API is almost identical to D2TS, but without the need to specify a version when sending data, or to send a frontier to mark the end of a version. ### Basic Usage Here's a simple example that demonstrates the core concepts: ```typescript import { D2, map, filter, debug, MultiSet } from "@tanstack/db-ivm" // Create a new D2 graph const graph = new D2() // Create an input stream // We can specify the type of the input stream, here we are using number. const input = graph.newInput<number>() // Build a simple pipeline that: // 1. Takes numbers as input // 2. Adds 5 to each number // 3. Filters to keep only even numbers // Pipelines can have multiple inputs and outputs. const output = input.pipe( map((x) => x + 5), filter((x) => x % 2 === 0), debug("output") ) // Finalize the pipeline, after this point we can no longer add operators or // inputs graph.finalize() // Send some data // Data is sent as a MultiSet, which is a map of values to their multiplicity // Here we are sending 3 numbers (1-3), each with a multiplicity of 1 // The key thing to understand is that the MultiSet represents a *change* to // the data, not the data itself. "Inserts" and "Deletes" are represented as // an element with a multiplicity of 1 or -1 respectively. input.sendData( new MultiSet([ [1, 1], [2, 1], [3, 1], ]) ) // Process the data graph.run() // Output will show: // 6 (from 1 + 5) // 8 (from 3 + 5) ```