@thisisagile/easy-mongo 17.30.0 → 17.30.2

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  lucene
3
- } from "./chunk-J3OXGWPD.mjs";
3
+ } from "./chunk-3DCXYYNH.mjs";
4
4
  import {
5
5
  MongoGateway
6
6
  } from "./chunk-GFBKWYDV.mjs";
package/dist/Lucene.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  lucene
3
- } from "./chunk-J3OXGWPD.mjs";
3
+ } from "./chunk-3DCXYYNH.mjs";
4
4
  import "./chunk-MZE7UWQC.mjs";
5
5
  export {
6
6
  lucene
@@ -31,7 +31,7 @@ var lucene = {
31
31
  }).filter(([_, v]) => v.length > 0),
32
32
  (e) => e.reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : {}),
33
33
  () => ifTrue(wildcard, () => ({
34
- should: lucene.clauses([{ wildcard: lucene.wildcard() }]),
34
+ should: lucene.clauses([{ r: { exists: { path: "id" } } }]),
35
35
  minimumShouldMatch: 0
36
36
  }))
37
37
  ),
@@ -126,4 +126,4 @@ var lucene = {
126
126
  export {
127
127
  lucene
128
128
  };
129
- //# sourceMappingURL=chunk-J3OXGWPD.mjs.map
129
+ //# sourceMappingURL=chunk-3DCXYYNH.mjs.map
@@ -0,0 +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 q?: Record<string, string | number>\n ) => RequireAtLeastOne<{\n should?: Clauses;\n filter?: Clauses;\n must?: Clauses;\n mustNot?: Clauses;\n sort?: Record<string, 1 | -1>;\n facet?: Facet;\n }>\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, wildcard = true): Partial<Compound> =>\n ifNotEmpty(\n entries({\n should: should(query, def),\n filter: filter(query, def),\n mustNot: mustNot(query, def),\n must: must(query, def),\n }).filter(([_, v]) => v.length > 0),\n e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),\n () =>\n ifTrue(wildcard, () => ({\n should: lucene.clauses([{ r: { exists: { path: 'id' } } }]),\n minimumShouldMatch: 0,\n }))\n ),\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: {\n ...ifDefined(index, { index }),\n compound: lucene.compound(query, options),\n ...ifDefined(sort, { sort }),\n count: { type: count },\n },\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, includeLimit?: boolean): Operator =>\n (path: string) => {\n const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };\n return {\n range: {\n path,\n gte: toMongoType(after),\n ...upperLimit,\n },\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/index.js CHANGED
@@ -244,7 +244,7 @@ var lucene = {
244
244
  }).filter(([_, v]) => v.length > 0),
245
245
  (e) => e.reduce((res, [k, v]) => (0, import_easy4.on)(res, (r) => r[k] = lucene.clauses(v)), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : {}),
246
246
  () => (0, import_easy4.ifTrue)(wildcard, () => ({
247
- should: lucene.clauses([{ wildcard: lucene.wildcard() }]),
247
+ should: lucene.clauses([{ r: { exists: { path: "id" } } }]),
248
248
  minimumShouldMatch: 0
249
249
  }))
