"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const symbol_1 = require("../helper/symbol"); const query_1 = require("./query"); exports.AND = 'and'; exports.OR = 'or'; exports.NOT = 'not'; exports.NOR = 'nor'; var LOGIC_COMMANDS_LITERAL; (function (LOGIC_COMMANDS_LITERAL) { LOGIC_COMMANDS_LITERAL["AND"] = "and"; LOGIC_COMMANDS_LITERAL["OR"] = "or"; LOGIC_COMMANDS_LITERAL["NOT"] = "not"; LOGIC_COMMANDS_LITERAL["NOR"] = "nor"; })(LOGIC_COMMANDS_LITERAL = exports.LOGIC_COMMANDS_LITERAL || (exports.LOGIC_COMMANDS_LITERAL = {})); class LogicCommand { constructor(operator, operands, fieldName) { this._internalType = symbol_1.SYMBOL_LOGIC_COMMAND; Object.defineProperties(this, { _internalType: { enumerable: false, configurable: false, }, }); this.operator = operator; this.operands = operands; this.fieldName = fieldName || symbol_1.SYMBOL_UNSET_FIELD_NAME; if (this.fieldName !== symbol_1.SYMBOL_UNSET_FIELD_NAME) { if (Array.isArray(operands)) { operands = operands.slice(); this.operands = operands; for (let i = 0, len = operands.length; i < len; i++) { const query = operands[i]; if (isLogicCommand(query) || query_1.isQueryCommand(query)) { operands[i] = query._setFieldName(this.fieldName); } } } else { const query = operands; if (isLogicCommand(query) || query_1.isQueryCommand(query)) { operands = query._setFieldName(this.fieldName); } } } } _setFieldName(fieldName) { const operands = this.operands.map(operand => { if (operand instanceof LogicCommand) { return operand._setFieldName(fieldName); } else { return operand; } }); const command = new LogicCommand(this.operator, operands, fieldName); return command; } and(...__expressions__) { const expressions = Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments); expressions.unshift(this); return new LogicCommand(LOGIC_COMMANDS_LITERAL.AND, expressions, this.fieldName); } or(...__expressions__) { const expressions = Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments); expressions.unshift(this); return new LogicCommand(LOGIC_COMMANDS_LITERAL.OR, expressions, this.fieldName); } } exports.LogicCommand = LogicCommand; function isLogicCommand(object) { return object && (object instanceof LogicCommand) && (object._internalType === symbol_1.SYMBOL_LOGIC_COMMAND); } exports.isLogicCommand = isLogicCommand; function isKnownLogicCommand(object) { return isLogicCommand && (object.operator.toUpperCase() in LOGIC_COMMANDS_LITERAL); } exports.isKnownLogicCommand = isKnownLogicCommand; exports.default = LogicCommand;