From cf2c0c32972fb6601d499877f6d44c2f71f36225 Mon Sep 17 00:00:00 2001 From: delvedor Date: Thu, 10 Sep 2020 17:34:20 +0200 Subject: [PATCH] Improved sort method --- dsl/src/fluent.ts | 11 +++++++++-- dsl/src/query.ts | 25 +++++++++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/dsl/src/fluent.ts b/dsl/src/fluent.ts index 78e70ac3c..59ac35d5e 100644 --- a/dsl/src/fluent.ts +++ b/dsl/src/fluent.ts @@ -274,8 +274,10 @@ class FluentQ { return this } - sort (key: string | any[], opts: Record): this - sort (key: string | any[], opts: any): this { + sort (key: string | string[]): this + sort (key: string | string[], order: T.SortOrder): this + sort (key: string | string[], opts: T.Sort): this + sort (key: string | string[], opts?: any): this { this[kState].push(Q.sort(key, opts)) return this } @@ -289,6 +291,11 @@ class FluentQ { this[kState].push(A(...aggregations)) return this } + + raw (obj: Record): this { + this[kState].push(obj) + return this + } } export default function build () { diff --git a/dsl/src/query.ts b/dsl/src/query.ts index fec5ff206..c3a6e83f3 100644 --- a/dsl/src/query.ts +++ b/dsl/src/query.ts @@ -85,8 +85,14 @@ function Q (...blocks: (SearchRequest | T.QueryContainer | T.QueryContainer[] | for (const block of blocks) { const key = Object.keys(block)[0] if (topLevelKeys.includes(key)) { - // @ts-expect-error - body[key] = block[key] + if (key === 'sort') { + body.sort = body.sort || [] + // @ts-expect-error + body.sort.push.apply(body.sort, block[key]) + } else { + // @ts-expect-error + body[key] = block[key] + } } } @@ -577,14 +583,17 @@ namespace Q { return { boosting: boostOpts } } - export function sort (key: string | any[], opts: Record | string): Record | Record[] { - if (Array.isArray(key) === true) { - return { sort: key } + export function sort (key: string | string[]): { sort: string[] } + export function sort (key: string | string[], order: T.SortOrder): { sort: Record[] } + export function sort (key: string | string[], opts: T.Sort): { sort: Record[] } + export function sort (key: string | string[], opts?: any): any { + if (opts == null) { + return { sort: Array.isArray(key) ? key : [key] } } - return { - // @ts-ignore - sort: [{ [key]: opts }] + if (Array.isArray(key)) { + return { sort: key.map(k => ({ [k]: opts })) } } + return { sort: [{ [key]: opts }] } } export function size (s: number | Symbol): { size: number } {