JavaScript Extension Development API for Oracle Visual Builder Cloud Service - Classic Applications

Source: bop/js/spi/operation/ConditionVisitor.js

define([], function () {

    'use strict';

    /**
     * Represents visitor for interpreting input {@link operation/js/api/Condition Condition}s.
     *
     * <p>
     * Allows author of the {@link bop/js/spi/BOP BOP} to interpret incoming {@link operation/js/api/Condition Condition}s and transform them into proper URL query or generally process them any way (s)he need.
     * </p>
     *
     * @AbcsExtension stable
     * @version 17.1.1
     * @exports bop/js/spi/operation/ConditionVisitor
     *
     * @constructor
     * @private
     *
     * @see {@link bop/js/api/operation/OperationBuilder OperationBuilder}
     * @see {@link operation/js/api/Condition Condition}
     * @see {@link operation/js/api/Condition#visit Condition.visit(..)}
     *
     * @example
     * <caption>
     *  Interpret {@link operation/js/api/Condition Condition} instances and create URL-like suffix composed of the individual filtering rules.
     * </caption>
     *
     * define([
     *     'bop/js/spi/operation/ConditionVisitor',
     *     'bop/js/api/operation/RelationOperator',
     *     'operation/js/api/Operator'
     * ], function (
     *     ConditionVisitor,
     *     RelationOperator,
     *     Operator
     * ) {
     *
     *     var MyConditionVisitor = function() {
     *     };
     *
     *     MyConditionVisitor.prototype.visitEmptyCondition = function() {
     *         // See example presented in visitEmptyCondition(..) JSDoc
     *     };
     *
     *     MyConditionVisitor.prototype.visitSimpleCondition = function(condition) {
     *         // See example presented in visitSimpleCondition(..) JSDoc
     *     };
     *
     *     MyConditionVisitor.prototype.visitCompositeCondition = function(condition) {
     *         // See example presented in visitCompositeCondition(..) JSDoc
     *     };
     *
     *     return MyConditionVisitor;
     * });
     */
    var ConditionVisitor = function() {
        AbcsLib.checkThis(this);
    };

    /**
     * Visiting method for the case where no {@link operation/js/api/Condition Condition} had been defined.
     *
     * @AbcsExtension stable
     * @version 17.1.1
     *
     * @example
     * <caption>
     *  Interpret case when no {@link operation/js/api/Condition Condition} instance is declared.
     * </caption>
     *
     * MyConditionVisitor.prototype.visitEmptyCondition = function() {
     *     return '';
     * };
     */
    ConditionVisitor.prototype.visitEmptyCondition = function() {};

    /**
     * Visit an instance of {@link bop/js/api/operation/SimpleCondition SimpleCondition}.
     *
     * @AbcsExtension stable
     * @version 17.1.1
     *
     * @param {bop/js/api/operation/SimpleCondition} simpleCondition
     *
     * @see {@link bop/js/api/operation/SimpleCondition SimpleCondition}
     *
     * @example
     * <caption>
     *  Interpret instances of {@link bop/js/api/operation/SimpleCondition SimpleCondition}.
     * </caption>
     *
     * MyConditionVisitor.prototype.visitSimpleCondition = function(condition) {
     *     var propertyID = condition.getProperty().getId();
     *     var operator = condition.getOperator();
     *     var value = condition.getValue();
     *
     *     // For simplification let's assume only two possible operators are available
     *     switch (operator) {
     *         case Operator.EQUALS:
     *             return propertyID + ' equals ' + value;
     *         case Operator.NOT_EQUALS:
     *             return propertyID + ' notEquals ' + value;
     *     }
     * };
     */
    ConditionVisitor.prototype.visitSimpleCondition = function(/*simpleCondition*/) {};

    /**
     * Visit an instance of {@link bop/js/api/operation/CompositeCondition CompositeCondition}.
     *
     * <p>
     * Please be aware that it's your responsibility to check for deeper sub-{@link operation/js/api/Condition Condition}s of the given {@link bop/js/api/operation/CompositeCondition CompositeCondition}
     * and call subsequent {@link bop/js/spi/operation/ConditionVisitor#visitCompositeCondition ConditionVisitor.visitCompositeCondition(..)} and {@link bop/js/spi/operation/ConditionVisitor#visitSimpleCondition ConditionVisitor.visitSimpleCondition(..)}
     * by your own.
     * </p>
     *
     * @AbcsExtension stable
     * @version 17.1.1
     *
     * @param {bop/js/api/operation/CompositeCondition} compositeCondition
     *
     * @see {@link bop/js/api/operation/CompositeCondition CompositeCondition}
     *
     * @example
     * <caption>
     *  Interpret instances of {@link bop/js/api/operation/CompositeCondition CompositeCondition}.
     * </caption>
     *
     * MyConditionVisitor.prototype.visitCompositeCondition = function(compositeCondition) {
     *     var url = '(';
     *     var subConditions = compositeCondition.getSubConditions();
     *
     *     // Iterating over all sub-conditions and visiting them recursively as well
     *     for (var i = 0; i < subConditions.length; i++) {
     *         var subCondition = subConditions[i];
     *         var subConditionArray = subCondition.getSubConditions();
     *         if (subConditionArray && subConditionArray.length > 0) {
     *             url += self.visitCompositeCondition(subCondition);
     *         } else {
     *             url += self.visitSimpleCondition(subCondition);
     *         }
     *
     *         // Skip including relation operator after the last sub-condition
     *         if (i < subConditions.length - 1) {
     *         switch (compositeCondition.getRelationOperator()) {
     *             case RelationOperator.AND:
     *                 url += ' AND ';
     *                 break;
     *             case RelationOperator.OR:
     *                 url += ' OR ';
     *                 break;
     *         }
     *     }
     *     url += ')';
     *     return url;
     * };
     */
    ConditionVisitor.prototype.visitCompositeCondition = function(/*compositeCondition*/) {};

    return ConditionVisitor;

});