Author: gates
Date: Thu Mar 26 15:34:21 2009
New Revision: 758687

URL: http://svn.apache.org/viewvc?rev=758687&view=rev
Log:
PIG-713 Added alias completion as part of tab completion in grunt.


Added:
    hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletorAliases.java
    hadoop/pig/trunk/src/org/apache/pig/tools/grunt/autocomplete_aliases
Modified:
    hadoop/pig/trunk/CHANGES.txt
    hadoop/pig/trunk/build.xml
    hadoop/pig/trunk/src/org/apache/pig/Main.java
    hadoop/pig/trunk/src/org/apache/pig/PigServer.java
    hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java
    hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletor.java

Modified: hadoop/pig/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/CHANGES.txt?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/CHANGES.txt (original)
+++ hadoop/pig/trunk/CHANGES.txt Thu Mar 26 15:34:21 2009
@@ -53,6 +53,9 @@
        Changed semantics of DEFINE to define last used alias if no argument is
        given (ericg via gates).
 
+       PIG-713 Added alias completion as part of tab completion in grunt (ericg
+       via gates).
+
 IMPROVEMENTS
 
     PIG-270: proper line number for parse errors (daijy via olgan)

Modified: hadoop/pig/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/build.xml?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/build.xml (original)
+++ hadoop/pig/trunk/build.xml Thu Mar 26 15:34:21 2009
@@ -255,6 +255,7 @@
                <classpath refid="${cp}" />
         </javac>
         <copy file="${src.dir}/org/apache/pig/tools/grunt/autocomplete" 
todir="${build.classes}/org/apache/pig/tools/grunt"/>
+        <copy 
file="${src.dir}/org/apache/pig/tools/grunt/autocomplete_aliases" 
todir="${build.classes}/org/apache/pig/tools/grunt"/>
     </target>
         
     <!-- this target is for compilation with all warnings enabled -->

Modified: hadoop/pig/trunk/src/org/apache/pig/Main.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/Main.java?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/Main.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/Main.java Thu Mar 26 15:34:21 2009
@@ -39,7 +39,6 @@
 import org.apache.pig.impl.util.PropertiesUtil;
 import org.apache.pig.tools.cmdline.CmdLineParser;
 import org.apache.pig.tools.grunt.Grunt;
-import org.apache.pig.tools.grunt.PigCompletor;
 import org.apache.pig.impl.util.LogUtils;
 import org.apache.pig.tools.timer.PerformanceTimerFactory;
 import org.apache.pig.tools.parameters.ParameterSubstitutionPreprocessor;
@@ -309,7 +308,6 @@
             // Interactive
             mode = ExecMode.SHELL;
             ConsoleReader reader = new ConsoleReader(System.in, new 
OutputStreamWriter(System.out));
-            reader.addCompletor(new PigCompletor());
             reader.setDefaultPrompt("grunt> ");
             final String HISTORYFILE = ".pig_history";
             String historyFile = System.getProperty("user.home") + 
File.separator  + HISTORYFILE;

Modified: hadoop/pig/trunk/src/org/apache/pig/PigServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/PigServer.java?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/PigServer.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/PigServer.java Thu Mar 26 15:34:21 2009
@@ -32,6 +32,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -663,6 +664,10 @@
         // pigContext.getExecutionEngine().reclaimScope(this.scope);
     }
 
