UNPKG

@electric-sql/d2ts

Version:

D2TS is a TypeScript implementation of Differential Dataflow.

43 lines 1.85 kB
import { StreamBuilder } from '../../d2.js'; import { DifferenceStreamWriter } from '../../graph.js'; import { ReduceOperatorSQLite } from './reduce.js'; import { SQLiteContext } from '../context.js'; export class DistinctOperatorSQLite extends ReduceOperatorSQLite { constructor(id, inputA, output, initialFrontier, db) { const distinctInner = (vals) => { const consolidated = new Map(); const values = new Map(); for (const [val, diff] of vals) { const key = JSON.stringify(val); consolidated.set(key, (consolidated.get(key) || 0) + diff); values.set(key, val); } return Array.from(consolidated.entries()) .filter(([_, count]) => count > 0) .map(([key, _]) => [values.get(key), 1]); }; super(id, inputA, output, distinctInner, initialFrontier, db); } } /** * Removes duplicates by key * Persists state to SQLite * * @param db - Optional SQLite database (can be injected via context) */ export function distinct(db) { return (stream) => { // Get database from context if not provided explicitly const database = db || SQLiteContext.getDb(); if (!database) { throw new Error('SQLite database is required for distinct operator. ' + 'Provide it as a parameter or use withSQLite() to inject it.'); } const output = new StreamBuilder(stream.graph, new DifferenceStreamWriter()); const operator = new DistinctOperatorSQLite(stream.graph.getNextOperatorId(), stream.connectReader(), output.writer, stream.graph.frontier(), database); stream.graph.addOperator(operator); stream.graph.addStream(output.connectReader()); return output; }; } //# sourceMappingURL=distinct.js.map