code: public OCommandExecutorSQLTraverse parse(final OCommandRequest iRequest) {
      super.parse(iRequest);
  
      final int pos = parseFields();
      if (pos == -1)
        throw new OCommandSQLParsingException("Traverse must have the field list. Use " + getSyntax());
  
      int endPosition = text.length();
      int endP = textUpperCase.indexOf(" " + OCommandExecutorSQLTraverse.KEYWORD_LIMIT, parserGetCurrentPosition());
      if (endP > -1 && endP < endPosition)
        endPosition = endP;
  
      compiledFilter = OSQLEngine.getInstance().parseFromWhereCondition(text.substring(pos, endPosition), context);
      traverse.predicate(compiledFilter);
  
      optimize();
  
      parserSetCurrentPosition(compiledFilter.parserIsEnded() ? endPosition : compiledFilter.parserGetCurrentPosition() + pos);
      parserSkipWhiteSpaces();
  
      if (!parserIsEnded()) {
        if (parserOptionalKeyword(KEYWORD_LIMIT, KEYWORD_SKIP)) {
          final String w = tempResult.toString();
          if (w.equals(KEYWORD_LIMIT))
            parseLimit(w);
          else if (w.equals(KEYWORD_SKIP))
            parseSkip(w);
        }
      }
  
      if (limit == 0 || limit < -1)
        throw new IllegalArgumentException("Limit must be > 0 or = -1 (no limit)");
      else
        traverse.limit(limit);
  
      traverse.context(((OCommandRequestText) iRequest).getContext());
  
      return this;
    }
docs: Compile the filter conditions only the first time.