+    public Set<String> getAliasKeySet() {
+        return aliasOp.keySet();
+    }
+
     public Map<LogicalOperator, DataBag> getExamples(String alias) {
         //LogicalPlan plan = aliases.get(aliasOp.get(alias));
         LogicalPlan plan = null;

Modified: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java Thu Mar 26 
15:34:21 2009
@@ -25,12 +25,15 @@
 import java.io.FileOutputStream;
 
 import jline.ConsoleReader;
+import jline.Completor;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pig.PigServer;
 import org.apache.pig.impl.PigContext;
 import org.apache.pig.tools.grunt.GruntParser;
+import org.apache.pig.tools.grunt.PigCompletor;
+import org.apache.pig.tools.grunt.PigCompletorAliases;
 import org.apache.pig.PigException;
 import org.apache.pig.backend.executionengine.ExecException;
 import org.apache.pig.tools.pigscript.parser.*;
@@ -59,8 +62,11 @@
 
     public void setConsoleReader(ConsoleReader c)
     {
+        c.addCompletor(new PigCompletorAliases(pig));
+        c.addCompletor(new PigCompletor());
         parser.setConsoleReader(c);
     }
+
     public void run() {        
         boolean verbose = 
"true".equalsIgnoreCase(pig.getPigContext().getProperties().getProperty("verbose"));
         while(true) {

Modified: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletor.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletor.java?rev=758687&r1=758686&r2=758687&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletor.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletor.java Thu Mar 
26 15:34:21 2009
@@ -50,16 +50,12 @@
             try
             {
                 keywordStream = new FileInputStream(AUTOCOMPLETE_FILENAME);
+                PigCompletor.loadCandidateKeywords(keywordStream, candidates);
             }
             catch (FileNotFoundException e)
             {
                 log.debug("Can not find autocomplete file in current 
directory, skipped");
             }
-            if (keywordStream!=null)
-            {
-                processKeywordStream(keywordStream);
-                keywordStream.close();
-            }
             
             // try to find all keyword file in CLASSPATH
             Enumeration<URL> itr = 
getClass().getClassLoader().getResources(AUTOCOMPLETE_FILENAME);
@@ -67,30 +63,25 @@
             {
                 URL url = itr.nextElement();
                 keywordStream = url.openStream();
-                if (keywordStream!=null)
-                {
-                    processKeywordStream(keywordStream);
-                    keywordStream.close();
-                }
-                else
+                if (!PigCompletor.loadCandidateKeywords(keywordStream, 
candidates))
                     log.debug("Error loading " + url + ", skipped");
             }
             
             // try to use default keyword file
             keywordStream = 
getClass().getResourceAsStream("/org/apache/pig/tools/grunt/autocomplete");
-            if (keywordStream!=null)
-            {
-                processKeywordStream(keywordStream);
-                keywordStream.close();
+            PigCompletor.loadCandidateKeywords(keywordStream, candidates);
             }
-        }
         catch (IOException e) {
             log.warn("Error occurs when reading internal autocomplete file, 
skipped");
         }
     }
 
-    private void processKeywordStream(InputStream stream) throws IOException
+    public static boolean loadCandidateKeywords(InputStream stream, 
Set<String> candidates)
+    throws IOException
     {
+        if (stream==null)
+          return false;
+
         BufferedReader reader = new BufferedReader(new 
InputStreamReader(stream));
         String line;
         while ((line=reader.readLine())!=null)
@@ -99,28 +90,18 @@
             {
                 line = line.trim();
                 if (!line.equals(""))
-                    addCandidateString(line);
+                    candidates.add(line);
             }
                 
         }
         reader.close();
-    }
-
-    public void addCandidateString(final String candidateString) {
-        for (int i=0;i<candidateString.length();i++)
-        {
-            if (isDelimit(candidateString.charAt(i)))
-            {
-                log.warn("Auto-complete keyword \"" + candidateString + "\" is 
skipped because it contains white spaces");
-                return;
-            }
-        }
-        candidates.add(candidateString);
+        stream.close();
+        return true;
     }
 
     public int complete(String buffer, int cursor, List candidates) {
         if (cursor == 0)
-            return 0;
+            return -1;
         int p = cursor;
         p--;
         while (p > 0) {
@@ -138,12 +119,17 @@
         if (!sb.toString().equals("")) {
             List<String> matches = searchCandidate(sb.toString());
             if (matches != null) {
+                if(matches.size()==1) {
+                    candidates.add(matches.get(0)+" ");
+                }
+                else {
                 for (String match:matches)
                     candidates.add(match);
+                }
                 return p;
             }
         }
-        return 0;
+        return -1;
     }
 
     private boolean isDelimit(char c) {
@@ -155,7 +141,7 @@
     private List<String> searchCandidate(String s) {
         List<String> list = new ArrayList<String>();
         for (String can : candidates) {
-            if (can.startsWith(s) && !can.equals(s))
+            if (can.startsWith(s))
                 list.add(can);
         }
         return list;

Added: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletorAliases.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletorAliases.java?rev=758687&view=auto
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletorAliases.java 
(added)
+++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/PigCompletorAliases.java 
Thu Mar 26 15:34:21 2009
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pig.tools.grunt;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.pig.PigServer;
+
+import jline.Completor;
+
+public class PigCompletorAliases implements Completor {
+    private final Log log = LogFactory.getLog(getClass());
+    Set<String> keywords;
+    PigServer pig;
+
+    public PigCompletorAliases(PigServer server)
+    {
+        keywords = new TreeSet<String>();
+        pig = server;
+        try {
+            InputStream keywordStream = 
getClass().getResourceAsStream("/org/apache/pig/tools/grunt/autocomplete_aliases");
+            PigCompletor.loadCandidateKeywords(keywordStream, keywords);
+        }
+        catch (IOException e) {
+            log.warn("Error occurs when reading internal autocomplete_aliases 
file, skipped");
+        }
+    }
+
+    public int complete(String buffer, int cursor, List candidates)
+    {
+        if (cursor == 0)
+            return -1;
+
+        String[] tokens = buffer.split("\\s+");
+        if (tokens.length==0)
+            return -1;
+        if (keywords.contains(tokens[tokens.length-1])) {
+            for (String c : pig.getAliasKeySet()) {
+                candidates.add(c);
+            }
+            return cursor;
+        }
+
+        if (tokens.length==1)
+            return -1;
+
+        if (!keywords.contains(tokens[tokens.length-2]))
+            return -1;
+
+        if (keywords.isEmpty()) {
+            return cursor;
+        }
+
+        int p = cursor;
+        p--;
+        while (p > 0) {
+            char c = buffer.charAt(p);
+            if (Character.isWhitespace(c)) {
+                p++;
+                break;
+            }
+            p--;
+        }
+        StringBuffer sb = new StringBuffer();
+        for (int i = p; i < cursor; i++) {
+            sb.append(buffer.charAt(i));
+        }
+        if (!sb.toString().equals("")) {
+            List<String> matches = searchCandidate(sb.toString());
+            if (matches != null) {
+                candidates.addAll(matches);
+                return p;
+            }
+        }
+        return -1;
+    }
+
+    private List<String> searchCandidate(String s)
+    {
+        List<String> list = new ArrayList<String>();
+        for (String can : pig.getAliasKeySet()) {
+            if (can.startsWith(s) && !can.equals(s))
+                list.add(can);
+        }
+        return list;
+    }
+}

Added: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/autocomplete_aliases
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/autocomplete_aliases?rev=758687&view=auto
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/autocomplete_aliases (added)
+++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/autocomplete_aliases Thu 
Mar 26 15:34:21 2009
@@ -0,0 +1,30 @@
+filter
+foreach
+order
+distinct
+cogroup
+join
+cross
+union
+split
+group
+flatten
+dump
+describe
+explain
+store
+FILTER
+FOREACH
+ORDER
+DISTINCT
+COGROUP
+JOIN
+CROSS
+UNION
+SPLIT
+GROUP
+FLATTEN
+DUMP
+DESCRIBE
+EXPLAIN
+STORE


Reply via email to