250
250
  ),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Stages.ts","../src/Utils.ts","../src/MongoGateway.ts","../src/Lucene.ts","../src/AtlasSearchGateway.ts","../src/Collection.ts","../src/MongoProvider.ts"],"sourcesContent":["export * from './AtlasSearchGateway';\nexport * from './Collection';\nexport * from './Lucene';\nexport * from './MongoGateway';\nexport * from './MongoProvider';\nexport * from './Stages';\nexport * from './Utils';\n","import { Filter, FindOptions } from './MongoProvider';\nimport {\n asNumber,\n asString,\n Currency,\n Get,\n Id,\n ifDefined,\n ifNotEmpty,\n isDefined,\n isPresent,\n isPrimitive,\n isString,\n meta,\n ofGet,\n on,\n OneOrMore,\n Optional,\n PartialRecord,\n toArray,\n use,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\nexport const asc = 1;\nexport const desc = -1;\nexport type Accumulators = '$sum' | '$count' | '$multiply' | '$avg' | '$first' | '$last' | '$min' | '$max' | '$push' | '$addToSet' | '$size';\nexport type Accumulator = PartialRecord<Accumulators, Filter>;\n\nexport class FilterBuilder<Options> {\n constructor(private filters: { [K in keyof Options]: (v: Options[K]) => Filter }) {}\n\n from = (q: Partial<Options> = {}): Filter =>\n stages.match.match(\n meta(q)\n .entries()\n .reduce((acc, [key, value]) => ({ ...acc, ...ifDefined(this.filters[key as keyof Options], f => f(value as Options[keyof Options])) }), {})\n );\n}\n\ntype Sort = Record<string, typeof asc | typeof desc>;\n\nexport class SortBuilder {\n constructor(private sorts: Record<string, Sort>) {}\n\n get keys(): string[] {\n return Object.keys(this.sorts);\n }\n\n from = (\n s: {\n s?: string;\n } = {},\n alt?: string\n ): Optional<Filter> => stages.sort.sort(this.sorts[s?.s ?? ''] ?? this.sorts[alt ?? '']);\n}\n\nexport class IncludeBuilder {\n constructor(private includes: Record<string, (string | Record<string, 1>)[]>) {}\n\n get keys(): string[] {\n return Object.keys(this.includes);\n }\n\n from = (\n i: {\n i?: string;\n } = {},\n alt?: string\n ): Optional<Filter> => stages.project.include(...(this.includes[i?.i ?? ''] ?? this.includes[alt ?? ''] ?? []));\n}\n\nconst escapeRegex = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n\nexport const stages = {\n root: '$$ROOT',\n current: '$$CURRENT',\n id: '_id',\n decode: {\n object: (f: Filter) => use(Object.entries(f)[0], ([k, v]) => ofGet(v, k)),\n fields: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => ifDefined(ofGet(v, k), nv => (r[k] = nv))), {} as any),\n fieldsArrays: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => (r[k] = use(toArray(v), vs => vs.map(v => ofGet(v, k))))), {} as any),\n id: (f: Filter | string) => (isString(f) ? `$${asString(f)}` : isPrimitive(f) ? f : Object.entries(f).map(([k, v]) => ofGet(v, k))[0]),\n },\n match: {\n match: (f: Record<string, Get<Optional<Filter>, string>>) => ({ $match: stages.decode.fields(f) }),\n filter: <Options>(filters: { [K in keyof Options]: (v: Options[K]) => Filter }) => new FilterBuilder<Options>(filters),\n or: (...filters: Filter[]) => ({ $or: toArray(filters).map(f => stages.decode.object(f)) }),\n gt: (value: Filter) => ({ $gt: value }),\n gte: (value: Filter) => ({ $gte: value }),\n lt: (value: Filter) => ({ $lt: value }),\n lte: (value: Filter) => ({ $lte: value }),\n isIn: (value: OneOrMore<unknown>, separator = ',') => ({ $in: isString(value) ? value.split(separator) : value }),\n notIn: (value: OneOrMore<unknown>, separator = ',') => ({ $nin: isString(value) ? value.split(separator) : value }),\n after: (date: unknown) => stages.match.gte(toMongoType(date)),\n before: (date: unknown) => stages.match.lt(toMongoType(date)),\n anywhere: (q: string) => ({ $regex: escapeRegex(q), $options: 'i' }),\n money: (currency: Currency, value: Filter) => (key: string) => ({\n [`${key}.currency`]: currency.id,\n ...stages.decode.fields({ [`${key}.value`]: value }),\n }),\n },\n sort: {\n sort: ($sort: Sort) => (isPresent($sort) ? { $sort } : undefined),\n sorter: (sorts: Record<string, Sort>) => new SortBuilder(sorts),\n asc: (key: string) => stages.sort.sort({ [key]: asc }),\n desc: (key: string) => stages.sort.sort({ [key]: desc }),\n },\n group: {\n group: (fields: Record<string, Accumulator>) => ({\n by: (by: Filter) => ({ $group: Object.assign({ _id: stages.decode.id(by) }, stages.decode.fields(fields)) }),\n }),\n date:\n (format = '%Y-%m-%d') =>\n (key: string) => ({ $dateToString: { date: `$${key}`, format } }),\n count: (): Accumulator => ({ $count: {} }),\n sum: (from?: string): Accumulator => (isDefined(from) ? { $sum: `$${from}` } : { $sum: 1 }),\n avg: (from?: string) => ({ $avg: `$${from}` }),\n multiply: (...multiply: string[]) => ({ $multiply: multiply.map(m => `$${m}`) }),\n first: (from?: string): Accumulator => ({ $first: `$${from}` }),\n last: (from?: string): Accumulator => ({ $last: `$${from}` }),\n min: (from?: string): Accumulator => ({ $min: `$${from}` }),\n max: (from?: string): Accumulator => ({ $max: `$${from}` }),\n addToSet: (from?: string): Accumulator => ({ $addToSet: `$${from}` }),\n push: (from = '$ROOT'): Accumulator => ({ $push: `$${from}` }),\n size: (from?: string): Accumulator => ({ $size: `$${from}` }),\n },\n search: {\n search: (f: Record<string, Get<Filter, string>>) => ifDefined(stages.decode.id(f), $search => ({ $search })),\n auto: (value?: Id) => (key: string) => ifDefined(value, v => ({ autocomplete: { path: key, query: [v] } })),\n fuzzy:\n (value?: string, maxEdits = 1) =>\n (key?: string) =>\n ifDefined(value, v => ({\n text: {\n query: v,\n path: key === 'wildcard' ? { wildcard: '*' } : key,\n fuzzy: { maxEdits },\n },\n })),\n },\n set: {\n set: (f: Record<string, Get<Filter, string>>) => ({ $set: stages.decode.fields(f) }),\n score: () => ({ $meta: 'searchScore' }),\n },\n skip: {\n skip: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.skip, { $skip: asNumber(o.skip) }),\n take: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.take, { $limit: asNumber(o.take) }),\n },\n project: {\n include: (...includes: (string | Record<string, 1 | string>)[]): Optional<Filter> =>\n ifNotEmpty(includes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 1 } : b) }), {}) })),\n exclude: (...excludes: (string | Record<string, 0>)[]): Optional<Filter> =>\n ifNotEmpty(excludes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 0 } : b) }), {}) })),\n includes: (includes: Record<string, (string | Record<string, 1>)[]>) => new IncludeBuilder(includes),\n project: (project?: Filter) => ifDefined(project, $project => ({ $project })),\n date: (key: string, format?: string) => ({ $toDate: `$${key}`, ...ifDefined(format, { format }) }),\n duration: (from: string, to: string) => ({ $divide: [{ $subtract: [stages.project.date(from), stages.project.date(to)] }, 1000] }),\n },\n replaceWith: {\n replaceWith: (f?: Filter): Optional<Filter> => ifDefined(f, { $replaceWith: f }),\n merge: (...objects: Filter[]): Optional<Filter> => ifNotEmpty(objects, os => ({ $mergeObjects: os })),\n rootAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.root, ...objects),\n currentAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.current, ...objects),\n reroot: (prop: string): Filter => ({ $replaceRoot: { newRoot: `$${prop}` } }),\n concat: (...props: string[]): Optional<Filter> => ifNotEmpty(props, ps => ({ $concatArrays: ps.map(p => `$${p}`) })),\n },\n facet: {\n facet: (f: Record<string, OneOrMore<Get<Optional<Filter>, string>>>) => ({ $facet: stages.decode.fieldsArrays(f) }),\n unwind: (from?: string) => (f?: string) => ({ $unwind: `$${from ?? f}` }),\n count: (from?: string) => (f?: string) => ({ $sortByCount: `$${from ?? f}` }),\n data: () => [],\n },\n unwind: {\n unwind: (prop?: string) => ({ $unwind: `$${prop}` }),\n },\n};\n","import { choose, DateTime, isArray, isDate, isDateTime, isIsoDateString, isObject, Json, meta } from '@thisisagile/easy';\n\nexport const toMongoType = (input: unknown): Json =>\n choose(input)\n .type(isIsoDateString, i => new DateTime(i).toDate() as any)\n .type(isDateTime, i => i.toDate() as any)\n .type(isArray, a => a.map((i: any) => toMongoType(i)))\n .type(isDate, d => d)\n .type(isObject, o =>\n Object.fromEntries(\n meta(o)\n .entries()\n .map(([k, i]) => [k, toMongoType(i)])\n )\n )\n .else(input);\n","import { Filter, FindOptions, MongoProvider } from './MongoProvider';\nimport {\n asJson,\n Condition,\n Gateway,\n Id,\n ifDefined,\n isDefined,\n isPresent,\n Json,\n JsonValue,\n List,\n LogicalCondition,\n Optional,\n PageList,\n toArray,\n} from '@thisisagile/easy';\nimport { Collection } from './Collection';\nimport { stages } from './Stages';\n\nexport class MongoGateway implements Gateway<FindOptions> {\n constructor(readonly collection: Collection, readonly provider: MongoProvider = collection.provider) {}\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.all(options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byId(id: Id): Promise<Json | undefined> {\n return this.provider.byId(id).then(j => ifDefined(j, this.collection.in(j)));\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.by(key, value, options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byIds(...ids: Id[]): Promise<List<Json>> {\n return this.find(this.collection.id.isIn(...ids));\n }\n\n find(q: JsonValue | Condition | LogicalCondition, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.find(asJson(q), options).then(js => js.map(j => this.collection.in(j)));\n }\n\n search(q: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find(this.collection.google(q), options);\n }\n\n filter(options?: FindOptions): Promise<PageList<Json>> {\n return this.all(options);\n }\n\n exists(id: Id): Promise<boolean> {\n return this.provider.byId(id).then(i => isDefined(i));\n }\n\n aggregate(...filters: Optional<Filter>[]): Promise<PageList<Json>> {\n return this.provider.aggregate(toArray(...filters).filter(isPresent) as Filter[]);\n }\n\n count(...filters: Optional<Filter>[]): Promise<number> {\n return this.aggregate(...filters, { $count: 'total' }).then(d => (d.first()?.total as number) ?? 0);\n }\n\n match(f: Filter): Promise<PageList<Json>> {\n return this.aggregate(stages.match.match(f));\n }\n\n add(item: Json): Promise<Json> {\n return this.provider.add(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n update(item: Json): Promise<Json> {\n return this.provider.update(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.provider.remove(id);\n }\n}\n","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<{\n should?: Clauses;\n filter?: Clauses;\n must?: Clauses;\n mustNot?: Clauses;\n sort?: Record<string, 1 | -1>;\n facet?: Facet;\n }>\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, wildcard = true): Partial<Compound> =>\n ifNotEmpty(\n entries({\n should: should(query, def),\n filter: filter(query, def),\n mustNot: mustNot(query, def),\n must: must(query, def),\n }).filter(([_, v]) => v.length > 0),\n e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),\n () =>\n ifTrue(wildcard, () => ({\n should: lucene.clauses([{ wildcard: lucene.wildcard() }]),\n minimumShouldMatch: 0,\n }))\n ),\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: {\n ...ifDefined(index, { index }),\n compound: lucene.compound(query, options),\n ...ifDefined(sort, { sort }),\n count: { type: count },\n },\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, includeLimit?: boolean): Operator =>\n (path: string) => {\n const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };\n return {\n range: {\n path,\n gte: toMongoType(after),\n ...upperLimit,\n },\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","import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { asNumber, entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\nimport { Filter as MongoFilter} from '../src/MongoProvider';\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>, additionalStages: MongoFilter[] = []): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(\n searchWithDef(query, this.searchDef),\n skip({ skip: (query?.skip as number) ?? 0 }),\n take({ take: (query?.take as number) ?? 250 }),\n ...additionalStages\n ),\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() }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: asNumber(meta?.total, 0),\n skip: asNumber(query?.skip, 0),\n take: asNumber(query?.take, 250),\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n }\n}\n","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","import {\n asJson,\n asNumber,\n asString,\n choose,\n Condition,\n Database,\n entries,\n Exception,\n FetchOptions,\n Field,\n Id,\n ifTrue,\n isArray,\n isDefined,\n isField,\n isSortCondition,\n json,\n Json,\n JsonValue,\n LogicalCondition,\n OneOrMore,\n PageList,\n Sort,\n toArray,\n toPageList,\n tuple2,\n tuple3,\n use,\n when,\n} from '@thisisagile/easy';\nimport {\n AggregationCursor,\n Collection as MongoCollection,\n CreateIndexesOptions,\n Document,\n FindCursor,\n FindOptions as MongoFindOptions,\n IndexSpecification,\n MongoClient,\n StrictFilter as MongoFilter,\n} from 'mongodb';\nimport { Collection } from './Collection';\nimport { toMongoType } from './Utils';\n\nconst omitId = (j: Json): Json => json.delete(j, '_id');\n\nexport type Projection = Record<string, 0 | 1>;\nexport type FindOptions = FetchOptions & { projection?: Projection };\nexport type Filter<T = unknown> = MongoFilter<T>;\nexport type Query = Condition | LogicalCondition | Filter<any>;\n\nexport type IndexOptions = {\n unique?: boolean;\n filter?: Query;\n languageOverride?: string;\n languageDefault?: string;\n};\n\nexport type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;\n\nexport type Options = { maxTimeMS?: number };\n\nfunction omitOptions(obj?: FindOptions & Options): Omit<FindOptions & Options, keyof Options> {\n const { maxTimeMS, ...rest } = obj ?? ({} as Options);\n return rest;\n}\n\nexport class MongoProvider {\n protected static readonly clients: { [key: string]: Promise<MongoClient> } = {};\n\n constructor(readonly coll: Collection) {}\n\n static destroyAll(): Promise<void> {\n return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.then(c => c.close()).then(() => delete MongoProvider.clients[u]))).then(\n () => undefined\n );\n }\n\n private static connect(u: string, db: Database) {\n return MongoClient.connect(u, {\n auth: {\n username: asString(db.options?.user),\n password: asString(db.options?.password),\n },\n ...(db.options?.maxPoolSize && { maxPoolSize: db.options?.maxPoolSize }),\n ...(db.options?.minPoolSize && { minPoolSize: db.options?.minPoolSize }),\n ...(db.options?.maxIdleTimeMS && { maxIdleTimeMS: db.options?.maxIdleTimeMS }),\n ...(db.options?.socketTimeoutMS && { socketTimeoutMS: db.options?.socketTimeoutMS }),\n })\n .then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n })\n .catch(err => {\n delete MongoProvider.clients[u];\n return Promise.reject(err);\n });\n }\n\n cluster(): Promise<MongoClient> {\n return use(this.coll.db, db =>\n when(db.options?.cluster)\n .not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'))\n .then(c => MongoProvider.clients[c] ?? (MongoProvider.clients[c] = MongoProvider.connect(c, db)))\n );\n }\n\n collection<T extends Document = Document>(): Promise<MongoCollection<T>> {\n return this.cluster()\n .then(c => c.db(this.coll.db.name))\n .then(db => db.collection<T>(asString(this.coll)));\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n withTimeout(options?: Partial<FindOptions & Options>): Partial<FindOptions> & Options {\n return { ...options, maxTimeMS: options?.maxTimeMS ?? this.coll.db?.options?.queryTimeoutMS ?? 30000 };\n }\n\n find(query: Query, options?: FindOptions & Options): Promise<PageList<Json>> {\n return tuple3(this.collection(), this.toMongoJson(query), this.toFindOptions(options))\n .then(([c, q, o]) =>\n tuple2(\n c.find(q, o),\n ifTrue(o.total, () => c.countDocuments(q, { maxTimeMS: this.withTimeout(options).maxTimeMS }))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...omitOptions(options), total }));\n }\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.find({}, options);\n }\n\n byId(id: Id, options?: FindOptions): Promise<Json> {\n return this.collection().then(c => c.findOne(this.toMongoJson({ id: id }), this.toFindOptions(options)) as Promise<Json>);\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find({ [key]: value }, options);\n }\n\n group(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.aggregate(qs, options);\n }\n\n aggregate(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.collection()\n .then(c =>\n c.aggregate(\n qs.map(q => this.toMongoJson(q)),\n this.withTimeout(options)\n )\n )\n .then(res => this.toArray(res));\n }\n\n add(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.insertOne(omitId(item)))\n .then(() => omitId(item));\n }\n\n update(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.updateOne(this.toMongoJson({ id: item.id }), { $set: omitId(item) }))\n .then(() => this.byId(item.id as Id));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.collection()\n .then(c => c.deleteOne(this.toMongoJson({ id })))\n .then(d => d.acknowledged);\n }\n\n count(query?: Query, options?: Options): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {}), this.withTimeout(options)));\n }\n\n createIndex(indexes: Indexes, options?: IndexOptions): Promise<string> {\n return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));\n }\n\n createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string> {\n return this.createIndex(indexes, { ...options, filter });\n }\n\n createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string> {\n const ii = toArray(indexes).reduce((i, f) => ({ ...i, [asString(f)]: 'text' }), {});\n return this.createIndex(ii, { unique: false, ...options });\n }\n\n protected toFindOptions(options?: FindOptions): MongoFindOptions & { total: boolean } {\n return {\n limit: asNumber(options?.take ?? 250),\n ...(options?.skip && { skip: asNumber(options?.skip) }),\n ...((options?.sorts && { sort: options?.sorts }) || (options?.sort && { sort: this.coll.sort(...(options?.sort ?? [])) })),\n total: isDefined(options?.skip) || isDefined(options?.take),\n projection: options?.projection ?? { _id: 0 },\n maxTimeMS: this.withTimeout(options).maxTimeMS,\n };\n }\n\n protected toIndexSpecification(index: Indexes): IndexSpecification {\n return choose(index)\n .type(isField, f => f.property as IndexSpecification)\n .type(isSortCondition, s => s.toJSON() as IndexSpecification)\n .type(isArray, aa => aa.map(a => this.toIndexSpecification(a)) as IndexSpecification)\n .else(i => i as IndexSpecification);\n }\n\n protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions {\n return {\n unique: options?.unique ?? true,\n ...(options?.languageOverride && { language_override: options.languageOverride }),\n ...(options?.languageDefault && { default_language: options.languageDefault }),\n ...(options?.filter && { partialFilterExpression: toMongoType(asJson(options.filter)) }),\n };\n }\n\n protected toArray(\n cursor: FindCursor<Document> | AggregationCursor<Document>,\n options?: { take?: number; skip?: number; total?: number }\n ): Promise<PageList<Json>> {\n return cursor.toArray().then(r => toPageList<Json>(r, options));\n }\n}\n"],"mappings":"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","names":["import_easy","v","import_easy","import_easy","import_easy","facets","meta","import_easy","import_easy","c","filter"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Stages.ts","../src/Utils.ts","../src/MongoGateway.ts","../src/Lucene.ts","../src/AtlasSearchGateway.ts","../src/Collection.ts","../src/MongoProvider.ts"],"sourcesContent":["export * from './AtlasSearchGateway';\nexport * from './Collection';\nexport * from './Lucene';\nexport * from './MongoGateway';\nexport * from './MongoProvider';\nexport * from './Stages';\nexport * from './Utils';\n","import { Filter, FindOptions } from './MongoProvider';\nimport {\n asNumber,\n asString,\n Currency,\n Get,\n Id,\n ifDefined,\n ifNotEmpty,\n isDefined,\n isPresent,\n isPrimitive,\n isString,\n meta,\n ofGet,\n on,\n OneOrMore,\n Optional,\n PartialRecord,\n toArray,\n use,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\nexport const asc = 1;\nexport const desc = -1;\nexport type Accumulators = '$sum' | '$count' | '$multiply' | '$avg' | '$first' | '$last' | '$min' | '$max' | '$push' | '$addToSet' | '$size';\nexport type Accumulator = PartialRecord<Accumulators, Filter>;\n\nexport class FilterBuilder<Options> {\n constructor(private filters: { [K in keyof Options]: (v: Options[K]) => Filter }) {}\n\n from = (q: Partial<Options> = {}): Filter =>\n stages.match.match(\n meta(q)\n .entries()\n .reduce((acc, [key, value]) => ({ ...acc, ...ifDefined(this.filters[key as keyof Options], f => f(value as Options[keyof Options])) }), {})\n );\n}\n\ntype Sort = Record<string, typeof asc | typeof desc>;\n\nexport class SortBuilder {\n constructor(private sorts: Record<string, Sort>) {}\n\n get keys(): string[] {\n return Object.keys(this.sorts);\n }\n\n from = (\n s: {\n s?: string;\n } = {},\n alt?: string\n ): Optional<Filter> => stages.sort.sort(this.sorts[s?.s ?? ''] ?? this.sorts[alt ?? '']);\n}\n\nexport class IncludeBuilder {\n constructor(private includes: Record<string, (string | Record<string, 1>)[]>) {}\n\n get keys(): string[] {\n return Object.keys(this.includes);\n }\n\n from = (\n i: {\n i?: string;\n } = {},\n alt?: string\n ): Optional<Filter> => stages.project.include(...(this.includes[i?.i ?? ''] ?? this.includes[alt ?? ''] ?? []));\n}\n\nconst escapeRegex = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n\nexport const stages = {\n root: '$$ROOT',\n current: '$$CURRENT',\n id: '_id',\n decode: {\n object: (f: Filter) => use(Object.entries(f)[0], ([k, v]) => ofGet(v, k)),\n fields: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => ifDefined(ofGet(v, k), nv => (r[k] = nv))), {} as any),\n fieldsArrays: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => (r[k] = use(toArray(v), vs => vs.map(v => ofGet(v, k))))), {} as any),\n id: (f: Filter | string) => (isString(f) ? `$${asString(f)}` : isPrimitive(f) ? f : Object.entries(f).map(([k, v]) => ofGet(v, k))[0]),\n },\n match: {\n match: (f: Record<string, Get<Optional<Filter>, string>>) => ({ $match: stages.decode.fields(f) }),\n filter: <Options>(filters: { [K in keyof Options]: (v: Options[K]) => Filter }) => new FilterBuilder<Options>(filters),\n or: (...filters: Filter[]) => ({ $or: toArray(filters).map(f => stages.decode.object(f)) }),\n gt: (value: Filter) => ({ $gt: value }),\n gte: (value: Filter) => ({ $gte: value }),\n lt: (value: Filter) => ({ $lt: value }),\n lte: (value: Filter) => ({ $lte: value }),\n isIn: (value: OneOrMore<unknown>, separator = ',') => ({ $in: isString(value) ? value.split(separator) : value }),\n notIn: (value: OneOrMore<unknown>, separator = ',') => ({ $nin: isString(value) ? value.split(separator) : value }),\n after: (date: unknown) => stages.match.gte(toMongoType(date)),\n before: (date: unknown) => stages.match.lt(toMongoType(date)),\n anywhere: (q: string) => ({ $regex: escapeRegex(q), $options: 'i' }),\n money: (currency: Currency, value: Filter) => (key: string) => ({\n [`${key}.currency`]: currency.id,\n ...stages.decode.fields({ [`${key}.value`]: value }),\n }),\n },\n sort: {\n sort: ($sort: Sort) => (isPresent($sort) ? { $sort } : undefined),\n sorter: (sorts: Record<string, Sort>) => new SortBuilder(sorts),\n asc: (key: string) => stages.sort.sort({ [key]: asc }),\n desc: (key: string) => stages.sort.sort({ [key]: desc }),\n },\n group: {\n group: (fields: Record<string, Accumulator>) => ({\n by: (by: Filter) => ({ $group: Object.assign({ _id: stages.decode.id(by) }, stages.decode.fields(fields)) }),\n }),\n date:\n (format = '%Y-%m-%d') =>\n (key: string) => ({ $dateToString: { date: `$${key}`, format } }),\n count: (): Accumulator => ({ $count: {} }),\n sum: (from?: string): Accumulator => (isDefined(from) ? { $sum: `$${from}` } : { $sum: 1 }),\n avg: (from?: string) => ({ $avg: `$${from}` }),\n multiply: (...multiply: string[]) => ({ $multiply: multiply.map(m => `$${m}`) }),\n first: (from?: string): Accumulator => ({ $first: `$${from}` }),\n last: (from?: string): Accumulator => ({ $last: `$${from}` }),\n min: (from?: string): Accumulator => ({ $min: `$${from}` }),\n max: (from?: string): Accumulator => ({ $max: `$${from}` }),\n addToSet: (from?: string): Accumulator => ({ $addToSet: `$${from}` }),\n push: (from = '$ROOT'): Accumulator => ({ $push: `$${from}` }),\n size: (from?: string): Accumulator => ({ $size: `$${from}` }),\n },\n search: {\n search: (f: Record<string, Get<Filter, string>>) => ifDefined(stages.decode.id(f), $search => ({ $search })),\n auto: (value?: Id) => (key: string) => ifDefined(value, v => ({ autocomplete: { path: key, query: [v] } })),\n fuzzy:\n (value?: string, maxEdits = 1) =>\n (key?: string) =>\n ifDefined(value, v => ({\n text: {\n query: v,\n path: key === 'wildcard' ? { wildcard: '*' } : key,\n fuzzy: { maxEdits },\n },\n })),\n },\n set: {\n set: (f: Record<string, Get<Filter, string>>) => ({ $set: stages.decode.fields(f) }),\n score: () => ({ $meta: 'searchScore' }),\n },\n skip: {\n skip: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.skip, { $skip: asNumber(o.skip) }),\n take: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.take, { $limit: asNumber(o.take) }),\n },\n project: {\n include: (...includes: (string | Record<string, 1 | string>)[]): Optional<Filter> =>\n ifNotEmpty(includes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 1 } : b) }), {}) })),\n exclude: (...excludes: (string | Record<string, 0>)[]): Optional<Filter> =>\n ifNotEmpty(excludes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 0 } : b) }), {}) })),\n includes: (includes: Record<string, (string | Record<string, 1>)[]>) => new IncludeBuilder(includes),\n project: (project?: Filter) => ifDefined(project, $project => ({ $project })),\n date: (key: string, format?: string) => ({ $toDate: `$${key}`, ...ifDefined(format, { format }) }),\n duration: (from: string, to: string) => ({ $divide: [{ $subtract: [stages.project.date(from), stages.project.date(to)] }, 1000] }),\n },\n replaceWith: {\n replaceWith: (f?: Filter): Optional<Filter> => ifDefined(f, { $replaceWith: f }),\n merge: (...objects: Filter[]): Optional<Filter> => ifNotEmpty(objects, os => ({ $mergeObjects: os })),\n rootAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.root, ...objects),\n currentAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.current, ...objects),\n reroot: (prop: string): Filter => ({ $replaceRoot: { newRoot: `$${prop}` } }),\n concat: (...props: string[]): Optional<Filter> => ifNotEmpty(props, ps => ({ $concatArrays: ps.map(p => `$${p}`) })),\n },\n facet: {\n facet: (f: Record<string, OneOrMore<Get<Optional<Filter>, string>>>) => ({ $facet: stages.decode.fieldsArrays(f) }),\n unwind: (from?: string) => (f?: string) => ({ $unwind: `$${from ?? f}` }),\n count: (from?: string) => (f?: string) => ({ $sortByCount: `$${from ?? f}` }),\n data: () => [],\n },\n unwind: {\n unwind: (prop?: string) => ({ $unwind: `$${prop}` }),\n },\n};\n","import { choose, DateTime, isArray, isDate, isDateTime, isIsoDateString, isObject, Json, meta } from '@thisisagile/easy';\n\nexport const toMongoType = (input: unknown): Json =>\n choose(input)\n .type(isIsoDateString, i => new DateTime(i).toDate() as any)\n .type(isDateTime, i => i.toDate() as any)\n .type(isArray, a => a.map((i: any) => toMongoType(i)))\n .type(isDate, d => d)\n .type(isObject, o =>\n Object.fromEntries(\n meta(o)\n .entries()\n .map(([k, i]) => [k, toMongoType(i)])\n )\n )\n .else(input);\n","import { Filter, FindOptions, MongoProvider } from './MongoProvider';\nimport {\n asJson,\n Condition,\n Gateway,\n Id,\n ifDefined,\n isDefined,\n isPresent,\n Json,\n JsonValue,\n List,\n LogicalCondition,\n Optional,\n PageList,\n toArray,\n} from '@thisisagile/easy';\nimport { Collection } from './Collection';\nimport { stages } from './Stages';\n\nexport class MongoGateway implements Gateway<FindOptions> {\n constructor(readonly collection: Collection, readonly provider: MongoProvider = collection.provider) {}\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.all(options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byId(id: Id): Promise<Json | undefined> {\n return this.provider.byId(id).then(j => ifDefined(j, this.collection.in(j)));\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.by(key, value, options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byIds(...ids: Id[]): Promise<List<Json>> {\n return this.find(this.collection.id.isIn(...ids));\n }\n\n find(q: JsonValue | Condition | LogicalCondition, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.find(asJson(q), options).then(js => js.map(j => this.collection.in(j)));\n }\n\n search(q: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find(this.collection.google(q), options);\n }\n\n filter(options?: FindOptions): Promise<PageList<Json>> {\n return this.all(options);\n }\n\n exists(id: Id): Promise<boolean> {\n return this.provider.byId(id).then(i => isDefined(i));\n }\n\n aggregate(...filters: Optional<Filter>[]): Promise<PageList<Json>> {\n return this.provider.aggregate(toArray(...filters).filter(isPresent) as Filter[]);\n }\n\n count(...filters: Optional<Filter>[]): Promise<number> {\n return this.aggregate(...filters, { $count: 'total' }).then(d => (d.first()?.total as number) ?? 0);\n }\n\n match(f: Filter): Promise<PageList<Json>> {\n return this.aggregate(stages.match.match(f));\n }\n\n add(item: Json): Promise<Json> {\n return this.provider.add(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n update(item: Json): Promise<Json> {\n return this.provider.update(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.provider.remove(id);\n }\n}\n","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<{\n should?: Clauses;\n filter?: Clauses;\n must?: Clauses;\n mustNot?: Clauses;\n sort?: Record<string, 1 | -1>;\n facet?: Facet;\n }>\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, wildcard = true): Partial<Compound> =>\n ifNotEmpty(\n entries({\n should: should(query, def),\n filter: filter(query, def),\n mustNot: mustNot(query, def),\n must: must(query, def),\n }).filter(([_, v]) => v.length > 0),\n e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),\n () =>\n ifTrue(wildcard, () => ({\n should: lucene.clauses([{ r: { exists: { path: 'id' } } }]),\n minimumShouldMatch: 0,\n }))\n ),\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: {\n ...ifDefined(index, { index }),\n compound: lucene.compound(query, options),\n ...ifDefined(sort, { sort }),\n count: { type: count },\n },\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, includeLimit?: boolean): Operator =>\n (path: string) => {\n const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };\n return {\n range: {\n path,\n gte: toMongoType(after),\n ...upperLimit,\n },\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","import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { asNumber, entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\nimport { Filter as MongoFilter} from '../src/MongoProvider';\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>, additionalStages: MongoFilter[] = []): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(\n searchWithDef(query, this.searchDef),\n skip({ skip: (query?.skip as number) ?? 0 }),\n take({ take: (query?.take as number) ?? 250 }),\n ...additionalStages\n ),\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() }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: asNumber(meta?.total, 0),\n skip: asNumber(query?.skip, 0),\n take: asNumber(query?.take, 250),\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n }\n}\n","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","import {\n asJson,\n asNumber,\n asString,\n choose,\n Condition,\n Database,\n entries,\n Exception,\n FetchOptions,\n Field,\n Id,\n ifTrue,\n isArray,\n isDefined,\n isField,\n isSortCondition,\n json,\n Json,\n JsonValue,\n LogicalCondition,\n OneOrMore,\n PageList,\n Sort,\n toArray,\n toPageList,\n tuple2,\n tuple3,\n use,\n when,\n} from '@thisisagile/easy';\nimport {\n AggregationCursor,\n Collection as MongoCollection,\n CreateIndexesOptions,\n Document,\n FindCursor,\n FindOptions as MongoFindOptions,\n IndexSpecification,\n MongoClient,\n StrictFilter as MongoFilter,\n} from 'mongodb';\nimport { Collection } from './Collection';\nimport { toMongoType } from './Utils';\n\nconst omitId = (j: Json): Json => json.delete(j, '_id');\n\nexport type Projection = Record<string, 0 | 1>;\nexport type FindOptions = FetchOptions & { projection?: Projection };\nexport type Filter<T = unknown> = MongoFilter<T>;\nexport type Query = Condition | LogicalCondition | Filter<any>;\n\nexport type IndexOptions = {\n unique?: boolean;\n filter?: Query;\n languageOverride?: string;\n languageDefault?: string;\n};\n\nexport type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;\n\nexport type Options = { maxTimeMS?: number };\n\nfunction omitOptions(obj?: FindOptions & Options): Omit<FindOptions & Options, keyof Options> {\n const { maxTimeMS, ...rest } = obj ?? ({} as Options);\n return rest;\n}\n\nexport class MongoProvider {\n protected static readonly clients: { [key: string]: Promise<MongoClient> } = {};\n\n constructor(readonly coll: Collection) {}\n\n static destroyAll(): Promise<void> {\n return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.then(c => c.close()).then(() => delete MongoProvider.clients[u]))).then(\n () => undefined\n );\n }\n\n private static connect(u: string, db: Database) {\n return MongoClient.connect(u, {\n auth: {\n username: asString(db.options?.user),\n password: asString(db.options?.password),\n },\n ...(db.options?.maxPoolSize && { maxPoolSize: db.options?.maxPoolSize }),\n ...(db.options?.minPoolSize && { minPoolSize: db.options?.minPoolSize }),\n ...(db.options?.maxIdleTimeMS && { maxIdleTimeMS: db.options?.maxIdleTimeMS }),\n ...(db.options?.socketTimeoutMS && { socketTimeoutMS: db.options?.socketTimeoutMS }),\n })\n .then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n })\n .catch(err => {\n delete MongoProvider.clients[u];\n return Promise.reject(err);\n });\n }\n\n cluster(): Promise<MongoClient> {\n return use(this.coll.db, db =>\n when(db.options?.cluster)\n .not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'))\n .then(c => MongoProvider.clients[c] ?? (MongoProvider.clients[c] = MongoProvider.connect(c, db)))\n );\n }\n\n collection<T extends Document = Document>(): Promise<MongoCollection<T>> {\n return this.cluster()\n .then(c => c.db(this.coll.db.name))\n .then(db => db.collection<T>(asString(this.coll)));\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n withTimeout(options?: Partial<FindOptions & Options>): Partial<FindOptions> & Options {\n return { ...options, maxTimeMS: options?.maxTimeMS ?? this.coll.db?.options?.queryTimeoutMS ?? 30000 };\n }\n\n find(query: Query, options?: FindOptions & Options): Promise<PageList<Json>> {\n return tuple3(this.collection(), this.toMongoJson(query), this.toFindOptions(options))\n .then(([c, q, o]) =>\n tuple2(\n c.find(q, o),\n ifTrue(o.total, () => c.countDocuments(q, { maxTimeMS: this.withTimeout(options).maxTimeMS }))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...omitOptions(options), total }));\n }\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.find({}, options);\n }\n\n byId(id: Id, options?: FindOptions): Promise<Json> {\n return this.collection().then(c => c.findOne(this.toMongoJson({ id: id }), this.toFindOptions(options)) as Promise<Json>);\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find({ [key]: value }, options);\n }\n\n group(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.aggregate(qs, options);\n }\n\n aggregate(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.collection()\n .then(c =>\n c.aggregate(\n qs.map(q => this.toMongoJson(q)),\n this.withTimeout(options)\n )\n )\n .then(res => this.toArray(res));\n }\n\n add(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.insertOne(omitId(item)))\n .then(() => omitId(item));\n }\n\n update(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.updateOne(this.toMongoJson({ id: item.id }), { $set: omitId(item) }))\n .then(() => this.byId(item.id as Id));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.collection()\n .then(c => c.deleteOne(this.toMongoJson({ id })))\n .then(d => d.acknowledged);\n }\n\n count(query?: Query, options?: Options): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {}), this.withTimeout(options)));\n }\n\n createIndex(indexes: Indexes, options?: IndexOptions): Promise<string> {\n return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));\n }\n\n createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string> {\n return this.createIndex(indexes, { ...options, filter });\n }\n\n createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string> {\n const ii = toArray(indexes).reduce((i, f) => ({ ...i, [asString(f)]: 'text' }), {});\n return this.createIndex(ii, { unique: false, ...options });\n }\n\n protected toFindOptions(options?: FindOptions): MongoFindOptions & { total: boolean } {\n return {\n limit: asNumber(options?.take ?? 250),\n ...(options?.skip && { skip: asNumber(options?.skip) }),\n ...((options?.sorts && { sort: options?.sorts }) || (options?.sort && { sort: this.coll.sort(...(options?.sort ?? [])) })),\n total: isDefined(options?.skip) || isDefined(options?.take),\n projection: options?.projection ?? { _id: 0 },\n maxTimeMS: this.withTimeout(options).maxTimeMS,\n };\n }\n\n protected toIndexSpecification(index: Indexes): IndexSpecification {\n return choose(index)\n .type(isField, f => f.property as IndexSpecification)\n .type(isSortCondition, s => s.toJSON() as IndexSpecification)\n .type(isArray, aa => aa.map(a => this.toIndexSpecification(a)) as IndexSpecification)\n .else(i => i as IndexSpecification);\n }\n\n protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions {\n return {\n unique: options?.unique ?? true,\n ...(options?.languageOverride && { language_override: options.languageOverride }),\n ...(options?.languageDefault && { default_language: options.languageDefault }),\n ...(options?.filter && { partialFilterExpression: toMongoType(asJson(options.filter)) }),\n };\n }\n\n protected toArray(\n cursor: FindCursor<Document> | AggregationCursor<Document>,\n options?: { take?: number; skip?: number; total?: number }\n ): Promise<PageList<Json>> {\n return cursor.toArray().then(r => toPageList<Json>(r, options));\n }\n}\n"],"mappings":"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","names":["import_easy","v","import_easy","import_easy","import_easy","facets","meta","import_easy","import_easy","c","filter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-mongo",
