You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by pr...@apache.org on 2018/04/02 09:00:31 UTC

zeppelin git commit: [ZEPPELIN-3001] Disable ace editor code completion when backend interpreter support completion

Repository: zeppelin
Updated Branches:
  refs/heads/master aefc7ea39 -> fe07e5a49


[ZEPPELIN-3001] Disable ace editor code completion when backend interpreter support completion

This is what I see in zeppelin and jupyter. The difference is due to zeppelin also add code completion of ace editor. I think code completion of ace editor should only be enabled when the backend interpreter doesn't support completion.

[Bug Fix]

* [ZEPPELIN-3001](https://issues.apache.org/jira/browse/ZEPPELIN-3001)

* Does the licenses files need update? N/A
* Is there breaking changes for older versions? N/A
* Does this needs documentation? N/A

Author: Prabhjyot Singh <pr...@gmail.com>

Closes #2885 from prabhjyotsingh/ZEPPELIN-3001 and squashes the following commits:

fcd551fe1 [Prabhjyot Singh] meta can be either empty string or undefined
e6ad8d1c7 [Prabhjyot Singh] Merge remote-tracking branch 'origin/master' into ZEPPELIN-3001
508cd239c [Prabhjyot Singh] fix websocketMsgSrv.completion paragraph id issue
9380c32fa [Prabhjyot Singh] upgrade ace-builds to 1.3.2
701f93f85 [Prabhjyot Singh] make default suggestion if there is no suggestion from back-end.
97f594dc8 [Prabhjyot Singh] completionSupport false for SparkRInterpreter
d2f70ae7d [Prabhjyot Singh] get completionSupport from interpreter (backend)
adaabcbf9 [Prabhjyot Singh] ZEPPELIN-3001: Disable ace editor code completion when back-end interpreter support completion

Change-Id: I03e39422bafebf9c96b01b88f542a16dd6959f23


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/fe07e5a4
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/fe07e5a4
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/fe07e5a4

Branch: refs/heads/master
Commit: fe07e5a4962f9457fc2aca473511a50a553499b0
Parents: aefc7ea
Author: Prabhjyot Singh <pr...@gmail.com>
Authored: Fri Mar 30 10:26:02 2018 +0530
Committer: Prabhjyot Singh <pr...@gmail.com>
Committed: Mon Apr 2 14:30:15 2018 +0530

----------------------------------------------------------------------
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  4 +
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json | 10 ++-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  4 +
 .../src/main/resources/interpreter-setting.json | 15 ++--
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json | 15 ++--
 sap/src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json |  3 +-
 .../src/main/resources/interpreter-setting.json | 18 +++--
 .../apache/zeppelin/socket/NotebookServer.java  |  8 +-
 zeppelin-web/bower.json                         |  6 +-
 .../notebook/paragraph/paragraph.controller.js  | 82 +++++++++++++++++++-
 20 files changed, 162 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/alluxio/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/alluxio/src/main/resources/interpreter-setting.json b/alluxio/src/main/resources/interpreter-setting.json
index b9ab898..7a8cd62 100644
--- a/alluxio/src/main/resources/interpreter-setting.json
+++ b/alluxio/src/main/resources/interpreter-setting.json
@@ -20,7 +20,8 @@
       }
     },
     "editor": {
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/angular/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/angular/src/main/resources/interpreter-setting.json b/angular/src/main/resources/interpreter-setting.json
index 4ff5978..723348d 100644
--- a/angular/src/main/resources/interpreter-setting.json
+++ b/angular/src/main/resources/interpreter-setting.json
@@ -6,7 +6,8 @@
     "properties": {
     },
     "editor": {
-      "editOnDblClick": true
+      "editOnDblClick": true,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/bigquery/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/bigquery/src/main/resources/interpreter-setting.json b/bigquery/src/main/resources/interpreter-setting.json
index 3e1f27a..8e92ee4 100644
--- a/bigquery/src/main/resources/interpreter-setting.json
+++ b/bigquery/src/main/resources/interpreter-setting.json
@@ -34,7 +34,8 @@
     },
     "editor": {
       "language": "sql",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/elasticsearch/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/elasticsearch/src/main/resources/interpreter-setting.json b/elasticsearch/src/main/resources/interpreter-setting.json
index 6fac719..3e132f2 100644
--- a/elasticsearch/src/main/resources/interpreter-setting.json
+++ b/elasticsearch/src/main/resources/interpreter-setting.json
@@ -55,7 +55,8 @@
       }
     },
     "editor": {
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/file/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/file/src/main/resources/interpreter-setting.json b/file/src/main/resources/interpreter-setting.json
index ebe5cf6..83fcb3d 100644
--- a/file/src/main/resources/interpreter-setting.json
+++ b/file/src/main/resources/interpreter-setting.json
@@ -27,7 +27,8 @@
       }
     },
     "editor": {
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/groovy/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/groovy/src/main/resources/interpreter-setting.json b/groovy/src/main/resources/interpreter-setting.json
index 45aab84..4afec2a 100644
--- a/groovy/src/main/resources/interpreter-setting.json
+++ b/groovy/src/main/resources/interpreter-setting.json
@@ -11,6 +11,10 @@
         "description": "The path for custom groovy classes location. If empty `./interpreter/groovy/classes`",
         "type": "textarea"
       }
