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;
});