PL/SQL Code completion enhancements - Code completion for SET and INSERT INTO release701
authorSubhashini Sooriarachchi <subslk@netbeans.org>
Thu, 17 May 2012 16:25:31 +0530
branchrelease701
changeset 2269c6002534798
parent 225 e66f88dfa861
child 227 7aae8609286d
PL/SQL Code completion enhancements - Code completion for SET and INSERT INTO
PLSQL/Completion/src/org/netbeans/modules/plsql/completion/PlsqlContext.java
     1.1 --- a/PLSQL/Completion/src/org/netbeans/modules/plsql/completion/PlsqlContext.java	Tue May 15 16:09:36 2012 +0200
     1.2 +++ b/PLSQL/Completion/src/org/netbeans/modules/plsql/completion/PlsqlContext.java	Thu May 17 16:25:31 2012 +0530
     1.3 @@ -209,12 +209,15 @@
     1.4                 lParenCount++;
     1.5                 previousKeyWordTokenId = null;
     1.6              }
     1.7 -         } else if(tokenId == PlsqlTokenId.KEYWORD) {
     1.8 +         } else if(tokenId == PlsqlTokenId.KEYWORD || "SET".equalsIgnoreCase(value)) {
     1.9              if(rParenCount==0) {
    1.10                 if("WHERE".equalsIgnoreCase(value) || "BY".equalsIgnoreCase(value)) {
    1.11                    //set for where as well as order by and group by
    1.12                    whereFound = true;
    1.13                 } else if("SET".equalsIgnoreCase(value)) {
    1.14 +                   if(whereFound){
    1.15 +                    return ts.offset()+5; 
    1.16 +                   }
    1.17                    setFound = true;
    1.18                 } else if("FROM".equalsIgnoreCase(value)) {
    1.19                   if(whereFound)
    1.20 @@ -274,22 +277,27 @@
    1.21     }
    1.22     
    1.23     private HashMap<String, String> extractAliases(TokenSequence<PlsqlTokenId> ts) {
    1.24 -      //start at the first point after the FROM statement
    1.25 -      //extract list of tables/views and aliases.
    1.26        HashMap<String, String> map = new HashMap<String, String>();
    1.27        int parenCount = 0;
    1.28        String viewName = null;
    1.29        String alias = null;
    1.30        final String SELECT_STATEMENT="select...";
    1.31 +        if(isUpdateStmt(ts.offset())){
    1.32 +            ts.moveIndex(1);            
    1.33 +        }
    1.34        while (ts.moveNext()) {
    1.35           Token<PlsqlTokenId> token = ts.token();
    1.36           PlsqlTokenId tokenID = token.id();
    1.37           String value = token.toString();
    1.38 -         if(tokenID == PlsqlTokenId.OPERATOR && ";".equals(value)) {
    1.39 -            break;
    1.40 +         if(tokenID == PlsqlTokenId.OPERATOR && (";".equals(value) || "=".equals(value))) {
    1.41 +            if("=".equals(value)) 
    1.42 +                viewName = null;
    1.43 +            else
    1.44 +                break;
    1.45           } else if(tokenID == PlsqlTokenId.DOT && viewName!=null) {
    1.46              //schema prefix for the object - ignore the schema
    1.47 -            viewName = null;
    1.48 +             if(!isInsertStmt(ts.offset()))
    1.49 +                viewName = null;
    1.50           } else if(tokenID == PlsqlTokenId.LPAREN) {
    1.51              parenCount++;
    1.52           } else if(tokenID == PlsqlTokenId.RPAREN) {
    1.53 @@ -298,6 +306,8 @@
    1.54              parenCount--;
    1.55              if(parenCount==0 && viewName==null) //closing parenthesis. If viewName != null this is probably an insert into statement...
    1.56                 viewName = SELECT_STATEMENT;
    1.57 +            else
    1.58 +                break;
    1.59           } else if(parenCount==0) {
    1.60              if(tokenID == PlsqlTokenId.IDENTIFIER || tokenID==PlsqlTokenId.STRING_LITERAL) {
    1.61                 if(viewName==null) {
    1.62 @@ -311,8 +321,8 @@
    1.63                 else if(viewName!=null && viewName!=SELECT_STATEMENT) //Yes - this should be "==..." and not equals(...)
    1.64                    selectViewsWithoutAlias.add(viewName);
    1.65                 viewName = alias = null;
    1.66 -            } else if(tokenID==PlsqlTokenId.KEYWORD) {
    1.67 -                break;
    1.68 +            } else if(tokenID==PlsqlTokenId.KEYWORD || "SET".equals(value)) {
    1.69 +                   break;
    1.70              }
    1.71           }
    1.72        }
    1.73 @@ -330,6 +340,22 @@
    1.74        ts.move(caretOffset);
    1.75        return findStmtStart(ts, "SELECT")>-1;
    1.76     }
    1.77 +   
    1.78 +   private boolean isUpdateStmt(int caretOffset) {
    1.79 +      TokenHierarchy tokenHierarchy = TokenHierarchy.get(doc);
    1.80 +      @SuppressWarnings("unchecked")
    1.81 +      TokenSequence<PlsqlTokenId> ts = tokenHierarchy.tokenSequence(PlsqlTokenId.language());
    1.82 +      ts.move(caretOffset);
    1.83 +      return findStmtStart(ts, "UPDATE")>-1;
    1.84 +   }
    1.85 +   
    1.86 +   private boolean isInsertStmt(int caretOffset) {
    1.87 +      TokenHierarchy tokenHierarchy = TokenHierarchy.get(doc);
    1.88 +      @SuppressWarnings("unchecked")
    1.89 +      TokenSequence<PlsqlTokenId> ts = tokenHierarchy.tokenSequence(PlsqlTokenId.language());
    1.90 +      ts.move(caretOffset);
    1.91 +      return findStmtStart(ts, "INSERT")>-1;
    1.92 +   }
    1.93  
    1.94     private boolean isExceptionStmt(int caretOffset) {
    1.95        //for now just return true...