@thisisagile/easy-mongo 15.8.6 → 15.8.7

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.
Files changed (42) hide show
  1. package/dist/AtlasSearchGateway.d.ts +12 -0
  2. package/dist/AtlasSearchGateway.js +70 -0
  3. package/dist/AtlasSearchGateway.js.map +1 -0
  4. package/dist/AtlasSearchGateway.mjs +45 -0
  5. package/dist/AtlasSearchGateway.mjs.map +1 -0
  6. package/dist/Collection.d.ts +27 -0
  7. package/dist/Collection.js +65 -0
  8. package/dist/Collection.js.map +1 -0
  9. package/dist/Collection.mjs +51 -0
  10. package/dist/Collection.mjs.map +1 -0
  11. package/dist/Lucene.d.ts +87 -0
  12. package/dist/Lucene.js +116 -0
  13. package/dist/Lucene.js.map +1 -0
  14. package/dist/Lucene.mjs +101 -0
  15. package/dist/Lucene.mjs.map +1 -0
  16. package/dist/MongoGateway.d.ts +22 -0
  17. package/dist/MongoGateway.js +78 -0
  18. package/dist/MongoGateway.js.map +1 -0
  19. package/dist/MongoGateway.mjs +60 -0
  20. package/dist/MongoGateway.mjs.map +1 -0
  21. package/dist/MongoProvider.d.ts +51 -0
  22. package/dist/MongoProvider.js +132 -0
  23. package/dist/MongoProvider.js.map +1 -0
  24. package/dist/MongoProvider.mjs +128 -0
  25. package/dist/MongoProvider.mjs.map +1 -0
  26. package/dist/Stages.d.ts +167 -0
  27. package/dist/Stages.js +148 -0
  28. package/dist/Stages.js.map +1 -0
  29. package/dist/Stages.mjs +132 -0
  30. package/dist/Stages.mjs.map +1 -0
  31. package/dist/Utils.d.ts +2 -0
  32. package/dist/Utils.js +35 -0
  33. package/dist/Utils.js.map +1 -0
  34. package/dist/Utils.mjs +20 -0
  35. package/dist/Utils.mjs.map +1 -0
  36. package/dist/index.d.ts +7 -361
  37. package/dist/index.js +35 -1
  38. package/dist/index.js.map +1 -0
  39. package/dist/index.mjs +8 -1
  40. package/dist/index.mjs.map +1 -0
  41. package/package.json +4 -4
  42. package/dist/index.d.mts +0 -361
