@thisisagile/easy-mongo 15.10.4 → 15.11.0

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/Lucene.d.ts CHANGED
@@ -22,7 +22,7 @@ export type Facet = {
22
22
  export type Operator = Func<Optional<object>, string>;
23
23
  export type Clause = object | Operator;
24
24
  export type Clauses = Record<string, Clause>;
25
- export type SearchDefinition = Record<string, (v: string | number) => RequireAtLeastOne<{
25
+ export type SearchDefinition = Record<string, (v: string | number, q?: Record<string, string | number>) => RequireAtLeastOne<{
26
26
  should?: Clauses;
27
27
  filter?: Clauses;
28
28
  must?: Clauses;
package/dist/Lucene.js CHANGED
@@ -23,10 +23,10 @@ __export(Lucene_exports, {
23
23
  module.exports = __toCommonJS(Lucene_exports);
24
24
  var import_easy = require("@thisisagile/easy");
25
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);
26
+ const should = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v, query)?.should);
27
+ const must = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);
28
+ const mustNot = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);
29
+ const filter = (query, def) => (0, import_easy.entries)(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);
30
30
  const lucene = {
31
31
  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)()),
32
32
  clauses: (cs) => (0, import_easy.toArray)(cs).flatMap((c) => lucene.clause(c)),
@@ -47,7 +47,7 @@ const lucene = {
47
47
  }
48
48
  }),
49
49
  searchWithDef: (query, options, count = "total", index) => {
50
- const sort = (0, import_easy.entries)(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
50
+ const sort = (0, import_easy.entries)(query).mapDefined(([k, v]) => options[k]?.(v, query)?.sort).first();
51
51
  return {
52
52
  $search: { ...(0, import_easy.ifDefined)(index, { index }), compound: lucene.compound(query, options), ...(0, import_easy.ifDefined)(sort, { sort }), count: { type: count } }
53
53
  };
@@ -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\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 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))), {\n minimumShouldMatch: should(query, def).length > 0 ? 1 : 0,\n } as any),\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: lucene.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: lucene.compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: lucene.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":[]}
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 q?: Record<string, 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, query)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] =>\n entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);\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 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))), {\n minimumShouldMatch: should(query, def).length > 0 ? 1 : 0,\n } as any),\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, query)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: lucene.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: lucene.compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: lucene.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
@@ -11,10 +11,10 @@ import {
11
11
  toList
12
12
  } from "@thisisagile/easy";
13
13
  import { toMongoType } from "./Utils";
14
- const should = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);
15
- const must = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);
16
- const mustNot = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);
17
- const filter = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);
14
+ const should = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.should);
15
+ const must = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);
16
+ const mustNot = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);
17
+ const filter = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);
18
18
  const lucene = {
19
19
  clause: (c) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),
20
20
  clauses: (cs) => toArray(cs).flatMap((c) => lucene.clause(c)),
@@ -35,7 +35,7 @@ const lucene = {
35
35
  }
36
36
  }),
37
37
  searchWithDef: (query, options, count = "total", index) => {
38
- const sort = entries(query).mapDefined(([k, v]) => options[k]?.(v)?.sort).first();
38
+ const sort = entries(query).mapDefined(([k, v]) => options[k]?.(v, query)?.sort).first();
39
39
  return {
40
40
  $search: { ...ifDefined(index, { index }), compound: lucene.compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } }
41
41
  };
@@ -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\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 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))), {\n minimumShouldMatch: should(query, def).length > 0 ? 1 : 0,\n } as any),\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: lucene.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: lucene.compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: lucene.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":[]}
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 q?: Record<string, 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, query)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] =>\n entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);\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 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))), {\n minimumShouldMatch: should(query, def).length > 0 ? 1 : 0,\n } as any),\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, query)?.sort)\n .first();\n return {\n $search: { ...ifDefined(index, { index }), compound: lucene.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: lucene.compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: lucene.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.10.4",
3
+ "version": "15.11.0",
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.10.4"
36
+ "@thisisagile/easy-test": "15.11.0"
37
37
  },
38
38
  "dependencies": {
39
- "@thisisagile/easy": "^15.10.4",
39
+ "@thisisagile/easy": "^15.11.0",
40
40
  "mongodb": "^5.6.0"
41
41
  }
42
42
  }
package/src/Lucene.ts CHANGED
@@ -35,7 +35,8 @@ export type Clauses = Record<string, Clause>;
35
35
  export type SearchDefinition = Record<
36
36
  string,
37
37
  (
38
- v: string | number
38
+ v: string | number,
39
+ q?: Record<string, string | number>
39
40
  ) => RequireAtLeastOne<{ should?: Clauses; filter?: Clauses; must?: Clauses; mustNot?: Clauses; sort?: Record<string, 1 | -1>; facet?: Facet }>
40
41
  >;
41
42
 
@@ -46,10 +47,11 @@ type Compound = {
46
47
  filter: OneOrMore<Clauses>;
47
48
  };
48
49
 
49
- const should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.should);
50
- const must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.must);
51
- const mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.mustNot);
52
- const filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v)?.filter);
50
+ const should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.should);
51
+ const must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);
52
+ const mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] =>
53
+ entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);
54
+ const filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);
53
55
 
54
56
  export const lucene = {
55
57
  clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),
@@ -73,7 +75,7 @@ export const lucene = {
73
75
  }),
74
76
  searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => {
75
77
  const sort = entries(query)
76
- .mapDefined(([k, v]) => options[k]?.(v)?.sort)
78
+ .mapDefined(([k, v]) => options[k]?.(v, query)?.sort)
77
79
  .first();
78
80
  return {
79
81
  $search: { ...ifDefined(index, { index }), compound: lucene.compound(query, options), ...ifDefined(sort, { sort }), count: { type: count } },