package org.infinispan.query.objectfilter.impl.syntax;

/**
 * Visitor interface for expressions.
 *
 * @param <BE> is the return type when visiting a boolean expression (an expression that produces a {@link Boolean})
 * @param <VE> is the return type when visiting a value expression (an expression that produces an arbitrary {@link
 *             Object})
 * @author anistor@redhat.com
 * @since 7.0
 */
public interface Visitor<BE, VE> {

   BE visit(FullTextOccurExpr fullTextOccurExpr);

   BE visit(FullTextBoostExpr fullTextBoostExpr);

   BE visit(FullTextTermExpr fullTextTermExpr);

   BE visit(FullTextRegexpExpr fullTextRegexpExpr);

   BE visit(FullTextRangeExpr fullTextRangeExpr);

   BE visit(KnnPredicate knnPredicate);

   BE visit(SpatialWithinCircleExpr spatialWithinCircleExpr);

   BE visit(SpatialWithinBoxExpr spatialWithinBoxExpr);

   BE visit(SpatialWithinPolygonExpr spatialWithinPolygonExpr);

   BE visit(NotExpr notExpr);

   BE visit(OrExpr orExpr);

   BE visit(AndExpr andExpr);

   BE visit(ConstantBooleanExpr constantBooleanExpr);

   BE visit(IsNullExpr isNullExpr);

   BE visit(ComparisonExpr comparisonExpr);

   BE visit(BetweenExpr betweenExpr);

   BE visit(LikeExpr likeExpr);

   VE visit(ConstantValueExpr constantValueExpr);

   VE visit(PropertyValueExpr propertyValueExpr);

   VE visit(AggregationExpr aggregationExpr);

   BE visit(NestedExpr nestedExpr);

}
