You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by ju...@apache.org on 2013/01/18 13:54:45 UTC
svn commit: r1435121 - in
/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct:
multiproduct/dbcursor.py tests/dbcursor.py
Author: jure
Date: Fri Jan 18 12:54:44 2013
New Revision: 1435121
URL: http://svn.apache.org/viewvc?rev=1435121&view=rev
Log:
#288, workaround for sqlparse underline (_) bug, added translated SQL test cases
Modified:
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/dbcursor.py
Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py?rev=1435121&r1=1435120&r2=1435121&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py Fri Jan 18 12:54:44 2013
@@ -87,6 +87,45 @@ class BloodhoundProductSQLTranslate(obje
self._product_column = product_column
self._product_prefix = product_prefix
+ def _sqlparse_underline_hack(self, token):
+ underline_token = lambda token: token.ttype == Tokens.Token.Error and token.value == '_'
+ identifier_token = lambda token: isinstance(token, Types.Identifier) or isinstance(token, Types.Token)
+ def prefix_token(token, prefix):
+ if identifier_token(token):
+ if isinstance(token, Types.IdentifierList):
+ token = token.tokens[0]
+ token.value = prefix + token.value
+ token.normalized = token.value.upper() if token.ttype in Tokens.Keyword \
+ else token.value
+ if hasattr(token, 'tokens'):
+ if len(token.tokens) != 1:
+ raise Exception("Internal error, invalid token list")
+ token.tokens[0].value, token.tokens[0].normalized = token.value, token.normalized
+ return
+
+ if hasattr(token, 'tokens') and token.tokens and len(token.tokens):
+ current = self._token_first(token)
+ while current:
+ leftover = None
+ if underline_token(current):
+ prefix = ''
+ while underline_token(current):
+ prefix += current.value
+ prev = current
+ current = self._token_next(token, current)
+ self._token_delete(token, prev)
+ # expression ends with _ ... push the token to parent
+ if not current:
+ return prev
+ prefix_token(current, prefix)
+ else:
+ leftover = self._sqlparse_underline_hack(current)
+ if leftover:
+ leftover.parent = token
+ self._token_insert_after(token, current, leftover)
+ current = leftover if leftover else self._token_next(token, current)
+ return None
+
def _select_table_name_alias(self, tokens):
return filter(lambda t: t.upper() != 'AS', [t.value for t in tokens if t.value.strip()])
def _column_expression_name_alias(self, tokens):
@@ -210,6 +249,8 @@ class BloodhoundProductSQLTranslate(obje
alias = name
parent.tokens[self._token_idx(parent, token)] = sqlparse.parse(self._prefixed_table_view_sql(name,
alias))[0]
+ if table_name_callback:
+ table_name_callback(name)
def inject_table_alias(token, alias):
parent.tokens[self._token_idx(parent, token)] = sqlparse.parse(self._select_alias_sql(alias))[0]
@@ -301,7 +342,7 @@ class BloodhoundProductSQLTranslate(obje
fields_token = self._token_next(parent, token) if token.match(Tokens.Keyword, ['ALL', 'DISTINCT']) else token
current_token, field_lists = self._select_expression_tokens(parent, fields_token, ['FROM'] + self._from_end_words)
def handle_insert_table(table_name):
- if table_name == insert_table:
+ if insert_table and insert_table in self._translate_tables:
for keyword in [self._product_column, ',', ' ']:
self._token_insert_before(parent, fields_token, Types.Token(Tokens.Keyword, keyword))
return
@@ -581,14 +622,23 @@ class BloodhoundProductSQLTranslate(obje
'DROP': self._drop,
}
try:
+ format_sql = True
+ formatted_sql = lambda sql: sqlparse.format(sql.to_unicode(), reindent=True) \
+ if format_sql \
+ else sql.to_unicode()
sql_statement = sqlparse.parse(sql)[0]
+ if '_' in sql:
+ self._sqlparse_underline_hack(sql_statement)
+# format_sql = False
t = sql_statement.token_first()
if t.match(Tokens.DML, dml_handlers.keys()):
dml_handlers[t.value](sql_statement, t)
- sql = sqlparse.format(sql_statement.to_unicode(), reindent=True)
+ sql = formatted_sql(sql_statement)
elif t.match(Tokens.DDL, ddl_handlers.keys()):
ddl_handlers[t.value](sql_statement, t)
- sql = sqlparse.format(sql_statement.to_unicode(), reindent=True)
- except Exception:
- raise Exception("Failed to translate SQL '%s'" % sql)
+ sql = formatted_sql(sql_statement)
+ else:
+ pass
+ except Exception, ex:
+ raise Exception("Failed to translate SQL '%s', exception '%s'" % (sql, ex.message))
return sql
Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/dbcursor.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/dbcursor.py?rev=1435121&r1=1435120&r2=1435121&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/dbcursor.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/dbcursor.py Fri Jan 18 12:54:44 2013
@@ -573,6 +573,110 @@ WHERE w1.version = w2.ver
OR w1.author LIKE %s ESCAPE '/'
OR w1.text LIKE %s ESCAPE '/')"""
),
+ (
+"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
+ owner, reporter, cc, version, milestone, status, resolution,
+ summary, description, keywords)
+ SELECT id, 'defect', time, changetime, component, severity, priority, owner,
+ reporter, cc, version, milestone, status, resolution, summary,
+ description, keywords FROM ticket_old
+ WHERE COALESCE(severity,'') <> 'enhancement'""",
+"""INSERT INTO ticket(product, id, type, time, changetime, component, severity, priority, owner, reporter, cc, version, milestone, status, resolution, summary, description, keywords)
+SELECT product, id, 'defect', time, changetime, component, severity, priority, owner, reporter, cc, version, milestone,
+ status,
+ resolution,
+ summary,
+ description,
+ keywords
+FROM
+ (SELECT *
+ FROM PRODUCT_ticket_old) AS ticket_old
+WHERE COALESCE(severity,'') <> 'enhancement'"""
+ ),
+ (
+"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
+ owner, reporter, cc, version, milestone, status, resolution,
+ summary, description, keywords)
+ SELECT id, 'enhancement', time, changetime, component, 'normal', priority,
+ owner, reporter, cc, version, milestone, status, resolution, summary,
+ description, keywords FROM ticket_old
+ WHERE severity = 'enhancement'""",
+"""INSERT INTO ticket(product, id, type, time, changetime, component, severity, priority, owner, reporter, cc, version, milestone, status, resolution, summary, description, keywords)
+SELECT product, id, 'enhancement', time, changetime, component, 'normal', priority, owner, reporter, cc, version, milestone,
+ status,
+ resolution,
+ summary,
+ description,
+ keywords
+FROM
+ (SELECT *
+ FROM PRODUCT_ticket_old) AS ticket_old
+WHERE severity = 'enhancement'""",
+ ),
+ (
+"""SELECT COUNT(*) FROM (
+ SELECT __color__, __group,
+ (CASE
+ WHEN __group = 1 THEN 'Accepted'
+ WHEN __group = 2 THEN 'Owned'
+ WHEN __group = 3 THEN 'Reported'
+ ELSE 'Commented' END) AS __group__,
+ ticket, summary, component, version, milestone,
+ type, priority, created, _changetime, _description,
+ _reporter
+ FROM (
+ SELECT DISTINCT CAST(p.value AS integer) AS __color__,
+ (CASE
+ WHEN owner = %s AND status = 'accepted' THEN 1
+ WHEN owner = %s THEN 2
+ WHEN reporter = %s THEN 3
+ ELSE 4 END) AS __group,
+ t.id AS ticket, summary, component, version, milestone,
+ t.type AS type, priority, t.time AS created,
+ t.changetime AS _changetime, description AS _description,
+ reporter AS _reporter
+ FROM ticket t
+ LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
+ LEFT JOIN ticket_change tc ON tc.ticket = t.id AND tc.author = %s
+ AND tc.field = 'comment'
+ WHERE t.status <> 'closed'
+ AND (owner = %s OR reporter = %s OR author = %s)
+ ) AS sub
+ ORDER BY __group, __color__, milestone, type, created
+
+ ) AS tab""",
+"""SELECT COUNT(*) FROM (
+ SELECT __color__, __group,
+ (CASE
+ WHEN __group = 1 THEN 'Accepted'
+ WHEN __group = 2 THEN 'Owned'
+ WHEN __group = 3 THEN 'Reported'
+ ELSE 'Commented' END) AS __group__,
+ ticket, summary, component, version, milestone,
+ type, priority, created, _changetime, _description,
+ _reporter
+ FROM (
+ SELECT DISTINCT CAST(p.value AS integer) AS __color__,
+ (CASE
+ WHEN owner = %s AND status = 'accepted' THEN 1
+ WHEN owner = %s THEN 2
+ WHEN reporter = %s THEN 3
+ ELSE 4 END) AS __group,
+ t.id AS ticket, summary, component, version, milestone,
+ t.type AS type, priority, t.time AS created,
+ t.changetime AS _changetime, description AS _description,
+ reporter AS _reporter
+ FROM (SELECT * FROM ticket WHERE product="PRODUCT") AS t
+ LEFT JOIN (SELECT * FROM enum WHERE product="PRODUCT") AS p ON p.name = t.priority AND p.type = 'priority'
+ LEFT JOIN ticket_change ON tc.ticket = t.id AND tc.author = %s
+ AND tc.field = 'comment'
+ WHERE t.status <> 'closed'
+ AND (owner = %s OR reporter = %s OR author = %s)
+ ) AS sub
+ ORDER BY __group, __color__, milestone, type, created
+
+ ) AS tab"""
+ ),
],
# custom table SELECTs