3
- "version": "17.30.0",
3
+ "version": "17.30.2",
4
4
  "description": "Add support for MongoDB",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "@thisisagile/easy-test": "*"
38
38
  },
39
39
  "dependencies": {
40
- "@thisisagile/easy": "^17.30.0",
40
+ "@thisisagile/easy": "^17.30.2",
41
41
  "mongodb": "^6.17.0"
42
42
  }
43
43
  }
package/src/Lucene.ts CHANGED
@@ -74,7 +74,7 @@ export const lucene = {
74
74
  e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),
75
75
  () =>
76
76
  ifTrue(wildcard, () => ({
77
- should: lucene.clauses([{ wildcard: lucene.wildcard() }]),
77
+ should: lucene.clauses([{ r: { exists: { path: 'id' } } }]),
78
78
  minimumShouldMatch: 0,
79
79
  }))
80
80
  ),
@@ -1 +0,0 @@
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<{\n should?: Clauses;\n filter?: Clauses;\n must?: Clauses;\n mustNot?: Clauses;\n sort?: Record<string, 1 | -1>;\n facet?: Facet;\n }>\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, wildcard = true): Partial<Compound> =>\n ifNotEmpty(\n entries({\n should: should(query, def),\n filter: filter(query, def),\n mustNot: mustNot(query, def),\n must: must(query, def),\n }).filter(([_, v]) => v.length > 0),\n e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),\n () =>\n ifTrue(wildcard, () => ({\n should: lucene.clauses([{ wildcard: lucene.wildcard() }]),\n minimumShouldMatch: 0,\n }))\n ),\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: {\n ...ifDefined(index, { index }),\n compound: lucene.compound(query, options),\n ...ifDefined(sort, { sort }),\n count: { type: count },\n },\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, includeLimit?: boolean): Operator =>\n (path: string) => {\n const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };\n return {\n range: {\n path,\n gte: toMongoType(after),\n ...upperLimit,\n },\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":[]}