@thisisagile/easy-mongo 15.9.2 → 15.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,7 +47,7 @@ class AtlasSearchGateway extends import_MongoGateway.MongoGateway {
47
47
  this.aggregate(
48
48
  searchMeta(query, this.searchDef),
49
49
  replaceWith({
50
- total: "$count.lowerBound",
50
+ total: "$count.total",
51
51
  facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {})
52
52
  })
53
53
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AtlasSearchGateway.ts"],"sourcesContent":["import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\n\nconst { skip, take } = stages.skip;\nconst { replaceWith } = stages.replaceWith;\nconst { searchWithDef, searchMeta, facets } = lucene;\n\ntype FacetResult = { _id: string; count: number };\ntype Value = { label: string; value: string; count: number };\nexport const toFilters = (facets: unknown): Filter[] =>\n entries(facets as Record<string, unknown>).map(([k, fs]) => ({\n label: text(k).title.toString(),\n field: k,\n values: (fs as []).map((f: FacetResult) => toValue(f)),\n }));\n\nconst toValue = (f: FacetResult): Value => ({ label: f._id ?? 'unknown', value: f._id ?? 'unknown', count: f.count });\n\nexport class AtlasSearchGateway extends MongoGateway {\n constructor(\n collection: Collection,\n readonly searchDef: SearchDefinition,\n readonly sortDef: Record<string, Record<string, 1 | -1>> = {},\n provider: MongoProvider = collection.provider\n ) {\n super(collection, provider);\n }\n\n query (query: Record<keyof typeof this.searchDef, string | number>): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: (query?.skip as number) ?? 0 }), take({ take: (query?.take as number) ?? 250 })),\n this.aggregate(\n searchMeta(query, this.searchDef),\n replaceWith({\n total: '$count.lowerBound',\n facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),\n })\n )\n )\n .then(([data, meta]) => ({ data, meta: meta.first() as any }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: meta?.total ?? 0,\n skip: (query?.skip as number) ?? 0,\n take: (query?.take as number) ?? 250,\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,0BAA6B;AAG7B,oBAAyC;AACzC,kBAA0E;AAE1E,MAAM,EAAE,MAAM,KAAK,IAAI,qBAAO;AAC9B,MAAM,EAAE,YAAY,IAAI,qBAAO;AAC/B,MAAM,EAAE,eAAe,YAAY,OAAO,IAAI;AAIvC,MAAM,YAAY,CAACA,gBACxB,qBAAQA,OAAiC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EAC3D,WAAO,kBAAK,CAAC,EAAE,MAAM,SAAS;AAAA,EAC9B,OAAO;AAAA,EACP,QAAS,GAAU,IAAI,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvD,EAAE;AAEJ,MAAM,UAAU,CAAC,OAA2B,EAAE,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,MAAM;AAE5G,MAAM,2BAA2B,iCAAa;AAAA,EACnD,YACE,YACS,WACA,UAAkD,CAAC,GAC5D,WAA0B,WAAW,UACrC;AACA,UAAM,YAAY,QAAQ;AAJjB;AACA;AAAA,EAIX;AAAA,EAEA,MAAO,OAAsF;AAC3F,eAAO;AAAA,MACL,KAAK,UAAU,cAAc,OAAO,KAAK,SAAS,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,EAAE,CAAC,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,IAAI,CAAC,CAAC;AAAA,MACjJ,KAAK;AAAA,QACH,WAAW,OAAO,KAAK,SAAS;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,UACP,QAAQ,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAAA,QAC7G,CAAC;AAAA,MACH;AAAA,IACF,EACG,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM,EAAS,EAAE,EAC5D;AAAA,MAAK,CAAC,EAAE,MAAM,KAAK,UAClB,wBAAiB,MAAM;AAAA,QACrB,OAAO,MAAM,SAAS;AAAA,QACtB,MAAO,OAAO,QAAmB;AAAA,QACjC,MAAO,OAAO,QAAmB;AAAA,QACjC,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC/B,SAAS,UAAU,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;","names":["facets"]}
1
+ {"version":3,"sources":["../src/AtlasSearchGateway.ts"],"sourcesContent":["import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\n\nconst { skip, take } = stages.skip;\nconst { replaceWith } = stages.replaceWith;\nconst { searchWithDef, searchMeta, facets } = lucene;\n\ntype FacetResult = { _id: string; count: number };\ntype Value = { label: string; value: string; count: number };\nexport const toFilters = (facets: unknown): Filter[] =>\n entries(facets as Record<string, unknown>).map(([k, fs]) => ({\n label: text(k).title.toString(),\n field: k,\n values: (fs as []).map((f: FacetResult) => toValue(f)),\n }));\n\nconst toValue = (f: FacetResult): Value => ({ label: f._id ?? 'unknown', value: f._id ?? 'unknown', count: f.count });\n\nexport class AtlasSearchGateway extends MongoGateway {\n constructor(\n collection: Collection,\n readonly searchDef: SearchDefinition,\n readonly sortDef: Record<string, Record<string, 1 | -1>> = {},\n provider: MongoProvider = collection.provider\n ) {\n super(collection, provider);\n }\n\n query (query: Record<keyof typeof this.searchDef, string | number>): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: (query?.skip as number) ?? 0 }), take({ take: (query?.take as number) ?? 250 })),\n this.aggregate(\n searchMeta(query, this.searchDef),\n replaceWith({\n total: '$count.total',\n facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),\n })\n )\n )\n .then(([data, meta]) => ({ data, meta: meta.first() as any }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: meta?.total ?? 0,\n skip: (query?.skip as number) ?? 0,\n take: (query?.take as number) ?? 250,\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,0BAA6B;AAG7B,oBAAyC;AACzC,kBAA0E;AAE1E,MAAM,EAAE,MAAM,KAAK,IAAI,qBAAO;AAC9B,MAAM,EAAE,YAAY,IAAI,qBAAO;AAC/B,MAAM,EAAE,eAAe,YAAY,OAAO,IAAI;AAIvC,MAAM,YAAY,CAACA,gBACxB,qBAAQA,OAAiC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EAC3D,WAAO,kBAAK,CAAC,EAAE,MAAM,SAAS;AAAA,EAC9B,OAAO;AAAA,EACP,QAAS,GAAU,IAAI,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvD,EAAE;AAEJ,MAAM,UAAU,CAAC,OAA2B,EAAE,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,MAAM;AAE5G,MAAM,2BAA2B,iCAAa;AAAA,EACnD,YACE,YACS,WACA,UAAkD,CAAC,GAC5D,WAA0B,WAAW,UACrC;AACA,UAAM,YAAY,QAAQ;AAJjB;AACA;AAAA,EAIX;AAAA,EAEA,MAAO,OAAsF;AAC3F,eAAO;AAAA,MACL,KAAK,UAAU,cAAc,OAAO,KAAK,SAAS,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,EAAE,CAAC,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,IAAI,CAAC,CAAC;AAAA,MACjJ,KAAK;AAAA,QACH,WAAW,OAAO,KAAK,SAAS;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,UACP,QAAQ,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAAA,QAC7G,CAAC;AAAA,MACH;AAAA,IACF,EACG,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM,EAAS,EAAE,EAC5D;AAAA,MAAK,CAAC,EAAE,MAAM,KAAK,UAClB,wBAAiB,MAAM;AAAA,QACrB,OAAO,MAAM,SAAS;AAAA,QACtB,MAAO,OAAO,QAAmB;AAAA,QACjC,MAAO,OAAO,QAAmB;AAAA,QACjC,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC/B,SAAS,UAAU,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;","names":["facets"]}
@@ -23,7 +23,7 @@ class AtlasSearchGateway extends MongoGateway {
23
23
  this.aggregate(
24
24
  searchMeta(query, this.searchDef),
25
25
  replaceWith({
26
- total: "$count.lowerBound",
26
+ total: "$count.total",
27
27
  facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {})
28
28
  })
29
29
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AtlasSearchGateway.ts"],"sourcesContent":["import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\n\nconst { skip, take } = stages.skip;\nconst { replaceWith } = stages.replaceWith;\nconst { searchWithDef, searchMeta, facets } = lucene;\n\ntype FacetResult = { _id: string; count: number };\ntype Value = { label: string; value: string; count: number };\nexport const toFilters = (facets: unknown): Filter[] =>\n entries(facets as Record<string, unknown>).map(([k, fs]) => ({\n label: text(k).title.toString(),\n field: k,\n values: (fs as []).map((f: FacetResult) => toValue(f)),\n }));\n\nconst toValue = (f: FacetResult): Value => ({ label: f._id ?? 'unknown', value: f._id ?? 'unknown', count: f.count });\n\nexport class AtlasSearchGateway extends MongoGateway {\n constructor(\n collection: Collection,\n readonly searchDef: SearchDefinition,\n readonly sortDef: Record<string, Record<string, 1 | -1>> = {},\n provider: MongoProvider = collection.provider\n ) {\n super(collection, provider);\n }\n\n query (query: Record<keyof typeof this.searchDef, string | number>): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: (query?.skip as number) ?? 0 }), take({ take: (query?.take as number) ?? 250 })),\n this.aggregate(\n searchMeta(query, this.searchDef),\n replaceWith({\n total: '$count.lowerBound',\n facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),\n })\n )\n )\n .then(([data, meta]) => ({ data, meta: meta.first() as any }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: meta?.total ?? 0,\n skip: (query?.skip as number) ?? 0,\n take: (query?.take as number) ?? 250,\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAG7B,SAAS,cAAgC;AACzC,SAAS,SAAiC,MAAM,YAAY,cAAc;AAE1E,MAAM,EAAE,MAAM,KAAK,IAAI,OAAO;AAC9B,MAAM,EAAE,YAAY,IAAI,OAAO;AAC/B,MAAM,EAAE,eAAe,YAAY,OAAO,IAAI;AAIvC,MAAM,YAAY,CAACA,YACxB,QAAQA,OAAiC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EAC3D,OAAO,KAAK,CAAC,EAAE,MAAM,SAAS;AAAA,EAC9B,OAAO;AAAA,EACP,QAAS,GAAU,IAAI,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvD,EAAE;AAEJ,MAAM,UAAU,CAAC,OAA2B,EAAE,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,MAAM;AAE5G,MAAM,2BAA2B,aAAa;AAAA,EACnD,YACE,YACS,WACA,UAAkD,CAAC,GAC5D,WAA0B,WAAW,UACrC;AACA,UAAM,YAAY,QAAQ;AAJjB;AACA;AAAA,EAIX;AAAA,EAEA,MAAO,OAAsF;AAC3F,WAAO;AAAA,MACL,KAAK,UAAU,cAAc,OAAO,KAAK,SAAS,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,EAAE,CAAC,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,IAAI,CAAC,CAAC;AAAA,MACjJ,KAAK;AAAA,QACH,WAAW,OAAO,KAAK,SAAS;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,UACP,QAAQ,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAAA,QAC7G,CAAC;AAAA,MACH;AAAA,IACF,EACG,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM,EAAS,EAAE,EAC5D;AAAA,MAAK,CAAC,EAAE,MAAM,KAAK,MAClB,WAAiB,MAAM;AAAA,QACrB,OAAO,MAAM,SAAS;AAAA,QACtB,MAAO,OAAO,QAAmB;AAAA,QACjC,MAAO,OAAO,QAAmB;AAAA,QACjC,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC/B,SAAS,UAAU,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;","names":["facets"]}
1
+ {"version":3,"sources":["../src/AtlasSearchGateway.ts"],"sourcesContent":["import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\n\nconst { skip, take } = stages.skip;\nconst { replaceWith } = stages.replaceWith;\nconst { searchWithDef, searchMeta, facets } = lucene;\n\ntype FacetResult = { _id: string; count: number };\ntype Value = { label: string; value: string; count: number };\nexport const toFilters = (facets: unknown): Filter[] =>\n entries(facets as Record<string, unknown>).map(([k, fs]) => ({\n label: text(k).title.toString(),\n field: k,\n values: (fs as []).map((f: FacetResult) => toValue(f)),\n }));\n\nconst toValue = (f: FacetResult): Value => ({ label: f._id ?? 'unknown', value: f._id ?? 'unknown', count: f.count });\n\nexport class AtlasSearchGateway extends MongoGateway {\n constructor(\n collection: Collection,\n readonly searchDef: SearchDefinition,\n readonly sortDef: Record<string, Record<string, 1 | -1>> = {},\n provider: MongoProvider = collection.provider\n ) {\n super(collection, provider);\n }\n\n query (query: Record<keyof typeof this.searchDef, string | number>): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: (query?.skip as number) ?? 0 }), take({ take: (query?.take as number) ?? 250 })),\n this.aggregate(\n searchMeta(query, this.searchDef),\n replaceWith({\n total: '$count.total',\n facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),\n })\n )\n )\n .then(([data, meta]) => ({ data, meta: meta.first() as any }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: meta?.total ?? 0,\n skip: (query?.skip as number) ?? 0,\n take: (query?.take as number) ?? 250,\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAG7B,SAAS,cAAgC;AACzC,SAAS,SAAiC,MAAM,YAAY,cAAc;AAE1E,MAAM,EAAE,MAAM,KAAK,IAAI,OAAO;AAC9B,MAAM,EAAE,YAAY,IAAI,OAAO;AAC/B,MAAM,EAAE,eAAe,YAAY,OAAO,IAAI;AAIvC,MAAM,YAAY,CAACA,YACxB,QAAQA,OAAiC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EAC3D,OAAO,KAAK,CAAC,EAAE,MAAM,SAAS;AAAA,EAC9B,OAAO;AAAA,EACP,QAAS,GAAU,IAAI,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvD,EAAE;AAEJ,MAAM,UAAU,CAAC,OAA2B,EAAE,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,MAAM;AAE5G,MAAM,2BAA2B,aAAa;AAAA,EACnD,YACE,YACS,WACA,UAAkD,CAAC,GAC5D,WAA0B,WAAW,UACrC;AACA,UAAM,YAAY,QAAQ;AAJjB;AACA;AAAA,EAIX;AAAA,EAEA,MAAO,OAAsF;AAC3F,WAAO;AAAA,MACL,KAAK,UAAU,cAAc,OAAO,KAAK,SAAS,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,EAAE,CAAC,GAAG,KAAK,EAAE,MAAO,OAAO,QAAmB,IAAI,CAAC,CAAC;AAAA,MACjJ,KAAK;AAAA,QACH,WAAW,OAAO,KAAK,SAAS;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,UACP,QAAQ,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAAA,QAC7G,CAAC;AAAA,MACH;AAAA,IACF,EACG,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM,EAAS,EAAE,EAC5D;AAAA,MAAK,CAAC,EAAE,MAAM,KAAK,MAClB,WAAiB,MAAM;AAAA,QACrB,OAAO,MAAM,SAAS;AAAA,QACtB,MAAO,OAAO,QAAmB;AAAA,QACjC,MAAO,OAAO,QAAmB;AAAA,QACjC,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC/B,SAAS,UAAU,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;","names":["facets"]}
package/dist/Lucene.d.ts CHANGED
@@ -45,15 +45,21 @@ export declare const lucene: {
45
45
  index?: string | undefined;
46
46
  };
47
47
  };
48
- searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, index?: string) => {
48
+ searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count?: 'total' | 'lowerBound', index?: string) => {
49
49
  $search: {
50
+ count: {
51
+ type: "total" | "lowerBound";
52
+ };
50
53
  sort?: Record<string, 1 | -1> | undefined;
51
54
  compound: Partial<Compound>;
52
55
  index?: string | undefined;
53
56
  };
54
57
  };
55
- searchMeta: (query: Record<string, string | number>, def: SearchDefinition, index?: string) => {
58
+ searchMeta: (query: Record<string, string | number>, def: SearchDefinition, count?: 'total' | 'lowerBound', index?: string) => {
56
59
  $searchMeta: {
60
+ count: {
61
+ type: "total" | "lowerBound";
62
+ };
57
63
  facet: {
58
64
  operator: {
59
65
  compound: Partial<Compound>;
@@ -65,6 +71,9 @@ export declare const lucene: {
65
71
  compound?: undefined;
66
72
  index?: string | undefined;
67
73
  } | {
74
+ count: {
75
+ type: "total" | "lowerBound";
76
+ };
68
77
  compound: Partial<Compound>;
69
78
  facet?: undefined;
70
79
  index?: string | undefined;
package/dist/Lucene.js CHANGED
@@ -44,13 +44,13 @@ const lucene = {
44
44
  compound: (0, import_easy.entries)(c).reduce((res, [k, v]) => (0, import_easy.on)(res, (r) => r[k] = lucene.clauses(v)), {})
45
45
  }
46
46
  }),
47
- searchWithDef: (query, options, index) => {
47
+ searchWithDef: (query, options, count = "total", index) => {
48
48
  const sort = (0, import_easy.entries)(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
49
49
  return {
50
- $search: { ...(0, import_easy.ifDefined)(index, { index }), compound: compound(query, options), ...(0, import_easy.ifDefined)(sort, { sort }) }
50
+ $search: { ...(0, import_easy.ifDefined)(index, { index }), compound: compound(query, options), ...(0, import_easy.ifDefined)(sort, { sort }), count: { type: count } }
51
51
  };
52
52
  },
53
- searchMeta: (query, def, index) => ({
53
+ searchMeta: (query, def, count = "total", index) => ({
54
54
  $searchMeta: {
55
55
  ...(0, import_easy.ifDefined)(index, { index }),
56
56
  ...(0, import_easy.ifTrue)(
@@ -64,7 +64,8 @@ const lucene = {
64
64
  }
65
65
  },
66
66
  { compound: compound(query, def) }
67
- )
67
+ ),
68
+ count: { type: count }
68
69
  }
69
70
  }),
70
71
  exists: () => (path) => ({ exists: { path } }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n ifTrue,\n isDefined,\n isEmptyObject,\n isFunction,\n List,\n on,\n OneOrMore,\n Optional,\n RequireAtLeastOne,\n toArray,\n toList,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\ntype FuzzyOptions = {\n maxEdits: number;\n prefixLength: number;\n maxExpansions: number;\n};\n\nexport type Facet =\n | { path: string; type: 'string'; numBuckets: number }\n | { path: string; type: 'number'; boundaries: number[]; default?: string }\n | { path: string; type: 'date'; boundaries: Date[]; default?: string };\n\nexport type Operator = Func<Optional<object>, string>;\nexport type Clause = object | Operator;\nexport type Clauses = Record<string, Clause>;\nexport type SearchDefinition = Record<\n string,\n (\n v: string | number\n ) => RequireAtLeastOne<{ should?: Clauses; filter?: Clauses; must?: Clauses; mustNot?: Clauses; sort?: Record<string, 1 | -1>; facet?: Facet }>\n>;\n\ntype Compound = {\n must: OneOrMore<Clauses>;\n should: OneOrMore<Clauses>;\n mustNot: OneOrMore<Clauses>;\n filter: OneOrMore<Clauses>;\n};\n\nconst should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);\n\nconst compound = (query: Record<string, string | number>, def: SearchDefinition): Partial<Compound> =>\n entries({\n should: ifNotEmpty(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [\n { wildcard: lucene.wildcard() },\n ]),\n ...ifNotEmpty(filter(query, def), f => ({ filter: f })),\n ...ifNotEmpty(mustNot(query, def), m => ({ mustNot: m })),\n ...ifNotEmpty(must(query, def), m => ({ must: m })),\n }).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any);\n\nexport const lucene = {\n clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),\n clauses: (cs: OneOrMore<Clauses>) => toArray(cs).flatMap(c => lucene.clause(c)),\n search: (c: Partial<Compound>, index?: string) => ({\n $search: {\n ...ifDefined(index, { index }),\n compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),\n },\n }),\n searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, index?: string) => {\n const sort = entries(query)\n .mapDefined(([k, v]) => options[k]?.(v)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }) },\n };\n },\n searchMeta: (query: Record<string, string | number>, def: SearchDefinition, index?: string) => ({\n $searchMeta: {\n ...ifDefined(index, { index }),\n ...ifTrue(\n !isEmptyObject(lucene.facets(def)),\n {\n facet: {\n operator: {\n compound: compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: compound(query, def) }\n ),\n },\n }),\n exists: (): Operator => (path: string) => ({ exists: { path } }),\n text:\n (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>): Operator =>\n (path: string) =>\n ifDefined(value, v => ({\n text: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: v,\n ...ifDefined(fuzzy, { fuzzy }),\n },\n })),\n wildcard:\n (value?: OneOrMore<unknown>, allowAnalyzedField = true): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\n allowAnalyzedField\n },\n }),\n lt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lt => ({ range: { path, lt } })),\n lte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lte => ({ range: { path, lte } })),\n gt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gt => ({ range: { path, gt } })),\n gte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gte => ({ range: { path, gte } })),\n after: (date: unknown): Operator => lucene.gte(toMongoType(date)),\n before: (date: unknown): Operator => lucene.lt(toMongoType(date)),\n between:\n (after: unknown, before: unknown): Operator =>\n (path: string) => ({\n range: {\n path,\n gte: toMongoType(after),\n lt: toMongoType(before),\n },\n }),\n facets: (def: SearchDefinition) =>\n entries(def)\n .filter(([k, v]) => isDefined(v(k)?.facet))\n .map(([k, v]) => ({ [k]: v(k)?.facet }))\n .reduce((acc, v) => ({ ...acc, ...v }), {}),\n facet: {\n string: (path: string, numBuckets = 1000): Facet => ({\n type: 'string',\n path,\n numBuckets,\n }),\n number: (path: string, boundaries: List<number>, alt?: string): Facet => ({\n type: 'number',\n path,\n boundaries,\n ...ifDefined(alt, a => ({ default: a })),\n }),\n date: (path: string, boundaries: List<DateTime>, alt?: string): Facet => ({\n type: 'date',\n path,\n boundaries: boundaries.mapDefined(b => b.toDate()),\n ...ifDefined(alt, a => ({ default: a })),\n }),\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n ifTrue,\n isDefined,\n isEmptyObject,\n isFunction,\n List,\n on,\n OneOrMore,\n Optional,\n RequireAtLeastOne,\n toArray,\n toList,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\ntype FuzzyOptions = {\n maxEdits: number;\n prefixLength: number;\n maxExpansions: number;\n};\n\nexport type Facet =\n | { path: string; type: 'string'; numBuckets: number }\n | { path: string; type: 'number'; boundaries: number[]; default?: string }\n | { path: string; type: 'date'; boundaries: Date[]; default?: string };\n\nexport type Operator = Func<Optional<object>, string>;\nexport type Clause = object | Operator;\nexport type Clauses = Record<string, Clause>;\nexport type SearchDefinition = Record<\n string,\n (\n v: string | number\n ) => RequireAtLeastOne<{ should?: Clauses; filter?: Clauses; must?: Clauses; mustNot?: Clauses; sort?: Record<string, 1 | -1>; facet?: Facet }>\n>;\n\ntype Compound = {\n must: OneOrMore<Clauses>;\n should: OneOrMore<Clauses>;\n mustNot: OneOrMore<Clauses>;\n filter: OneOrMore<Clauses>;\n};\n\nconst should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);\n\nconst compound = (query: Record<string, string | number>, def: SearchDefinition): Partial<Compound> =>\n entries({\n should: ifNotEmpty(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [\n { wildcard: lucene.wildcard() },\n ]),\n ...ifNotEmpty(filter(query, def), f => ({ filter: f })),\n ...ifNotEmpty(mustNot(query, def), m => ({ mustNot: m })),\n ...ifNotEmpty(must(query, def), m => ({ must: m })),\n }).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any);\n\nexport const lucene = {\n clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),\n clauses: (cs: OneOrMore<Clauses>) => toArray(cs).flatMap(c => lucene.clause(c)),\n search: (c: Partial<Compound>, index?: string) => ({\n $search: {\n ...ifDefined(index, { index }),\n compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),\n },\n }),\n searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => {\n const sort = entries(query)\n .mapDefined(([k, v]) => options[k]?.(v)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } },\n };\n },\n searchMeta: (query: Record<string, string | number>, def: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => ({\n $searchMeta: {\n ...ifDefined(index, { index }),\n ...ifTrue(\n !isEmptyObject(lucene.facets(def)),\n {\n facet: {\n operator: {\n compound: compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: compound(query, def) }\n ),\n count: { type: count }\n },\n }),\n exists: (): Operator => (path: string) => ({ exists: { path } }),\n text:\n (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>): Operator =>\n (path: string) =>\n ifDefined(value, v => ({\n text: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: v,\n ...ifDefined(fuzzy, { fuzzy }),\n },\n })),\n wildcard:\n (value?: OneOrMore<unknown>, allowAnalyzedField = true): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\n allowAnalyzedField,\n },\n }),\n lt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lt => ({ range: { path, lt } })),\n lte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lte => ({ range: { path, lte } })),\n gt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gt => ({ range: { path, gt } })),\n gte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gte => ({ range: { path, gte } })),\n after: (date: unknown): Operator => lucene.gte(toMongoType(date)),\n before: (date: unknown): Operator => lucene.lt(toMongoType(date)),\n between:\n (after: unknown, before: unknown): Operator =>\n (path: string) => ({\n range: {\n path,\n gte: toMongoType(after),\n lt: toMongoType(before),\n },\n }),\n facets: (def: SearchDefinition) =>\n entries(def)\n .filter(([k, v]) => isDefined(v(k)?.facet))\n .map(([k, v]) => ({ [k]: v(k)?.facet }))\n .reduce((acc, v) => ({ ...acc, ...v }), {}),\n facet: {\n string: (path: string, numBuckets = 1000): Facet => ({\n type: 'string',\n path,\n numBuckets,\n }),\n number: (path: string, boundaries: List<number>, alt?: string): Facet => ({\n type: 'number',\n path,\n boundaries,\n ...ifDefined(alt, a => ({ default: a })),\n }),\n date: (path: string, boundaries: List<DateTime>, alt?: string): Facet => ({\n type: 'date',\n path,\n boundaries: boundaries.mapDefined(b => b.toDate()),\n ...ifDefined(alt, a => ({ default: a })),\n }),\n },\n};\n"],"mappings":"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","names":[]}