+    },
+    "editor": {
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/hbase/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/hbase/src/main/resources/interpreter-setting.json b/hbase/src/main/resources/interpreter-setting.json
index 28dedcc..c5d89f0 100644
--- a/hbase/src/main/resources/interpreter-setting.json
+++ b/hbase/src/main/resources/interpreter-setting.json
@@ -25,7 +25,8 @@
       }
     },
     "editor": {
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/ignite/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/ignite/src/main/resources/interpreter-setting.json b/ignite/src/main/resources/interpreter-setting.json
index 2342a90..3601e15 100644
--- a/ignite/src/main/resources/interpreter-setting.json
+++ b/ignite/src/main/resources/interpreter-setting.json
@@ -32,6 +32,10 @@
         "description": "Peer class loading enabled. True or false",
         "type": "checkbox"
       }
+    },
+    "editor": {
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   },
   { 
@@ -46,6 +50,10 @@
         "description": "Ignite JDBC connection URL.",
         "type": "string"
         }
-    }   
+    },
+    "editor": {
+      "editOnDblClick": false,
+      "completionSupport": false
+    }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/jdbc/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/jdbc/src/main/resources/interpreter-setting.json b/jdbc/src/main/resources/interpreter-setting.json
index abbc1cf..bedd9df 100644
--- a/jdbc/src/main/resources/interpreter-setting.json
+++ b/jdbc/src/main/resources/interpreter-setting.json
@@ -105,7 +105,8 @@
     },
     "editor": {
       "language": "sql",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/kylin/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/kylin/src/main/resources/interpreter-setting.json b/kylin/src/main/resources/interpreter-setting.json
index f5f79f9..88cf369 100644
--- a/kylin/src/main/resources/interpreter-setting.json
+++ b/kylin/src/main/resources/interpreter-setting.json
@@ -56,7 +56,8 @@
     },
     "editor": {
       "language": "sql",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/lens/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/lens/src/main/resources/interpreter-setting.json b/lens/src/main/resources/interpreter-setting.json
index 5d345e6..03fda56 100644
--- a/lens/src/main/resources/interpreter-setting.json
+++ b/lens/src/main/resources/interpreter-setting.json
@@ -53,6 +53,10 @@
         "description": "Hadoop cluster username",
         "type": "string"
       }
