From bd65bb67e25a79b019d745b7262b2008ce2adb15 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 16 Nov 2016 01:59:39 +0100 Subject: incrementally verify denoms The denominations are not stored in a separate object store. --- src/query.ts | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/query.ts') diff --git a/src/query.ts b/src/query.ts index 08e270ea6..a284ef1b7 100644 --- a/src/query.ts +++ b/src/query.ts @@ -29,6 +29,11 @@ export interface JoinResult { right: R; } +export interface JoinLeftResult { + left: L; + right?: R; +} + export class Store { name: string; @@ -62,6 +67,8 @@ export class Index { export interface QueryStream { indexJoin(index: Index, keyFn: (obj: T) => I): QueryStream>; + indexJoinLeft(index: Index, + keyFn: (obj: T) => I): QueryStream>; keyJoin(store: Store, keyFn: (obj: T) => I): QueryStream>; filter(f: (T: any) => boolean): QueryStream; @@ -123,6 +130,12 @@ abstract class QueryStreamBase implements QueryStream, PromiseLike { return new QueryStreamIndexJoin(this, index.storeName, index.indexName, keyFn); } + indexJoinLeft(index: Index, + keyFn: (obj: T) => I): QueryStream> { + this.root.addStoreAccess(index.storeName, false); + return new QueryStreamIndexJoinLeft(this, index.storeName, index.indexName, keyFn); + } + keyJoin(store: Store, keyFn: (obj: T) => I): QueryStream> { this.root.addStoreAccess(store.name, false); @@ -276,8 +289,48 @@ class QueryStreamIndexJoin extends QueryStreamBase> { if (cursor) { f(false, {left: value, right: cursor.value}, tx); cursor.continue(); + } + } + }); + } +} + + +class QueryStreamIndexJoinLeft extends QueryStreamBase> { + s: QueryStreamBase; + storeName: string; + key: any; + indexName: string; + + constructor(s: QueryStreamBase, storeName: string, indexName: string, + key: any) { + super(s.root); + this.s = s; + this.storeName = storeName; + this.key = key; + this.indexName = indexName; + } + + subscribe(f: SubscribeFn) { + this.s.subscribe((isDone, value, tx) => { + if (isDone) { + f(true, undefined, tx); + return; + } + console.log("joining on", this.key(value)); + const s = tx.objectStore(this.storeName).index(this.indexName); + const req = s.openCursor(IDBKeyRange.only(this.key(value))); + let gotMatch = false; + req.onsuccess = () => { + let cursor = req.result; + if (cursor) { + gotMatch = true; + f(false, {left: value, right: cursor.value}, tx); + cursor.continue(); } else { - f(true, undefined, tx); + if (!gotMatch) { + f(false, {left: value}, tx); + } } } }); -- cgit v1.2.3