package/dist/Lucene.mjs CHANGED
@@ -32,13 +32,13 @@ const lucene = {
32
32
  compound: entries(c).reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), {})
33
33
  }
34
34
  }),
35
- searchWithDef: (query, options, index) => {
35
+ searchWithDef: (query, options, count = "total", index) => {
36
36
  const sort = entries(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
37
37
  return {
38
- $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }) }
38
+ $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } }
39
39
  };
40
40
  },
41
- searchMeta: (query, def, index) => ({
41
+ searchMeta: (query, def, count = "total", index) => ({
42
42
  $searchMeta: {
43
43
  ...ifDefined(index, { index }),
44
44
  ...ifTrue(
@@ -52,7 +52,8 @@ const lucene = {
52
52
  }
53
53
  },
54
54
  { compound: compound(query, def) }
55
- )
55
+ ),
56
+ count: { type: count }
56
57
  }
57
58
  }),
58
59
  exists: () => (path) => ({ exists: { path } }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n ifTrue,\n isDefined,\n isEmptyObject,\n isFunction,\n List,\n on,\n OneOrMore,\n Optional,\n RequireAtLeastOne,\n toArray,\n toList,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\ntype FuzzyOptions = {\n maxEdits: number;\n prefixLength: number;\n maxExpansions: number;\n};\n\nexport type Facet =\n | { path: string; type: 'string'; numBuckets: number }\n | { path: string; type: 'number'; boundaries: number[]; default?: string }\n | { path: string; type: 'date'; boundaries: Date[]; default?: string };\n\nexport type Operator = Func<Optional<object>, string>;\nexport type Clause = object | Operator;\nexport type Clauses = Record<string, Clause>;\nexport type SearchDefinition = Record<\n string,\n (\n v: string | number\n ) => RequireAtLeastOne<{ should?: Clauses; filter?: Clauses; must?: Clauses; mustNot?: Clauses; sort?: Record<string, 1 | -1>; facet?: Facet }>\n>;\n\ntype Compound = {\n must: OneOrMore<Clauses>;\n should: OneOrMore<Clauses>;\n mustNot: OneOrMore<Clauses>;\n filter: OneOrMore<Clauses>;\n};\n\nconst should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);\n\nconst compound = (query: Record<string, string | number>, def: SearchDefinition): Partial<Compound> =>\n entries({\n should: ifNotEmpty(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [\n { wildcard: lucene.wildcard() },\n ]),\n ...ifNotEmpty(filter(query, def), f => ({ filter: f })),\n ...ifNotEmpty(mustNot(query, def), m => ({ mustNot: m })),\n ...ifNotEmpty(must(query, def), m => ({ must: m })),\n }).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any);\n\nexport const lucene = {\n clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),\n clauses: (cs: OneOrMore<Clauses>) => toArray(cs).flatMap(c => lucene.clause(c)),\n search: (c: Partial<Compound>, index?: string) => ({\n $search: {\n ...ifDefined(index, { index }),\n compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),\n },\n }),\n searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, index?: string) => {\n const sort = entries(query)\n .mapDefined(([k, v]) => options[k]?.(v)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }) },\n };\n },\n searchMeta: (query: Record<string, string | number>, def: SearchDefinition, index?: string) => ({\n $searchMeta: {\n ...ifDefined(index, { index }),\n ...ifTrue(\n !isEmptyObject(lucene.facets(def)),\n {\n facet: {\n operator: {\n compound: compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: compound(query, def) }\n ),\n },\n }),\n exists: (): Operator => (path: string) => ({ exists: { path } }),\n text:\n (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>): Operator =>\n (path: string) =>\n ifDefined(value, v => ({\n text: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: v,\n ...ifDefined(fuzzy, { fuzzy }),\n },\n })),\n wildcard:\n (value?: OneOrMore<unknown>, allowAnalyzedField = true): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\n allowAnalyzedField\n },\n }),\n lt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lt => ({ range: { path, lt } })),\n lte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lte => ({ range: { path, lte } })),\n gt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gt => ({ range: { path, gt } })),\n gte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gte => ({ range: { path, gte } })),\n after: (date: unknown): Operator => lucene.gte(toMongoType(date)),\n before: (date: unknown): Operator => lucene.lt(toMongoType(date)),\n between:\n (after: unknown, before: unknown): Operator =>\n (path: string) => ({\n range: {\n path,\n gte: toMongoType(after),\n lt: toMongoType(before),\n },\n }),\n facets: (def: SearchDefinition) =>\n entries(def)\n .filter(([k, v]) => isDefined(v(k)?.facet))\n .map(([k, v]) => ({ [k]: v(k)?.facet }))\n .reduce((acc, v) => ({ ...acc, ...v }), {}),\n facet: {\n string: (path: string, numBuckets = 1000): Facet => ({\n type: 'string',\n path,\n numBuckets,\n }),\n number: (path: string, boundaries: List<number>, alt?: string): Facet => ({\n type: 'number',\n path,\n boundaries,\n ...ifDefined(alt, a => ({ default: a })),\n }),\n date: (path: string, boundaries: List<DateTime>, alt?: string): Facet => ({\n type: 'date',\n path,\n boundaries: boundaries.mapDefined(b => b.toDate()),\n ...ifDefined(alt, a => ({ default: a })),\n }),\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n ifTrue,\n isDefined,\n isEmptyObject,\n isFunction,\n List,\n on,\n OneOrMore,\n Optional,\n RequireAtLeastOne,\n toArray,\n toList,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\ntype FuzzyOptions = {\n maxEdits: number;\n prefixLength: number;\n maxExpansions: number;\n};\n\nexport type Facet =\n | { path: string; type: 'string'; numBuckets: number }\n | { path: string; type: 'number'; boundaries: number[]; default?: string }\n | { path: string; type: 'date'; boundaries: Date[]; default?: string };\n\nexport type Operator = Func<Optional<object>, string>;\nexport type Clause = object | Operator;\nexport type Clauses = Record<string, Clause>;\nexport type SearchDefinition = Record<\n string,\n (\n v: string | number\n ) => RequireAtLeastOne<{ should?: Clauses; filter?: Clauses; must?: Clauses; mustNot?: Clauses; sort?: Record<string, 1 | -1>; facet?: Facet }>\n>;\n\ntype Compound = {\n must: OneOrMore<Clauses>;\n should: OneOrMore<Clauses>;\n mustNot: OneOrMore<Clauses>;\n filter: OneOrMore<Clauses>;\n};\n\nconst should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);\n\nconst compound = (query: Record<string, string | number>, def: SearchDefinition): Partial<Compound> =>\n entries({\n should: ifNotEmpty(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [\n { wildcard: lucene.wildcard() },\n ]),\n ...ifNotEmpty(filter(query, def), f => ({ filter: f })),\n ...ifNotEmpty(mustNot(query, def), m => ({ mustNot: m })),\n ...ifNotEmpty(must(query, def), m => ({ must: m })),\n }).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any);\n\nexport const lucene = {\n clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),\n clauses: (cs: OneOrMore<Clauses>) => toArray(cs).flatMap(c => lucene.clause(c)),\n search: (c: Partial<Compound>, index?: string) => ({\n $search: {\n ...ifDefined(index, { index }),\n compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),\n },\n }),\n searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => {\n const sort = entries(query)\n .mapDefined(([k, v]) => options[k]?.(v)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } },\n };\n },\n searchMeta: (query: Record<string, string | number>, def: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => ({\n $searchMeta: {\n ...ifDefined(index, { index }),\n ...ifTrue(\n !isEmptyObject(lucene.facets(def)),\n {\n facet: {\n operator: {\n compound: compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: compound(query, def) }\n ),\n count: { type: count }\n },\n }),\n exists: (): Operator => (path: string) => ({ exists: { path } }),\n text:\n (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>): Operator =>\n (path: string) =>\n ifDefined(value, v => ({\n text: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: v,\n ...ifDefined(fuzzy, { fuzzy }),\n },\n })),\n wildcard:\n (value?: OneOrMore<unknown>, allowAnalyzedField = true): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\n allowAnalyzedField,\n },\n }),\n lt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lt => ({ range: { path, lt } })),\n lte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lte => ({ range: { path, lte } })),\n gt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gt => ({ range: { path, gt } })),\n gte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gte => ({ range: { path, gte } })),\n after: (date: unknown): Operator => lucene.gte(toMongoType(date)),\n before: (date: unknown): Operator => lucene.lt(toMongoType(date)),\n between:\n (after: unknown, before: unknown): Operator =>\n (path: string) => ({\n range: {\n path,\n gte: toMongoType(after),\n lt: toMongoType(before),\n },\n }),\n facets: (def: SearchDefinition) =>\n entries(def)\n .filter(([k, v]) => isDefined(v(k)?.facet))\n .map(([k, v]) => ({ [k]: v(k)?.facet }))\n .reduce((acc, v) => ({ ...acc, ...v }), {}),\n facet: {\n string: (path: string, numBuckets = 1000): Facet => ({\n type: 'string',\n path,\n numBuckets,\n }),\n number: (path: string, boundaries: List<number>, alt?: string): Facet => ({\n type: 'number',\n path,\n boundaries,\n ...ifDefined(alt, a => ({ default: a })),\n }),\n date: (path: string, boundaries: List<DateTime>, alt?: string): Facet => ({\n type: 'date',\n path,\n boundaries: boundaries.mapDefined(b => b.toDate()),\n ...ifDefined(alt, a => ({ default: a })),\n }),\n },\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-mongo",
