Hi Akshay, Attached is the patch to make autocomplete changes python 2.6 compatible. Please note, this patch should be applied over your patch.
On Mon, Aug 27, 2018 at 2:28 PM Aditya Toshniwal < aditya.toshni...@enterprisedb.com> wrote: > Hi, > > Did a basic testing. Looks good to me. Test cases run successfully. > > On Fri, Aug 24, 2018 at 10:55 AM Akshay Joshi < > akshay.jo...@enterprisedb.com> wrote: > >> Hi Hackers >> >> I have merged the latest code of "*pgcli*" used for auto complete >> feature in pgAdmin4. We haven't merged that code since last 2 years and >> they have fixed some bugs and also provided some new features: >> >> - Add support for CTE aware auto-completion. >> - Handle unrecognized keywords gracefully. >> - Support for table-qualifying column suggestions. >> - Add additional completion for ALTER keyword. >> - Better suggestions when editing functions. >> - Added MATERIALIZED VIEW keywords. >> - Completions after ORDER BY and DISTINCT now take account of table >> aliases. >> - Include arguments in function suggestions. >> - Add missing keyword COLUMN after DROP >> >> I have also added some feature test for auto complete. Attached is the >> patch please review it. >> -- >> *Akshay Joshi* >> >> *Sr. Software Architect * >> >> >> >> *Phone: +91 20-3058-9517Mobile: +91 976-788-8246* >> > > > -- > Thanks and Regards, > Aditya Toshniwal > Software Engineer | EnterpriseDB Software Solutions | Pune > "Don't Complain about Heat, Plant a tree" > -- Thanks and Regards, Aditya Toshniwal Software Engineer | EnterpriseDB Software Solutions | Pune "Don't Complain about Heat, Plant a tree"
diff --git a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py index 2e0dd4a..41710b9 100644 --- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py +++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py @@ -7,6 +7,7 @@ # ########################################################################## +from __future__ import print_function import sys import random @@ -18,6 +19,7 @@ from regression.python_test_utils import test_utils from regression.feature_utils.base_feature_test import BaseFeatureTest + class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): """ This feature test will test the query tool auto complete feature. diff --git a/web/pgadmin/utils/sqlautocomplete/autocomplete.py b/web/pgadmin/utils/sqlautocomplete/autocomplete.py index 3efac77..a82976d 100644 --- a/web/pgadmin/utils/sqlautocomplete/autocomplete.py +++ b/web/pgadmin/utils/sqlautocomplete/autocomplete.py @@ -11,9 +11,15 @@ import re import operator +import sys from itertools import count, repeat, chain from .completion import Completion -from collections import namedtuple, defaultdict, OrderedDict +from collections import namedtuple, defaultdict +if sys.version_info < (2, 7): + from ordereddict import OrderedDict +else: + from collections import OrderedDict + from .sqlcompletion import ( FromClauseItem, suggest_type, Database, Schema, Table, Function, Column, View, Keyword, Datatype, Alias, JoinCondition, Join) @@ -286,15 +292,14 @@ class SQLAutoComplete(object): # This is used when suggesting functions, to avoid the latency that # would result if we'd recalculate the arg lists each time we suggest # functions (in large DBs) - self._arg_list_cache = { - usage: { - meta: self._arg_list(meta, usage) - for sch, funcs in self.dbmetadata['functions'].items() - for func, metas in funcs.items() - for meta in metas - } - for usage in ('call', 'call_display', 'signature') - } + + self._arg_list_cache = \ + dict((usage, + dict((meta, self._arg_list(meta, usage)) + for sch, funcs in self.dbmetadata['functions'].items() + for func, metas in funcs.items() + for meta in metas)) + for usage in ('call', 'call_display', 'signature')) def extend_foreignkeys(self, fk_data): @@ -532,11 +537,10 @@ class SQLAutoComplete(object): c.name for t, cs in scoped_cols.items() if t.ref != ltbl for c in cs ) - scoped_cols = { - t: [col for col in cols if col.name in other_tbl_cols] - for t, cols in scoped_cols.items() - if t.ref == ltbl - } + scoped_cols = \ + dict((t, [col for col in cols if col.name in other_tbl_cols]) + for t, cols in scoped_cols.items() if t.ref == ltbl) + lastword = last_word(word_before_cursor, include='most_punctuations') if lastword == '*': if suggestion.context == 'insert': @@ -547,10 +551,9 @@ class SQLAutoComplete(object): p.match(col.default) for p in self.insert_col_skip_patterns ) - scoped_cols = { - t: [col for col in cols if filter(col)] - for t, cols in scoped_cols.items() - } + scoped_cols = \ + dict((t, [col for col in cols if filter(col)]) + for t, cols in scoped_cols.items()) if self.asterisk_column_order == 'alphabetic': for cols in scoped_cols.values(): cols.sort(key=operator.attrgetter('name')) diff --git a/web/pgadmin/utils/sqlautocomplete/sqlcompletion.py b/web/pgadmin/utils/sqlautocomplete/sqlcompletion.py index 5d18ce9..41641f4 100644 --- a/web/pgadmin/utils/sqlautocomplete/sqlcompletion.py +++ b/web/pgadmin/utils/sqlautocomplete/sqlcompletion.py @@ -458,7 +458,7 @@ def suggest_based_on_last_token(token, stmt): if not schema: suggestions.append(Schema()) return tuple(suggestions) - elif token_v in {'alter', 'create', 'drop'}: + elif token_v in ['alter', 'create', 'drop']: return (Keyword(token_v.upper()),) elif token.is_keyword: # token is a keyword we haven't implemented any special handling for