@@ -0,0 +1,12 @@
1
+ import { MongoGateway } from './MongoGateway';
2
+ import { Collection } from './Collection';
3
+ import { MongoProvider } from './MongoProvider';
4
+ import { SearchDefinition } from './Lucene';
5
+ import { Filter, Json, PageList } from '@thisisagile/easy';
6
+ export declare const toFilters: (facets: unknown) => Filter[];
7
+ export declare class AtlasSearchGateway extends MongoGateway {
8
+ readonly searchDef: SearchDefinition;
9
+ readonly sortDef: Record<string, Record<string, 1 | -1>>;
10
+ constructor(collection: Collection, searchDef: SearchDefinition, sortDef?: Record<string, Record<string, 1 | -1>>, provider?: MongoProvider);
11
+ query: (query: Record<keyof typeof this.searchDef, string | number>) => Promise<PageList<Json>>;
12
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var AtlasSearchGateway_exports = {};
20
+ __export(AtlasSearchGateway_exports, {
21
+ AtlasSearchGateway: () => AtlasSearchGateway,
22
+ toFilters: () => toFilters
23
+ });
24
+ module.exports = __toCommonJS(AtlasSearchGateway_exports);
25
+ var import_Stages = require("./Stages");
26
+ var import_MongoGateway = require("./MongoGateway");
27
+ var import_Lucene = require("./Lucene");
28
+ var import_easy = require("@thisisagile/easy");
29
+ const { skip, take } = import_Stages.stages.skip;
30
+ const { replaceWith } = import_Stages.stages.replaceWith;
31
+ const { searchWithDef, searchMeta, facets } = import_Lucene.lucene;
32
+ const toFilters = (facets2) => (0, import_easy.entries)(facets2).map(([k, fs]) => ({
33
+ label: (0, import_easy.text)(k).title.toString(),
34
+ field: k,
35
+ values: fs.map((f) => toValue(f))
36
+ }));
37
+ const toValue = (f) => ({ label: f._id ?? "unknown", value: f._id ?? "unknown", count: f.count });
38
+ class AtlasSearchGateway extends import_MongoGateway.MongoGateway {
39
+ constructor(collection, searchDef, sortDef = {}, provider = collection.provider) {
40
+ super(collection, provider);
41
+ this.searchDef = searchDef;
42
+ this.sortDef = sortDef;
43
+ }
44
+ query = async (query) => {
45
+ return (0, import_easy.tuple2)(
46
+ this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: query?.skip ?? 0 }), take({ take: query?.take ?? 250 })),
47
+ this.aggregate(
48
+ searchMeta(query, this.searchDef),
49
+ replaceWith({
50
+ total: "$count.lowerBound",
51
+ facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {})
52
+ })
53
+ )
54
+ ).then(([data, meta]) => ({ data, meta: meta.first() })).then(
55
+ ({ data, meta }) => (0, import_easy.toPageList)(data, {
56
+ total: meta?.total ?? 0,
57
+ skip: query?.skip ?? 0,
58
+ take: query?.take ?? 250,
59
+ sorts: Object.keys(this.sortDef),
60
+ filters: toFilters(meta.facets)
61
+ })
62
+ );
63
+ };
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ AtlasSearchGateway,
68
+ toFilters
69
+ });
70
+ //# sourceMappingURL=AtlasSearchGateway.js.map
@@ -0,0 +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 = async (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,QAAQ,OAAO,UAAyF;AACtG,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"]}
@@ -0,0 +1,45 @@
1
+ import { stages } from "./Stages";
2
+ import { MongoGateway } from "./MongoGateway";
3
+ import { lucene } from "./Lucene";
4
+ import { entries, text, toPageList, tuple2 } from "@thisisagile/easy";
5
+ const { skip, take } = stages.skip;
6
+ const { replaceWith } = stages.replaceWith;
7
+ const { searchWithDef, searchMeta, facets } = lucene;
8
+ const toFilters = (facets2) => entries(facets2).map(([k, fs]) => ({
9
+ label: text(k).title.toString(),
10
+ field: k,
11
+ values: fs.map((f) => toValue(f))
12
+ }));
13
+ const toValue = (f) => ({ label: f._id ?? "unknown", value: f._id ?? "unknown", count: f.count });
14
+ class AtlasSearchGateway extends MongoGateway {
15
+ constructor(collection, searchDef, sortDef = {}, provider = collection.provider) {
16
+ super(collection, provider);
17
+ this.searchDef = searchDef;
18
+ this.sortDef = sortDef;
19
+ }
20
+ query = async (query) => {
21
+ return tuple2(
22
+ this.aggregate(searchWithDef(query, this.searchDef), skip({ skip: query?.skip ?? 0 }), take({ take: query?.take ?? 250 })),
23
+ this.aggregate(
24
+ searchMeta(query, this.searchDef),
25
+ replaceWith({
26
+ total: "$count.lowerBound",
27
+ facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {})
28
+ })
29
+ )
30
+ ).then(([data, meta]) => ({ data, meta: meta.first() })).then(
31
+ ({ data, meta }) => toPageList(data, {
32
+ total: meta?.total ?? 0,
33
+ skip: query?.skip ?? 0,
34
+ take: query?.take ?? 250,
35
+ sorts: Object.keys(this.sortDef),
36
+ filters: toFilters(meta.facets)
37
+ })
38
+ );
39
+ };
40
+ }
41
+ export {
42
+ AtlasSearchGateway,
43
+ toFilters
44
+ };
45
+ //# sourceMappingURL=AtlasSearchGateway.mjs.map
@@ -0,0 +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 = async (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,QAAQ,OAAO,UAAyF;AACtG,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"]}
@@ -0,0 +1,27 @@
1
+ import { Condition, Database, Field, Get, Json, LogicalCondition, MapOptions, Mapper, PropertyOptions, Sort, SortDirection, Text } from '@thisisagile/easy';
2
+ import { MongoProvider } from './MongoProvider';
3
+ export declare class Collection extends Mapper {
4
+ protected readonly map: {
5
+ field: <T = unknown>(name: string, options?: PropertyOptions<T> | undefined) => Field;
6
+ item: (property: string, options?: PropertyOptions | undefined) => import("@thisisagile/easy").Property<unknown>;
7
+ ignore: (property?: string | undefined) => import("@thisisagile/easy").Mapping;
8
+ skipIn: (property: string) => import("@thisisagile/easy").Mapping;
9
+ skipOut: (property: string) => import("@thisisagile/easy").Mapping;
10
+ func: (property: string, funcIn: Get<import("@thisisagile/easy").Optional<import("@thisisagile/easy").JsonValue>, Json>, funcOut: Get<import("@thisisagile/easy").Optional<import("@thisisagile/easy").JsonValue>, Json>) => import("@thisisagile/easy").Mapping;
11
+ add: (funcIn: Get<import("@thisisagile/easy").JsonValue, Json>) => import("@thisisagile/easy").Mapping;
12
+ map: (mapper: import("@thisisagile/easy").Construct<Mapper>, property?: string | undefined) => import("@thisisagile/easy").Mapping;
13
+ propsToList: (...maps: import("@thisisagile/easy").Mapping[]) => import("@thisisagile/easy").Mapping;
14
+ list: (mapper: import("@thisisagile/easy").Mapping, property: string) => import("@thisisagile/easy").Mapping;
15
+ };
16
+ readonly id: Field;
17
+ constructor(options?: MapOptions);
18
+ get db(): Database;
19
+ get provider(): MongoProvider;
20
+ where: (...conditions: Get<Condition, this>[]) => Json;
21
+ match: (condition: Get<Condition | LogicalCondition, this>) => Json;
22
+ group: (...conditions: Get<Condition, this>[]) => Json;
23
+ google: (value: unknown) => Condition;
24
+ search: (key: Text) => Field;
25
+ sort: (...conditions: Sort[]) => Record<string, SortDirection>;
26
+ out(to?: Json): Json;
27
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var Collection_exports = {};
20
+ __export(Collection_exports, {
21
+ Collection: () => Collection
22
+ });
23
+ module.exports = __toCommonJS(Collection_exports);
24
+ var import_easy = require("@thisisagile/easy");
25
+ var import_Utils = require("./Utils");
26
+ var import_MongoProvider = require("./MongoProvider");
27
+ class Collection extends import_easy.Mapper {
28
+ map = {
29
+ ...import_easy.mappings,
30
+ field: (name, options) => new import_easy.Field(name, options)
31
+ };
32
+ id = this.map.field("id", { dflt: import_easy.toUuid });
33
+ constructor(options = { startFrom: "source" }) {
34
+ super(options);
35
+ }
36
+ get db() {
37
+ return import_easy.Database.Default;
38
+ }
39
+ get provider() {
40
+ return new import_MongoProvider.MongoProvider(this);
41
+ }
42
+ where = (...conditions) => new import_easy.LogicalCondition(
43
+ "and",
44
+ conditions.map((c) => (0, import_easy.ofGet)(c, this))
45
+ ).toJSON();
46
+ match = (condition) => ({ $match: (0, import_easy.ofGet)(condition, this).toJSON() });
47
+ group = (...conditions) => new import_easy.LogicalCondition(
48
+ "group",
49
+ conditions.map((c) => (0, import_easy.ofGet)(c, this))
50
+ ).toJSON();
51
+ google = (value) => (0, import_easy.toCondition)("$text", "search", value);
52
+ search = (key) => this.map.field((0, import_easy.asString)(key));
53
+ sort = (...conditions) => conditions.reduce((cs, c) => {
54
+ cs[c.key] = c.value;
55
+ return cs;
56
+ }, {});
57
+ out(to = {}) {
58
+ return (0, import_Utils.toMongoType)(super.out(to));
59
+ }
60
+ }
61
+ // Annotate the CommonJS export names for ESM import in node:
62
+ 0 && (module.exports = {
63
+ Collection
64
+ });
65
+ //# sourceMappingURL=Collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Collection.ts"],"sourcesContent":["import {\n asString,\n Condition,\n Database,\n Field,\n Get,\n Json,\n LogicalCondition,\n MapOptions,\n Mapper,\n mappings,\n ofGet,\n PropertyOptions,\n Sort,\n SortDirection,\n Text,\n toCondition,\n toUuid,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\nimport { MongoProvider } from './MongoProvider';\n\nexport class Collection extends Mapper {\n protected readonly map = {\n ...mappings,\n field: <T = unknown>(name: string, options?: PropertyOptions<T>): Field => new Field(name, options),\n };\n readonly id = this.map.field('id', { dflt: toUuid });\n\n constructor(options: MapOptions = { startFrom: 'source' }) {\n super(options);\n }\n\n get db(): Database {\n return Database.Default;\n }\n\n get provider(): MongoProvider {\n return new MongoProvider(this);\n }\n\n where = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'and',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n match = (condition: Get<Condition | LogicalCondition, this>): Json => ({ $match: ofGet(condition, this).toJSON() });\n\n group = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'group',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n google = (value: unknown): Condition => toCondition('$text', 'search', value);\n\n search = (key: Text): Field => this.map.field(asString(key));\n\n sort = (...conditions: Sort[]): Record<string, SortDirection> =>\n conditions.reduce((cs: any, c) => {\n cs[c.key] = c.value;\n return cs;\n }, {});\n\n out(to: Json = {}): Json {\n return toMongoType(super.out(to));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAkBO;AACP,mBAA4B;AAC5B,2BAA8B;AAEvB,MAAM,mBAAmB,mBAAO;AAAA,EAClB,MAAM;AAAA,IACvB,GAAG;AAAA,IACH,OAAO,CAAc,MAAc,YAAwC,IAAI,kBAAM,MAAM,OAAO;AAAA,EACpG;AAAA,EACS,KAAK,KAAK,IAAI,MAAM,MAAM,EAAE,MAAM,mBAAO,CAAC;AAAA,EAEnD,YAAY,UAAsB,EAAE,WAAW,SAAS,GAAG;AACzD,UAAM,OAAO;AAAA,EACf;AAAA,EAEA,IAAI,KAAe;AACjB,WAAO,qBAAS;AAAA,EAClB;AAAA,EAEA,IAAI,WAA0B;AAC5B,WAAO,IAAI,mCAAc,IAAI;AAAA,EAC/B;AAAA,EAEA,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,WAAK,mBAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,QAAQ,CAAC,eAA8D,EAAE,YAAQ,mBAAM,WAAW,IAAI,EAAE,OAAO,EAAE;AAAA,EAEjH,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,WAAK,mBAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,SAAS,CAAC,cAA8B,yBAAY,SAAS,UAAU,KAAK;AAAA,EAE5E,SAAS,CAAC,QAAqB,KAAK,IAAI,UAAM,sBAAS,GAAG,CAAC;AAAA,EAE3D,OAAO,IAAI,eACT,WAAW,OAAO,CAAC,IAAS,MAAM;AAChC,OAAG,EAAE,GAAG,IAAI,EAAE;AACd,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAAA,EAEP,IAAI,KAAW,CAAC,GAAS;AACvB,eAAO,0BAAY,MAAM,IAAI,EAAE,CAAC;AAAA,EAClC;AACF;","names":[]}
@@ -0,0 +1,51 @@
1
+ import {
2
+ asString,
3
+ Database,
4
+ Field,
5
+ LogicalCondition,
6
+ Mapper,
7
+ mappings,
8
+ ofGet,
9
+ toCondition,
10
+ toUuid
11
+ } from "@thisisagile/easy";
12
+ import { toMongoType } from "./Utils";
13
+ import { MongoProvider } from "./MongoProvider";
14
+ class Collection extends Mapper {
15
+ map = {
16
+ ...mappings,
17
+ field: (name, options) => new Field(name, options)
18
+ };
19
+ id = this.map.field("id", { dflt: toUuid });
20
+ constructor(options = { startFrom: "source" }) {
21
+ super(options);
22
+ }
23
+ get db() {
24
+ return Database.Default;
25
+ }
26
+ get provider() {
27
+ return new MongoProvider(this);
28
+ }
29
+ where = (...conditions) => new LogicalCondition(
30
+ "and",
31
+ conditions.map((c) => ofGet(c, this))
32
+ ).toJSON();
33
+ match = (condition) => ({ $match: ofGet(condition, this).toJSON() });
34
+ group = (...conditions) => new LogicalCondition(
35
+ "group",
36
+ conditions.map((c) => ofGet(c, this))
37
+ ).toJSON();
38
+ google = (value) => toCondition("$text", "search", value);
39
+ search = (key) => this.map.field(asString(key));
40
+ sort = (...conditions) => conditions.reduce((cs, c) => {
41
+ cs[c.key] = c.value;
42
+ return cs;
43
+ }, {});
44
+ out(to = {}) {
45
+ return toMongoType(super.out(to));
46
+ }
47
+ }
48
+ export {
49
+ Collection
50
+ };
51
+ //# sourceMappingURL=Collection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Collection.ts"],"sourcesContent":["import {\n asString,\n Condition,\n Database,\n Field,\n Get,\n Json,\n LogicalCondition,\n MapOptions,\n Mapper,\n mappings,\n ofGet,\n PropertyOptions,\n Sort,\n SortDirection,\n Text,\n toCondition,\n toUuid,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\nimport { MongoProvider } from './MongoProvider';\n\nexport class Collection extends Mapper {\n protected readonly map = {\n ...mappings,\n field: <T = unknown>(name: string, options?: PropertyOptions<T>): Field => new Field(name, options),\n };\n readonly id = this.map.field('id', { dflt: toUuid });\n\n constructor(options: MapOptions = { startFrom: 'source' }) {\n super(options);\n }\n\n get db(): Database {\n return Database.Default;\n }\n\n get provider(): MongoProvider {\n return new MongoProvider(this);\n }\n\n where = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'and',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n match = (condition: Get<Condition | LogicalCondition, this>): Json => ({ $match: ofGet(condition, this).toJSON() });\n\n group = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'group',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n google = (value: unknown): Condition => toCondition('$text', 'search', value);\n\n search = (key: Text): Field => this.map.field(asString(key));\n\n sort = (...conditions: Sort[]): Record<string, SortDirection> =>\n conditions.reduce((cs: any, c) => {\n cs[c.key] = c.value;\n return cs;\n }, {});\n\n out(to: Json = {}): Json {\n return toMongoType(super.out(to));\n }\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EAGA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAEvB,MAAM,mBAAmB,OAAO;AAAA,EAClB,MAAM;AAAA,IACvB,GAAG;AAAA,IACH,OAAO,CAAc,MAAc,YAAwC,IAAI,MAAM,MAAM,OAAO;AAAA,EACpG;AAAA,EACS,KAAK,KAAK,IAAI,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EAEnD,YAAY,UAAsB,EAAE,WAAW,SAAS,GAAG;AACzD,UAAM,OAAO;AAAA,EACf;AAAA,EAEA,IAAI,KAAe;AACjB,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,IAAI,WAA0B;AAC5B,WAAO,IAAI,cAAc,IAAI;AAAA,EAC/B;AAAA,EAEA,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,OAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,QAAQ,CAAC,eAA8D,EAAE,QAAQ,MAAM,WAAW,IAAI,EAAE,OAAO,EAAE;AAAA,EAEjH,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,OAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,SAAS,CAAC,UAA8B,YAAY,SAAS,UAAU,KAAK;AAAA,EAE5E,SAAS,CAAC,QAAqB,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAAA,EAE3D,OAAO,IAAI,eACT,WAAW,OAAO,CAAC,IAAS,MAAM;AAChC,OAAG,EAAE,GAAG,IAAI,EAAE;AACd,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAAA,EAEP,IAAI,KAAW,CAAC,GAAS;AACvB,WAAO,YAAY,MAAM,IAAI,EAAE,CAAC;AAAA,EAClC;AACF;","names":[]}
@@ -0,0 +1,87 @@
1
+ import { DateTime, Func, List, OneOrMore, Optional, RequireAtLeastOne } from '@thisisagile/easy';
2
+ type FuzzyOptions = {
3
+ maxEdits: number;
4
+ prefixLength: number;
5
+ maxExpansions: number;
6
+ };
7
+ export type Facet = {
8
+ path: string;
9
+ type: 'string';
10
+ numBuckets: number;
11
+ } | {
12
+ path: string;
13
+ type: 'number';
14
+ boundaries: number[];
15
+ default?: string;
16
+ } | {
17
+ path: string;
18
+ type: 'date';
19
+ boundaries: Date[];
20
+ default?: string;
21
+ };
22
+ export type Operator = Func<Optional<object>, string>;
23
+ export type Clause = object | Operator;
24
+ export type Clauses = Record<string, Clause>;
25
+ export type SearchDefinition = Record<string, (v: string | number) => RequireAtLeastOne<{
26
+ should?: Clauses;
27
+ filter?: Clauses;
28
+ must?: Clauses;
29
+ mustNot?: Clauses;
30
+ sort?: Record<string, 1 | -1>;
31
+ facet?: Facet;
32
+ }>>;
33
+ type Compound = {
34
+ must: OneOrMore<Clauses>;
35
+ should: OneOrMore<Clauses>;
36
+ mustNot: OneOrMore<Clauses>;
37
+ filter: OneOrMore<Clauses>;
38
+ };
39
+ export declare const lucene: {
40
+ clause: (c: Clauses) => List<unknown>;
41
+ clauses: (cs: OneOrMore<Clauses>) => unknown[];
42
+ search: (c: Partial<Compound>, index?: string) => {
43
+ $search: {
44
+ compound: any;
45
+ index?: string | undefined;
46
+ };
47
+ };
48
+ searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, index?: string) => {
49
+ $search: {
50
+ sort?: Record<string, 1 | -1> | undefined;
51
+ compound: Partial<Compound>;
52
+ index?: string | undefined;
53
+ };
54
+ };
55
+ searchMeta: (query: Record<string, string | number>, def: SearchDefinition, index?: string) => {
56
+ $searchMeta: {
57
+ facet: {
58
+ operator: {
59
+ compound: Partial<Compound>;
60
+ };
61
+ facets: {
62
+ [x: string]: Facet | undefined;
63
+ };
64
+ };
65
+ index?: string | undefined;
66
+ };
67
+ };
68
+ exists: () => Operator;
69
+ text: (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>) => Operator;
70
+ wildcard: (value?: OneOrMore<unknown>) => Operator;
71
+ lt: (value: unknown) => Operator;
72
+ lte: (value: unknown) => Operator;
73
+ gt: (value: unknown) => Operator;
74
+ gte: (value: unknown) => Operator;
75
+ after: (date: unknown) => Operator;
76
+ before: (date: unknown) => Operator;
77
+ between: (after: unknown, before: unknown) => Operator;
78
+ facets: (def: SearchDefinition) => {
79
+ [x: string]: Facet | undefined;
80
+ };
81
+ facet: {
82
+ string: (path: string, numBuckets?: number) => Facet;
83
+ number: (path: string, boundaries: List<number>, alt?: string) => Facet;
84
+ date: (path: string, boundaries: List<DateTime>, alt?: string) => Facet;
85
+ };
86
+ };
87
+ export {};
package/dist/Lucene.js ADDED
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var Lucene_exports = {};
20
+ __export(Lucene_exports, {
21
+ lucene: () => lucene
22
+ });
23
+ module.exports = __toCommonJS(Lucene_exports);
24
+ var import_easy = require("@thisisagile/easy");
25
+ var import_Utils = require("./Utils");
26
+ const should = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v)?.should);
27
+ const must = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v)?.must);
28
+ const mustNot = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);
29
+ const filter = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);
30
+ const compound = (query, def) => (0, import_easy.entries)({
31
+ should: (0, import_easy.ifNotEmpty)(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [
32
+ { wildcard: lucene.wildcard() }
33
+ ]),
34
+ ...(0, import_easy.ifNotEmpty)(filter(query, def), (f) => ({ filter: f })),
35
+ ...(0, import_easy.ifNotEmpty)(mustNot(query, def), (m) => ({ mustNot: m })),
36
+ ...(0, import_easy.ifNotEmpty)(must(query, def), (m) => ({ must: m }))
37
+ }).reduce((res, [k, v]) => (0, import_easy.on)(res, (r) => r[k] = lucene.clauses(v)), {});
38
+ const lucene = {
39
+ clause: (c) => (0, import_easy.entries)(c).reduce((res, [k, v]) => res.add((0, import_easy.isFunction)(v) ? v(k) : v), (0, import_easy.toList)()),
40
+ clauses: (cs) => (0, import_easy.toArray)(cs).flatMap((c) => lucene.clause(c)),
41
+ search: (c, index) => ({
42
+ $search: {
43
+ ...(0, import_easy.ifDefined)(index, { index }),
44
+ compound: (0, import_easy.entries)(c).reduce((res, [k, v]) => (0, import_easy.on)(res, (r) => r[k] = lucene.clauses(v)), {})
45
+ }
46
+ }),
47
+ searchWithDef: (query, options, index) => {
48
+ const sort = (0, import_easy.entries)(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
49
+ return {
50
+ $search: { ...(0, import_easy.ifDefined)(index, { index }), compound: compound(query, options), ...(0, import_easy.ifDefined)(sort, { sort }) }
51
+ };
52
+ },
53
+ searchMeta: (query, def, index) => ({
54
+ $searchMeta: {
55
+ ...(0, import_easy.ifDefined)(index, { index }),
56
+ facet: {
57
+ operator: {
58
+ compound: compound(query, def)
59
+ },
60
+ facets: lucene.facets(def)
61
+ }
62
+ }
63
+ }),
64
+ exists: () => (path) => ({ exists: { path } }),
65
+ text: (value, fuzzy) => (path) => (0, import_easy.ifDefined)(value, (v) => ({
66
+ text: {
67
+ path: path === "wildcard" ? { wildcard: "*" } : path,
68
+ query: v,
69
+ ...(0, import_easy.ifDefined)(fuzzy, { fuzzy })
70
+ }
71
+ })),
72
+ wildcard: (value) => (path) => ({
73
+ wildcard: {
74
+ path: path === "wildcard" ? { wildcard: "*" } : path,
75
+ query: (0, import_easy.ifDefined)(value, value, "*")
76
+ }
77
+ }),
78
+ lt: (value) => (path) => (0, import_easy.ifDefined)(value, (lt) => ({ range: { path, lt } })),
79
+ lte: (value) => (path) => (0, import_easy.ifDefined)(value, (lte) => ({ range: { path, lte } })),
80
+ gt: (value) => (path) => (0, import_easy.ifDefined)(value, (gt) => ({ range: { path, gt } })),
81
+ gte: (value) => (path) => (0, import_easy.ifDefined)(value, (gte) => ({ range: { path, gte } })),
82
+ after: (date) => lucene.gte((0, import_Utils.toMongoType)(date)),
83
+ before: (date) => lucene.lt((0, import_Utils.toMongoType)(date)),
84
+ between: (after, before) => (path) => ({
85
+ range: {
86
+ path,
87
+ gte: (0, import_Utils.toMongoType)(after),
88
+ lt: (0, import_Utils.toMongoType)(before)
89
+ }
90
+ }),
91
+ facets: (def) => (0, import_easy.entries)(def).filter(([k, v]) => (0, import_easy.isDefined)(v(k)?.facet)).map(([k, v]) => ({ [k]: v(k)?.facet })).reduce((acc, v) => ({ ...acc, ...v }), {}),
92
+ facet: {
93
+ string: (path, numBuckets = 1e3) => ({
94
+ type: "string",
95
+ path,
96
+ numBuckets
97
+ }),
98
+ number: (path, boundaries, alt) => ({
99
+ type: "number",
100
+ path,
101
+ boundaries,
102
+ ...(0, import_easy.ifDefined)(alt, (a) => ({ default: a }))
103
+ }),
104
+ date: (path, boundaries, alt) => ({
105
+ type: "date",
106
+ path,
107
+ boundaries: boundaries.mapDefined((b) => b.toDate()),
108
+ ...(0, import_easy.ifDefined)(alt, (a) => ({ default: a }))
109
+ })
110
+ }
111
+ };
112
+ // Annotate the CommonJS export names for ESM import in node:
113
+ 0 && (module.exports = {
114
+ lucene
115
+ });
116
+ //# sourceMappingURL=Lucene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n isDefined,\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 facet: {\n operator: {\n compound: compound(query, def),\n },\n facets: lucene.facets(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>): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\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":[]}
@@ -0,0 +1,101 @@
1
+ import {
2
+ entries,
3
+ ifDefined,
4
+ ifNotEmpty,
5
+ isDefined,
6
+ isFunction,
7
+ on,
8
+ toArray,
9
+ toList
10
+ } from "@thisisagile/easy";
11
+ import { toMongoType } from "./Utils";
12
+ const should = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);
13
+ const must = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);
14
+ const mustNot = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);
15
+ const filter = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);
16
+ const compound = (query, def) => entries({
17
+ should: ifNotEmpty(should(query, def).concat(filter(query, def), must(query, def), mustNot(query, def)), should(query, def), [
18
+ { wildcard: lucene.wildcard() }
19
+ ]),
20
+ ...ifNotEmpty(filter(query, def), (f) => ({ filter: f })),
21
+ ...ifNotEmpty(mustNot(query, def), (m) => ({ mustNot: m })),
22
+ ...ifNotEmpty(must(query, def), (m) => ({ must: m }))
23
+ }).reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), {});
24
+ const lucene = {
25
+ clause: (c) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),
26
+ clauses: (cs) => toArray(cs).flatMap((c) => lucene.clause(c)),
27
+ search: (c, index) => ({
28
+ $search: {
29
+ ...ifDefined(index, { index }),
30
+ compound: entries(c).reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), {})
31
+ }
32
+ }),
33
+ searchWithDef: (query, options, index) => {
34
+ const sort = entries(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
35
+ return {
36
+ $search: { ...ifDefined(index, { index }), compound: compound(query, options), ...ifDefined(sort, { sort }) }
37
+ };
38
+ },
39
+ searchMeta: (query, def, index) => ({
40
+ $searchMeta: {
41
+ ...ifDefined(index, { index }),
42
+ facet: {
43
+ operator: {
44
+ compound: compound(query, def)
45
+ },
46
+ facets: lucene.facets(def)
47
+ }
48
+ }
49
+ }),
50
+ exists: () => (path) => ({ exists: { path } }),
51
+ text: (value, fuzzy) => (path) => ifDefined(value, (v) => ({
52
+ text: {
53
+ path: path === "wildcard" ? { wildcard: "*" } : path,
54
+ query: v,
55
+ ...ifDefined(fuzzy, { fuzzy })
56
+ }
57
+ })),
58
+ wildcard: (value) => (path) => ({
59
+ wildcard: {
60
+ path: path === "wildcard" ? { wildcard: "*" } : path,
61
+ query: ifDefined(value, value, "*")
62
+ }
63
+ }),
64
+ lt: (value) => (path) => ifDefined(value, (lt) => ({ range: { path, lt } })),
65
+ lte: (value) => (path) => ifDefined(value, (lte) => ({ range: { path, lte } })),
66
+ gt: (value) => (path) => ifDefined(value, (gt) => ({ range: { path, gt } })),
67
+ gte: (value) => (path) => ifDefined(value, (gte) => ({ range: { path, gte } })),
68
+ after: (date) => lucene.gte(toMongoType(date)),
69
+ before: (date) => lucene.lt(toMongoType(date)),
70
+ between: (after, before) => (path) => ({
71
+ range: {
72
+ path,
73
+ gte: toMongoType(after),
74
+ lt: toMongoType(before)
75
+ }
76
+ }),
77
+ facets: (def) => entries(def).filter(([k, v]) => isDefined(v(k)?.facet)).map(([k, v]) => ({ [k]: v(k)?.facet })).reduce((acc, v) => ({ ...acc, ...v }), {}),
78
+ facet: {
79
+ string: (path, numBuckets = 1e3) => ({
80
+ type: "string",
81
+ path,
82
+ numBuckets
83
+ }),
84
+ number: (path, boundaries, alt) => ({
85
+ type: "number",
86
+ path,
87
+ boundaries,
88
+ ...ifDefined(alt, (a) => ({ default: a }))
89
+ }),
90
+ date: (path, boundaries, alt) => ({
91
+ type: "date",
92
+ path,
93
+ boundaries: boundaries.mapDefined((b) => b.toDate()),
94
+ ...ifDefined(alt, (a) => ({ default: a }))
95
+ })
96
+ }
97
+ };
98
+ export {
99
+ lucene
100
+ };
101
+ //# sourceMappingURL=Lucene.mjs.map