docs: function(str) {
        // Return cached query if found
        var query = this.cleanQuery(str);
        if(this.queryCache[query]) return this.queryCache[query];
        // Create query instance
        var parsedQuery = new SpahQL.Query();
            parsedQuery.rawString = str;
        
        // Pull tokens from the query. Expecting (TOKEN_SELECTOR_QUERY|TOKEN_SET_LITERAL)[,TOKEN_COMPARISON_OPERATOR,(TOKEN_SELECTOR_QUERY|TOKEN_SET_LITERAL)]
        var readAheadResult;
        var i = 0;
        while(readAheadResult = SpahQL.Token.parseAt(i, query)) {
          var windAhead = readAheadResult[0];
          var token = readAheadResult[1];
          
          if(token instanceof SpahQL.Token.ComparisonOperator) {
            if(parsedQuery.comparisonOperator) {
              this.throwParseAt(i, query, "Found unexpected TOKEN_COMPARISON_OPERATOR, expected EOL");
            }
            else if(!parsedQuery.primaryToken || (parsedQuery.primaryToken && parsedQuery.secondaryToken)) {
              this.throwParseAt(i, query, "Found unexpected TOKEN_COMPARISON_OPERATOR, expected evaluatable token type");
            }
            else {
              parsedQuery.comparisonOperator = token;
              parsedQuery.assertion = true;
            }
          }
          else {
            // Cast to set
            if(typeof(token.toSet) == "function") {
              token = token.toSet();
            }
            
            if(parsedQuery.primaryToken) {
              if(parsedQuery.comparisonOperator) {
                if(parsedQuery.secondaryToken) {
                  this.throwParseErrorAt(i, query, "Unexpected token, expected EOL");
                }
                else {
                  parsedQuery.secondaryToken = token;
                }
              }
              else {
                console.log("!!!", parsedQuery);
                this.throwParseErrorAt(i, query, "Unexpected token, expected EOL or TOKEN_COMPARISON_OPERATOR");
              }
            }
            else {
              parsedQuery.primaryToken = token;
            }
            
          }
          
          i = windAhead;
        }
        
       // Stash and return
       this.queryCache[query] = parsedQuery;
       SpahQL.log("Generated and cached query '"+str+"' ->", parsedQuery);
       return parsedQuery;
     }