Mercurial > sqlpython
comparison completion.py @ 138:3b3c78bad48f
need completion too
author | catherine@Elli.myhome.westell.com |
---|---|
date | Fri, 29 Aug 2008 09:54:12 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
137:c27eeeea8752 | 138:3b3c78bad48f |
---|---|
1 import pyparsing, re | |
2 | |
3 sqlStyleComment = pyparsing.Literal("--") + pyparsing.ZeroOrMore(pyparsing.CharsNotIn("\n")) | |
4 keywords = {'order by': pyparsing.Keyword('order', caseless=True) + | |
5 pyparsing.Keyword('by', caseless=True), | |
6 'select': pyparsing.Keyword('select', caseless=True), | |
7 'from': pyparsing.Keyword('from', caseless=True), | |
8 'having': pyparsing.Keyword('having', caseless=True), | |
9 'update': pyparsing.Keyword('update', caseless=True), | |
10 'set': pyparsing.Keyword('set', caseless=True), | |
11 'delete': pyparsing.Keyword('delete', caseless=True), | |
12 'insert into': pyparsing.Keyword('insert', caseless=True) + | |
13 pyparsing.Keyword('into', caseless=True), | |
14 'values': pyparsing.Keyword('values', caseless=True), | |
15 'group by': pyparsing.Keyword('group', caseless=True) + | |
16 pyparsing.Keyword('by', caseless=True), | |
17 'where': pyparsing.Keyword('where', caseless=True)} | |
18 for (name, parser) in keywords.items(): | |
19 parser.ignore(pyparsing.sglQuotedString) | |
20 parser.ignore(pyparsing.dblQuotedString) | |
21 parser.ignore(pyparsing.cStyleComment) | |
22 parser.ignore(sqlStyleComment) | |
23 parser.name = name | |
24 | |
25 fromClauseFinder = re.compile(r".*(from|update)(.*)(where|set)", | |
26 re.IGNORECASE | re.DOTALL | re.MULTILINE) | |
27 oracleTerms = oracleTerms = re.compile(r"[A-Z$_#][0-9A-Z_$#]*", re.IGNORECASE) | |
28 def tableNamesFromFromClause(statement): | |
29 result = fromClauseFinder.search(statement) | |
30 if not result: | |
31 return [] | |
32 result = oracleTerms.findall(result.group(2)) | |
33 result = [r.upper() for r in result if r.upper() not in ('JOIN','ON')] | |
34 return result | |
35 | |
36 def orderedParseResults(parsers, statement): | |
37 results = [] | |
38 for parser in parsers: | |
39 results.extend(parser.scanString(statement)) | |
40 results.sort(cmp=lambda x,y:cmp(x[1],y[1])) | |
41 return results | |
42 | |
43 def whichSegment(statement): | |
44 results = orderedParseResults(keywords.values(), statement) | |
45 if results: | |
46 return ' '.join(results[-1][0]) | |
47 else: | |
48 return None | |
49 | |
50 oracleIdentifierCharacters = pyparsing.alphanums + '_#$' | |
51 def wordInProgress(statement): | |
52 result = [] | |
53 letters = list(statement) | |
54 letters.reverse() | |
55 for letter in letters: | |
56 if letter not in oracleIdentifierCharacters: | |
57 result.reverse() | |
58 return ''.join(result) | |
59 result.append(letter) | |
60 result.reverse() | |
61 return ''.join(result) | |
62 |