示例#1
0
  private void parseModelClause(OracleSelectQueryBlock queryBlock) {
    if (lexer.token() != Token.MODEL) {
      return;
    }

    lexer.nextToken();

    ModelClause model = new ModelClause();
    parseCellReferenceOptions(model.getCellReferenceOptions());

    if (identifierEquals("RETURN")) {
      lexer.nextToken();
      ReturnRowsClause returnRowsClause = new ReturnRowsClause();
      if (lexer.token() == Token.ALL) {
        lexer.nextToken();
        returnRowsClause.setAll(true);
      } else {
        acceptIdentifier("UPDATED");
      }
      acceptIdentifier("ROWS");

      model.setReturnRowsClause(returnRowsClause);
    }

    while (lexer.token() == Token.REFERENCE) {
      ReferenceModelClause referenceModelClause = new ReferenceModelClause();
      lexer.nextToken();

      SQLExpr name = expr();
      referenceModelClause.setName(name);

      accept(Token.ON);
      accept(Token.LPAREN);
      OracleSelect subQuery = this.select();
      accept(Token.RPAREN);
      referenceModelClause.setSubQuery(subQuery);

      parseModelColumnClause(referenceModelClause);

      parseCellReferenceOptions(referenceModelClause.getCellReferenceOptions());

      model.getReferenceModelClauses().add(referenceModelClause);
    }

    parseMainModelClause(model);

    queryBlock.setModelClause(model);
  }