@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.
- package/dist/AtlasSearchGateway.js +1 -1
- package/dist/AtlasSearchGateway.js.map +1 -1
- package/dist/AtlasSearchGateway.mjs +1 -1
- package/dist/AtlasSearchGateway.mjs.map +1 -1
- package/dist/Lucene.d.ts +11 -2
- package/dist/Lucene.js +5 -4
- package/dist/Lucene.js.map +1 -1
- package/dist/Lucene.mjs +5 -4
- package/dist/Lucene.mjs.map +1 -1
- package/package.json +3 -3
- package/src/AtlasSearchGateway.ts +1 -1
- package/src/Lucene.ts +5 -4
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 } }),
|
package/dist/Lucene.js.map
CHANGED
|
@@ -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 } }),
|
package/dist/Lucene.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
36
|
+
"@thisisagile/easy-test": "15.9.4"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@thisisagile/easy": "^15.9.
|
|
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.
|
|
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:
|