Home Manual Reference Source Test Repository

src/searching/builder/TimeserieDatasetBuilder.js

'use strict';

import SearchBuilder from './SearchBuilder';
import FieldFinder from '../../util/searchingFields/FieldFinder';
import WPSearch from '../WPSearch';
export const BASE_URL = 'timeseries';

import checkType from '../../util/formats/check_types'

export const aggregationTypes = ["FIRST", "LAST", "AVG", "MAX", "MIN", "SUM", "COUNT", "GEO_AVG", "VARIANCE", "STD_DEVIATION", "DATE_FOR_MAX", "DATE_FOR_MIN", "DATE_FOR_FIRST", "DATE_FOR_LAST"];

/**
 * Defined a search over timeseries	
 * @example ogapi.timeserieDatasetBuilder(organization, timeserieId)
 */
export default class TimeserieDatasetBuilder extends SearchBuilder {
    /**
     *	@param {!InternalOpenGateAPI} parent - Instance of our InternalOpenGateAPI
     */
    constructor(parent, organization, timeserie) {
        super(parent, {}, new FieldFinder(parent, BASE_URL, { organization: organization, timeserie: timeserie }))
        this._url = BASE_URL + '/provision/organizations/' + organization + '/' + timeserie + '/dataset'
    }

    /**
     * The search request will have 
     * @param {object} select
     * @return {TimeserieDatasetBuilder} 
     */
    select(select) {
        this._builderParams.select = (select || {});
        return this;
    }

    /**
     * Add columns that will be requested
     * @param {array} columns
     * @return {TimeserieDatasetBuilder} 
     */
    columns(columns) {
        checkType._checkArray(columns, 'columns');

        columns.forEach((colTmp) => this.addColumn(colTmp.name || colTmp.column, colTmp.aggregation, colTmp.alias))
    }

    /**
     * Add column that will be requested
     * @param {string} name
     * @param {string} aggregation
     * @param {string} alias
     * @return {TimeserieDatasetBuilder} 
     */
    addColumn(name, aggregation, alias) {
        checkType._checkStringAndPattern(name, "^[a-zA-Z0-9 _-]*$", 'name');

        if (alias) {
            checkType._checkStringAndPattern(alias, "^[a-zA-Z0-9 _-]*$", 'alias');
        }

        if (aggregation) {
            checkType._checkType(aggregation, aggregationTypes, 'aggregation');
        }

        if (!this._builderParams.select) {
            this._builderParams.select = {};
        }

        if (!this._builderParams.select.columns) {
            this._builderParams.select.columns = [];
        }

        this._builderParams.select.columns.push({
            column: name,
            alias: alias || undefined,
            aggregation: aggregation || undefined
        });
    }

    sort() {
        throw new Error('sort not supported');
    }

    group() {
        throw new Error('group not supported');
    }

    // findAllFields() {
    //     throw new Error('findAllFields not supported');
    // }

    /**
     * Build a instance of Search 
     *
     * @example
     *  ogapi.timeserieDatasetBuilder(organization, timeserieId).build()
     * @throws {SearchBuilderError} Throw error on url build
     * @return {Search} 
     */
    build() {
        return new WPSearch(this._parent,
            this._buildUrl(),
            this._buildFilter(),
            this._buildLimit(),
            this._buildSort(),
            this._buildGroup(),
            this._buildSelect(),
            this._builderParams.timeout,
            this._urlParams);
    }
}