UNPKG

elastic-builder

Version:

A JavaScript implementation of the elasticsearch Query DSL

140 lines (122 loc) 4.28 kB
'use strict'; const isEmpty = require('lodash.isempty'); const isNil = require('lodash.isnil'); const { util: { invalidParam, recursiveToJSON } } = require('../../../core'); const invalidOrderParam = invalidParam('', 'order', "'asc' or 'desc'"); /** * Base class implementation for all Composite Aggregation values sources. * * **NOTE:** Instantiating this directly should not be required. * * @param {string} valueSrcType Type of value source * @param {string} refUrl Elasticsearch reference URL * @param {string} name * @param {string=} field The field to aggregate on * * @throws {Error} if `name` is empty * @throws {Error} if `valueSrcType` is empty */ class ValuesSourceBase { // eslint-disable-next-line require-jsdoc constructor(valueSrcType, refUrl, name, field) { if (isEmpty(valueSrcType)) throw new Error('ValuesSourceBase `valueSrcType` cannot be empty'); this._name = name; this._valueSrcType = valueSrcType; this._refUrl = refUrl; this._body = {}; this._opts = this._body[valueSrcType] = {}; if (!isNil(field)) this._opts.field = field; } /** * Field to use for this source. * * @param {string} field a valid field name * @returns {ValuesSourceBase} returns `this` so that calls can be chained */ field(field) { this._opts.field = field; return this; } /** * Script to use for this source. * * @param {Script|Object|string} script * @returns {ValuesSourceBase} returns `this` so that calls can be chained * @throws {TypeError} If `script` is not an instance of `Script` */ script(script) { this._opts.script = script; return this; } /** * Specifies the type of values produced by this source, e.g. `string` or * `date`. * * @param {string} valueType * @returns {ValuesSourceBase} returns `this` so that calls can be chained */ valueType(valueType) { this._opts.value_type = valueType; return this; } /** * Order specifies the order in the values produced by this source. It can * be either `asc` or `desc`. * * @param {string} order The `order` option can have the following values. * `asc`, `desc` to sort in ascending, descending order respectively. * @returns {ValuesSourceBase} returns `this` so that calls can be chained. */ order(order) { if (isNil(order)) invalidOrderParam(order, this._refUrl); const orderLower = order.toLowerCase(); if (orderLower !== 'asc' && orderLower !== 'desc') { invalidOrderParam(order, this._refUrl); } this._opts.order = orderLower; return this; } /** * Missing specifies the value to use when the source finds a missing value * in a document. * * Note: This option was deprecated in * [Elasticsearch v6](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/breaking-changes-6.0.html#_literal_missing_literal_is_deprecated_in_the_literal_composite_literal_aggregation). * From 6.4 and later, use `missing_bucket` instead. * * @param {string|number} value * @returns {ValuesSourceBase} returns `this` so that calls can be chained */ missing(value) { this._opts.missing = value; return this; } /** * Specifies whether to include documents without a value for a given source * in the response. Defaults to `false` (not included). * * Note: This method is incompatible with elasticsearch 6.3 and older. * Use it only with elasticsearch 6.4 and later. * * @param {boolean} value * @returns {ValuesSourceBase} returns `this` so that calls can be chained */ missingBucket(value) { this._opts.missing_bucket = value; return this; } /** * Override default `toJSON` to return DSL representation for the Composite * Aggregation values source. * * @override * @returns {Object} returns an Object which maps to the elasticsearch query DSL */ toJSON() { return { [this._name]: recursiveToJSON(this._body) }; } } module.exports = ValuesSourceBase;