diff --git a/packages/system/src/query-manager.ts b/packages/system/src/query-manager.ts index f9021fa0..cc629401 100644 --- a/packages/system/src/query-manager.ts +++ b/packages/system/src/query-manager.ts @@ -133,35 +133,25 @@ export class QueryManager extends EventEmitter { if (this.#system.requestRouter) { filters = this.#system.requestRouter.forAllRequest(filters); } - const expanded = filters.flatMap(a => this.#system.optimizer.expandFilter(a)); - const qSend = this.#groupFlatByRelay(expanded); - qSend.forEach(a => (a.syncFrom = syncFrom)); - await Promise.all(qSend.map(a => this.#sendToRelays(q, a))); - } - #groupFlatByRelay(filters: Array) { - const relayMerged = filters.reduce((acc, v) => { - const relay = v.relay ?? ""; - // delete relay from filter - delete v.relay; - const existing = acc.get(relay); - if (existing) { - existing.push(v); - } else { - acc.set(relay, [v]); - } - return acc; - }, new Map>()); - - const ret = []; - for (const [k, v] of relayMerged.entries()) { - const filters = this.#system.optimizer.flatMerge(v); - ret.push({ + const compressed = this.#system.optimizer.compress(filters).reduce( + (acc, v) => { + for (const r of v.relays ?? [""]) { + acc[r] ??= []; + acc[r].push(v); + } + return acc; + }, + {} as Record>, + ); + const qSend = Object.entries(compressed).map(([k, v]) => { + return { relay: k, - filters, - } as BuiltRawReqFilter); - } - return ret; + filters: v, + syncFrom, + } as BuiltRawReqFilter; + }); + await Promise.all(qSend.map(a => this.#sendToRelays(q, a))); } async #sendToRelays(q: Query, qSend: BuiltRawReqFilter) { diff --git a/packages/system/src/query.ts b/packages/system/src/query.ts index ce9004af..9ab506ea 100644 --- a/packages/system/src/query.ts +++ b/packages/system/src/query.ts @@ -424,7 +424,10 @@ export class Query extends EventEmitter { : this.#setupNewTrace(c, q); //always replace filters array - qt.filters = [...q.filters]; + qt.filters = q.filters.map(a => { + delete a["relays"]; + return a; + }); if (q.syncFrom !== undefined) { c.request(["SYNC", qt.id, q.syncFrom, ...qt.filters], () => qt.sentToRelay());