3
- "version": "15.9.2",
3
+ "version": "15.9.4",
4
4
  "description": "Add support for MongoDB",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -33,10 +33,10 @@
33
33
  "access": "public"
34
34
  },
35
35
  "devDependencies": {
36
- "@thisisagile/easy-test": "15.9.2"
36
+ "@thisisagile/easy-test": "15.9.4"
37
37
  },
38
38
  "dependencies": {
39
- "@thisisagile/easy": "^15.9.2",
39
+ "@thisisagile/easy": "^15.9.4",
40
40
  "mongodb": "^5.6.0"
41
41
  }
42
42
  }
@@ -36,7 +36,7 @@ export class AtlasSearchGateway extends MongoGateway {
36
36
  this.aggregate(
37
37
  searchMeta(query, this.searchDef),
38
38
  replaceWith({
39
- total: '$count.lowerBound',
39
+ total: '$count.total',
40
40
  facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),
41
41
  })
42
42
  )
package/src/Lucene.ts CHANGED
@@ -70,15 +70,15 @@ export const lucene = {
70
70
  compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),
71
71
  },
72
72
  }),
73
- searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, index?: string) => {
73
+ searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => {
74
74
  const sort = entries(query)
75
75
  .mapDefined(([k, v]) => options[k]?.(v)?.sort)
76
76
  .first();
77
77
  return {
78
- $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }) },
78
+ $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } },
79
79
  };
80
80
  },
81
- searchMeta: (query: Record<string, string | number>, def: SearchDefinition, index?: string) => ({
81
+ searchMeta: (query: Record<string, string | number>, def: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => ({
82
82
  $searchMeta: {
83
83
  ...ifDefined(index, { index }),
84
84
  ...ifTrue(
@@ -93,6 +93,7 @@ export const lucene = {
93
93
  },
94
94
  { compound: compound(query, def) }
95
95
  ),
96
+ count: { type: count }
96
97
  },
97
98
  }),
98
99
  exists: (): Operator => (path: string) => ({ exists: { path } }),
@@ -112,7 +113,7 @@ export const lucene = {
112
113
  wildcard: {
113
114
  path: path === 'wildcard' ? { wildcard: '*' } : path,
114
115
  query: ifDefined(value, value, '*'),
115
- allowAnalyzedField
116
+ allowAnalyzedField,
116
117
  },
117
118
  }),
118
119
  lt: