Home Manual Reference Source Test Repository

src/searching/SelectBuilder.js

'use strict';

import Se from './../util/SelectElement';
export default class SelectBuilder {

    /**
     * @example
     * var sb = ogapi.newSelectBuilder()
     */
    constructor() {
        this._selectTemplate = { select: [] };
    }

    /**
     * @example
     * sb.add(Se.element('provision.device.identifier', ['value'], 'identifier'), sb.add(Se.element('device.temperature.value', ['value'])))
     * @param {SelectElement} args - The parameters will be operators of the class SelectElement
     */
    add(...args) {
        for (var i = 0; i < args.length; i++) {
            var input_element = args[i];
            var elements = this._selectTemplate.select;
            if (elements.length === 0) {
                this._selectTemplate.select.push(input_element);
            } else {
                var exists_element = false;
                for (var j = 0; j < elements.length; j++) {
                    var element = elements[j];
                    if (element.name === input_element.name) {
                        exists_element = true;
                        var input_fields = input_element.fields;
                        for (var k = 0; k < input_fields.length; k++) {
                            var input_field = input_fields[i];

                            var fieldExists = false;
                            for (var z = 0; z < element.fields.length; z++) {
                                if (element.fields[z].field === input_field.field) {
                                    fieldExists = true;

                                    if (input_field.alias) {
                                        element.fields[z].alias = input_field.alias;
                                    }

                                     if (input_field.aggregation) {
                                        element.fields[z].aggregation = input_field.aggregation;
                                    }
                                }
                            }

                            if (!fieldExists) {
                                this._selectTemplate.select[j].fields.push(input_field);
                            }
                        }
                    }
                }
                if (!exists_element) {
                    this._selectTemplate.select.push(input_element);
                }
            }
        }
        return this;
    }

}