+    },
+    "editor": {
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/livy/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/livy/src/main/resources/interpreter-setting.json b/livy/src/main/resources/interpreter-setting.json
index d096c46..8b9b906 100644
--- a/livy/src/main/resources/interpreter-setting.json
+++ b/livy/src/main/resources/interpreter-setting.json
@@ -128,7 +128,8 @@
     "editor": {
       "language": "scala",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -168,7 +169,8 @@
     "editor": {
       "language": "sql",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -189,7 +191,8 @@
     "editor": {
       "language": "python",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -210,7 +213,8 @@
     "editor": {
       "language": "python",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -231,7 +235,8 @@
     "editor": {
       "language": "r",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/markdown/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/markdown/src/main/resources/interpreter-setting.json b/markdown/src/main/resources/interpreter-setting.json
index 9819210..d2a59c8 100644
--- a/markdown/src/main/resources/interpreter-setting.json
+++ b/markdown/src/main/resources/interpreter-setting.json
@@ -14,7 +14,8 @@
     },
     "editor": {
       "language": "markdown",
-      "editOnDblClick": true
+      "editOnDblClick": true,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/python/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/python/src/main/resources/interpreter-setting.json b/python/src/main/resources/interpreter-setting.json
index f36add3..f1e5e49 100644
--- a/python/src/main/resources/interpreter-setting.json
+++ b/python/src/main/resources/interpreter-setting.json
@@ -27,7 +27,8 @@
     },
     "editor": {
       "language": "python",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   },
   {
@@ -51,7 +52,8 @@
     "editor": {
       "language": "python",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -63,7 +65,8 @@
     "editor":{
       "language": "sql",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": false
     }
   },
   {
@@ -74,7 +77,8 @@
     },
     "editor": {
       "language": "sh",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   },
   {
@@ -85,7 +89,8 @@
     },
     "editor":{
       "language": "sh",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/sap/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/sap/src/main/resources/interpreter-setting.json b/sap/src/main/resources/interpreter-setting.json
index cb5cf94..9ab78b8 100644
--- a/sap/src/main/resources/interpreter-setting.json
+++ b/sap/src/main/resources/interpreter-setting.json
@@ -36,7 +36,8 @@
     },
     "editor": {
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/shell/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/shell/src/main/resources/interpreter-setting.json b/shell/src/main/resources/interpreter-setting.json
index a332134..b6784b9 100644
--- a/shell/src/main/resources/interpreter-setting.json
+++ b/shell/src/main/resources/interpreter-setting.json
@@ -49,7 +49,8 @@
     },
     "editor": {
       "language": "sh",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/spark/interpreter/src/main/resources/interpreter-setting.json
----------------------------------------------------------------------
diff --git a/spark/interpreter/src/main/resources/interpreter-setting.json b/spark/interpreter/src/main/resources/interpreter-setting.json
index db3aebb..30ae737 100644
--- a/spark/interpreter/src/main/resources/interpreter-setting.json
+++ b/spark/interpreter/src/main/resources/interpreter-setting.json
@@ -86,7 +86,8 @@
     "editor": {
       "language": "scala",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -133,7 +134,8 @@
     "editor": {
       "language": "sql",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -159,7 +161,8 @@
     "editor": {
       "language": "scala",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -185,7 +188,8 @@
     "editor": {
       "language": "python",
       "editOnDblClick": false,
-      "completionKey": "TAB"
+      "completionKey": "TAB",
+      "completionSupport": true
     }
   },
   {
@@ -195,7 +199,8 @@
     "properties": {},
     "editor": {
       "language": "python",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": true
     }
   },
   {
@@ -234,7 +239,8 @@
     },
     "editor": {
       "language": "r",
-      "editOnDblClick": false
+      "editOnDblClick": false,
+      "completionSupport": false
     }
   }
 ]

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index 85fc631..2178006 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -1392,7 +1392,13 @@ public class NotebookServer extends WebSocketServlet
     }
 
     final Note note = notebook.getNote(getOpenNoteId(conn));
-    List<InterpreterCompletion> candidates = note.completion(paragraphId, buffer, cursor);
+    List<InterpreterCompletion> candidates;
+    try {
+      candidates = note.completion(paragraphId, buffer, cursor);
+    } catch (RuntimeException e) {
+      LOG.info("Fail to get completion", e);
+      candidates = new ArrayList<>();
+    }
     resp.put("completions", candidates);
     conn.send(serializeMessage(resp));
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/zeppelin-web/bower.json
----------------------------------------------------------------------
diff --git a/zeppelin-web/bower.json b/zeppelin-web/bower.json
index 3de9f56..4d0d028 100644
--- a/zeppelin-web/bower.json
+++ b/zeppelin-web/bower.json
@@ -14,7 +14,7 @@
     "angular-resource": "1.5.7",
     "angular-bootstrap": "~2.5.0",
     "angular-websocket": "~1.0.13",
-    "ace-builds": "1.2.7",
+    "ace-builds": "1.3.2",
     "angular-ui-ace": "0.1.3",
     "jquery.scrollTo": "~1.4.13",
     "nvd3": "~1.8.5",
@@ -55,7 +55,7 @@
         "src-noconflict/ext-language_tools.js",
         "src-noconflict/theme-chrome.js"
       ],
-      "version": "1.2.7",
+      "version": "1.3.2",
       "name": "ace-builds"
     },
     "highlightjs": {
@@ -68,7 +68,7 @@
     }
   },
   "resolutions": {
-    "ace-builds": "1.2.7",
+    "ace-builds": "1.3.2",
     "angular": ">=1.5.0 <1.6"
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/fe07e5a4/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index ee17130..41474be 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -34,6 +34,7 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
   'ngInject';
 
   let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_';
+  let completionListLength = undefined;
   $rootScope.keys = Object.keys;
   $scope.parentNote = null;
   $scope.paragraph = {};
@@ -750,6 +751,16 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
         // not applying emacs key binding while the binding override Ctrl-v. default behavior of paste text on windows.
       }
 
+      $scope.$on('completionListLength', function(event, data) {
+        completionListLength = data;
+      });
+
+      $scope.$on('callCompletion', function(event, data) {
+        if($scope.paragraphFocused) {
+          websocketMsgSrv.completion($scope.paragraph.id, data.buf, data.pos);
+        }
+      });
+
       let remoteCompleter = {
         getCompletions: function(editor, session, pos, prefix, callback) {
           let langTools = ace.require('ace/ext/language_tools');
@@ -774,7 +785,7 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
           pos = session.getTextRange(new Range(0, 0, pos.row, pos.column)).length;
           let buf = session.getValue();
 
-          websocketMsgSrv.completion($scope.paragraph.id, buf, pos);
+          $rootScope.$broadcast('callCompletion', {buf: buf, pos: pos});
 
           $scope.$on('completionList', function(event, data) {
             let computeCaption = function(value, meta) {
@@ -805,6 +816,7 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
                   });
                 }
               }
+              $rootScope.$broadcast('completionListLength', completions.length);
               callback(null, completions);
             }
           });
@@ -963,8 +975,76 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat
     }
   };
 
