code: public static void traverse(Expression expression, EntityMetadata m, KunderaMetadata kunderaMetadata,
              KunderaQuery kunderaQuery, boolean isSubExpression)
      {
  
          if (ComparisonExpression.class.isAssignableFrom(expression.getClass()))
          {
              onComparisonExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (NullComparisonExpression.class.isAssignableFrom(expression.getClass()))
          {
              onNullComparisonExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (LogicalExpression.class.isAssignableFrom(expression.getClass()))
          {
              onLogicalExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (InExpression.class.isAssignableFrom(expression.getClass()))
          {
              onInExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (LikeExpression.class.isAssignableFrom(expression.getClass()))
          {
              onLikeExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (RegexpExpression.class.isAssignableFrom(expression.getClass()))
          {
              onRegExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (BetweenExpression.class.isAssignableFrom(expression.getClass()))
          {
              onBetweenExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
          else if (SubExpression.class.isAssignableFrom(expression.getClass()))
          {
              onSubExpression(expression, m, kunderaMetadata, kunderaQuery);
          }
  
      }
docs: Traverse.
  
  @param expression
  the expression
  @param m
  the m
  @param idColumn
  the id column
  @return the filter