UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines • 3.41 kB
{"version":3,"file":"query-equivalence.cjs","sources":["../../../../src/query/compiler/query-equivalence.ts"],"sourcesContent":["import { deepEquals } from '../../utils.js'\nimport {\n UnhashableQueryIRError,\n getQueryIdentity,\n} from '../ir-stable-identity.js'\nimport type { From, QueryIR } from '../ir.js'\n\n/**\n * Compares query meaning while ignoring whether optional IR fields are omitted\n * or explicitly set to undefined by an optimizer copy.\n */\nexport function queriesMatchForCaching(a: QueryIR, b: QueryIR): boolean {\n if (!deepEquals(normalizeQuery(a), normalizeQuery(b))) return false\n try {\n return getQueryIdentity(a) === getQueryIdentity(b)\n } catch (error) {\n // Function-form queries may compile but have no stable identity. Recompile\n // conservatively rather than mistaking matching paths for matching scopes.\n if (error instanceof UnhashableQueryIRError) return false\n throw error\n }\n}\n\nfunction normalizeQuery(query: QueryIR): Record<string, unknown> {\n return {\n from: normalizeFrom(query.from),\n select: query.select,\n join: query.join?.map((join) => ({\n from: normalizeFrom(join.from),\n type: join.type,\n on: join.on,\n })),\n where: query.where,\n groupBy: query.groupBy,\n having: query.having,\n orderBy: query.orderBy,\n limit: query.limit,\n offset: query.offset,\n distinct: query.distinct,\n singleResult: query.singleResult,\n fnSelect: query.fnSelect,\n fnWhere: query.fnWhere,\n fnHaving: query.fnHaving,\n }\n}\n\nfunction normalizeFrom(from: From): Record<string, unknown> {\n switch (from.type) {\n case `collectionRef`:\n return {\n type: from.type,\n collection: from.collection,\n alias: from.alias,\n }\n case `queryRef`:\n return {\n type: from.type,\n query: normalizeQuery(from.query),\n alias: from.alias,\n }\n case `unionFrom`:\n return {\n type: from.type,\n sources: from.sources.map(normalizeFrom),\n }\n case `unionAll`:\n return {\n type: from.type,\n queries: from.queries.map(normalizeQuery),\n }\n }\n}\n"],"names":["deepEquals","getQueryIdentity","UnhashableQueryIRError"],"mappings":";;;;;AAWO,SAAS,uBAAuB,GAAY,GAAqB;AACtE,MAAI,CAACA,MAAAA,WAAW,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC,EAAG,QAAO;AAC9D,MAAI;AACF,WAAOC,kCAAiB,CAAC,MAAMA,iBAAAA,iBAAiB,CAAC;AAAA,EACnD,SAAS,OAAO;AAGd,QAAI,iBAAiBC,OAAAA,uBAAwB,QAAO;AACpD,UAAM;AAAA,EACR;AACF;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO;AAAA,IACL,MAAM,cAAc,MAAM,IAAI;AAAA,IAC9B,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,MAC/B,MAAM,cAAc,KAAK,IAAI;AAAA,MAC7B,MAAM,KAAK;AAAA,MACX,IAAI,KAAK;AAAA,IAAA,EACT;AAAA,IACF,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,IACpB,UAAU,MAAM;AAAA,IAChB,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,EAAA;AAEpB;AAEA,SAAS,cAAc,MAAqC;AAC1D,UAAQ,KAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,MAAA;AAAA,IAEhB,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,OAAO,eAAe,KAAK,KAAK;AAAA,QAChC,OAAO,KAAK;AAAA,MAAA;AAAA,IAEhB,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,SAAS,KAAK,QAAQ,IAAI,aAAa;AAAA,MAAA;AAAA,IAE3C,KAAK;AACH,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,SAAS,KAAK,QAAQ,IAAI,cAAc;AAAA,MAAA;AAAA,EAC1C;AAEN;;"}