+  // ref: https://github.com/ajaxorg/ace/blob/5021d0193d9f2bba5a978d0b1d7a4f73d18ce713/lib/ace/autocomplete.js#L454
+  const completionSupportWithoutBackend = function(str) {
+    let matches;
+    if (str.length > this.filterText && str.lastIndexOf(
+        this.filterText, 0) === 0) {
+      matches = this.filtered;
+    } else {
+      matches = this.all;
+    }
+
+    this.filterText = str;
+    matches = this.filterCompletions(matches, this.filterText);
+    matches = matches.sort(function(a, b) {
+      return b.exactMatch - a.exactMatch || b.score - a.score;
+    });
+    let prev = null;
+
+    matches = matches.filter(function(item) {
+      let caption = item.snippet || item.caption || item.value;
+      if (caption === prev) {
+        return false;
+      }
+      prev = caption;
+      return true;
+    });
+    this.filtered = matches;
+  };
+
+  const completionSupportWithBackend = function(str) {
+    let matches;
+    if (str.length > this.filterText && str.lastIndexOf(
+        this.filterText, 0) === 0) {
+      matches = this.filtered;
+    } else {
+      matches = this.all;
+    }
+    this.filterText = str;
+    matches = this.filterCompletions(matches, this.filterText);
+    matches = matches.sort(function(a, b) {
+      return b.exactMatch - a.exactMatch || b.score - a.score;
+    });
+    let prev = null;
+
+    matches = matches.filter(function(item) {
+      if (!_.isEmpty(item.meta)) {
+        if (completionListLength !== 0) {
+          return false;
+        }
+      }
+      let caption = item.snippet || item.caption || item.value;
+      if (caption === prev) {
+        return false;
+      }
+      prev = caption;
+      return true;
+    });
+    this.filtered = matches;
+    completionListLength = undefined;
+  };
+
   const handleFocus = function(focused, isDigestPass) {
     $scope.paragraphFocused = focused;
+    if (focused) {
+      let filteredList = ace.require('ace/autocomplete').FilteredList;
+      if ($scope.paragraph.config.editorSetting.completionSupport) {
+        filteredList.prototype.setFilter = completionSupportWithBackend;
+      } else {
+        filteredList.prototype.setFilter = completionSupportWithoutBackend;
+      }
+    }
 
     if ($scope.editor) {
       $scope.editor.setHighlightActiveLine(focused);