{"version":3,"sources":["match.ts"],"sourcesContent":["import { StorageSet } from \"../types/storage_set.ts\";\nimport { Type } from \"../types/type.ts\";\nimport type { Class } from \"./global_types.ts\";\nimport { MatchInput, MatchResult, MatchOptions, Storage } from \"../storage/storage.ts\";\nimport { StorageMap } from \"../types/storage-map.ts\";\n\nexport type { MatchInput, MatchOptions, MatchResult } from \"../storage/storage.ts\";\n\n/**\n * Returns all entries of a StorageSet that match the given match descriptor.\n * @param inputSet \n * @param match \n * @param limit \n * @returns \n */\nexport async function match<T extends object, Options extends MatchOptions>(inputSet: StorageSet<T>|StorageMap<unknown,T>, valueType:Class<T>|Type<T>, match: MatchInput<T>, options?: Options): Promise<MatchResult<T, Options>> {\n\toptions ??= {} as Options;\n\tconst found = new Set<T>();\n\tconst matchOrEntries = (match instanceof Array ? match : [match]).map(m => Object.entries(m)) as [keyof T, T[keyof T]][][];\n\t\n\tif (!(valueType instanceof Type)) valueType = Type.getClassDatexType(valueType);\n\n\t// match queries supported\n\tif (await Storage.supportsMatchQueries(valueType)) {\n\t\treturn Storage.itemMatchQuery(inputSet._prefix, valueType, match, options);\n\t}\n\n\t// fallback: match by iterating over all entries\n\t// TODO: implement full match query support\n\n\tfor await (const input of inputSet) {\n\t\t// ors\n\t\tfor (const matchOrs of matchOrEntries) {\n\t\t\tlet isMatch = true;\n\t\t\tfor (const [key, value] of matchOrs) {\n\t\t\t\tif (!_match(input[key], value)) {\n\t\t\t\t\tisMatch = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isMatch) found.add(input);\n\t\t\tif (found.size >= (options.limit??Infinity)) break;\n\t\t}\n\t\t\n\t}\n\treturn found as MatchResult<T, Options>;\n}\n\nfunction _match(value: unknown, match: unknown) {\n\tconst matchOrs = (match instanceof Array ? match : [match]);\n\n\tfor (const matchEntry of matchOrs) {\n\t\tlet isMatch = true;\n\t\t// nested object\n\t\tif (value && typeof value == \"object\") {\n\t\t\t// identical object\n\t\t\tif (value === matchEntry) isMatch = true;\n\t\t\t// nested match\n\t\t\telse if (matchEntry && typeof matchEntry === \"object\") {\n\t\t\t\tfor (const [key, val] of Object.entries(matchEntry)) {\n\t\t\t\t\t// an object entry does not match\n\t\t\t\t\tif (!_match((value as any)[key], val)) {\n\t\t\t\t\t\tisMatch = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse isMatch = false;\n\t\t}\n\t\t// primitive, other value\n\t\telse isMatch = value === matchEntry;\n\n\t\t// match?\n\t\tif (isMatch) return true;\n\t}\n\n\t// no match found\n\treturn false;\n}"],"names":["Type","Storage","match","inputSet","valueType","options","found","Set","matchOrEntries","Array","map","m","Object","entries","getClassDatexType","supportsMatchQueries","itemMatchQuery","_prefix","input","matchOrs","isMatch","key","value","_match","add","size","limit","Infinity","matchEntry","val"],"mappings":"AACA,SAASA,IAAI,QAAQ,mBAAmB;AAExC,SAAgDC,OAAO,QAAQ,wBAAwB;AAYvF,OAAO,eAAeC,MAAsDC,QAA6C,EAAEC,SAA0B,EAAEF,KAAoB,EAAEG,OAAiB;IAC7LA,YAAY,CAAC;IACb,IAAMC,QAAQ,IAAIC,OACZC,iBAAiB,AAACN,CAAAA,iBAAiBO,QAAQP,QAAQ;QAACA;KAAM,AAAD,EAAGQ,GAAG,CAACC,CAAAA,IAAKC,OAAOC,OAAO,CAACF;IAK1F,IAHMP,qBAAqBJ,QAAOI,CAAAA,YAAYJ,KAAKc,iBAAiB,CAACV,UAAS,GAG1E,MAAMH,QAAQc,oBAAoB,CAACX,YACtC,OAAOH,QAAQe,cAAc,CAACb,SAASc,OAAO,EAAEb,WAAWF,OAAOG;IAMnE,WAAW,IAAMa,SAASf,SAEzB,KAAK,IAAMgB,YAAYX,eAAgB;QACtC,IAAIY,UAAU,CAAA;QACd,KAAK,IAAM,CAACC,KAAKC,MAAM,IAAIH,SAC1B,IAAI,CAACI,OAAOL,KAAK,CAACG,IAAI,EAAEC,QAAQ;YAC/BF,UAAU,CAAA;YACV;QACD;QAGD,IADIA,WAASd,MAAMkB,GAAG,CAACN,QACnBZ,MAAMmB,IAAI,IAAKpB,CAAAA,QAAQqB,KAAK,IAAEC,KAAO,GAAI;IAC9C;IAGD,OAAOrB;AACR;AAEA,SAASiB,OAAOD,KAAc,EAAEpB,KAAc;IAG7C,KAAK,IAAM0B,cAFO1B,iBAAiBO,QAAQP,QAAQ;QAACA;KAAM,CAEvB;QAClC,IAAIkB,UAAU,CAAA;QAEd,IAAIE,SAAS,AAAgB,YAAhB,OAAOA;YAEnB,IAAIA,UAAUM,YAAYR,UAAU,CAAA;iBAE/B,IAAIQ,cAAc,AAAsB,YAAtB,OAAOA,YAC7B;gBAAA,KAAK,IAAM,CAACP,KAAKQ,IAAI,IAAIjB,OAAOC,OAAO,CAACe,YAEvC,IAAI,CAACL,OAAO,AAACD,KAAa,CAACD,IAAI,EAAEQ,MAAM;oBACtCT,UAAU,CAAA;oBACV;gBACD;YACD,OAEIA,UAAU,CAAA;eAGXA,UAAUE,UAAUM;QAGzB,IAAIR,SAAS,OAAO,CAAA;IACrB;IAGA,OAAO,CAAA;AACR","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/utils/","file":"match.ts"}