apb_extra_utils.sql_parser.x_grouping

 1#  coding=utf-8
 2#
 3#  Author: Ernesto Arredondo Martinez (ernestone@gmail.com)
 4#  Created: 7/6/19 18:23
 5#  Last modified: 25/4/18 15:27
 6#  Copyright (c) 2019
 7
 8from sqlparse import sql
 9from sqlparse.engine import grouping
10from sqlparse.sql import TokenList
11
12
13class ElemGroup(TokenList):
14    pass
15
16
17def group_elems_parenthesis(tlist):
18    for tok_idx, tok in enumerate(tlist.tokens):
19        if isinstance(tok, sql.Parenthesis) or isinstance(tok, sql.SquareBrackets):
20            ini_idx = 1  # Comienza desde el segundo token distinto a ( o [
21            fi_elem = fi_idx = len(tok.tokens) - 2  # Acaba en el penultimo token antes de ) o ]
22            for tidx in range(fi_idx, ini_idx, -1):
23                if tok.tokens[tidx].value == ",":
24                    tok.group_tokens(ElemGroup, tidx + 1, fi_elem)
25                    fi_elem = tidx - 1
26
27            tok.group_tokens(ElemGroup, ini_idx, fi_elem)
28
29
30def group(stmt):
31    for func in [
32        grouping.group_comments,
33
34        # _group_matching
35        grouping.group_brackets,
36        grouping.group_parenthesis,
37        group_elems_parenthesis,
38        grouping.group_case,
39        grouping.group_if,
40        grouping.group_for,
41        grouping.group_begin,
42
43        grouping.group_functions,
44        grouping.group_where,
45        grouping.group_period,
46        grouping.group_arrays,
47        # grouping.group_identifier,
48        grouping.group_operator,
49        grouping.group_order,
50        grouping.group_typecasts,
51        grouping.group_as,
52        grouping.group_aliased,
53        grouping.group_assignment,
54        grouping.group_comparison,
55
56        grouping.align_comments,
57        # group_identifier_list,
58    ]:
59        func(stmt)
60    return stmt
class ElemGroup(sqlparse.sql.TokenList):
14class ElemGroup(TokenList):
15    pass

A group of tokens.

It has an additional instance attribute tokens which holds a list of child-tokens.

def group_elems_parenthesis(tlist):
18def group_elems_parenthesis(tlist):
19    for tok_idx, tok in enumerate(tlist.tokens):
20        if isinstance(tok, sql.Parenthesis) or isinstance(tok, sql.SquareBrackets):
21            ini_idx = 1  # Comienza desde el segundo token distinto a ( o [
22            fi_elem = fi_idx = len(tok.tokens) - 2  # Acaba en el penultimo token antes de ) o ]
23            for tidx in range(fi_idx, ini_idx, -1):
24                if tok.tokens[tidx].value == ",":
25                    tok.group_tokens(ElemGroup, tidx + 1, fi_elem)
26                    fi_elem = tidx - 1
27
28            tok.group_tokens(ElemGroup, ini_idx, fi_elem)
def group(stmt):
31def group(stmt):
32    for func in [
33        grouping.group_comments,
34
35        # _group_matching
36        grouping.group_brackets,
37        grouping.group_parenthesis,
38        group_elems_parenthesis,
39        grouping.group_case,
40        grouping.group_if,
41        grouping.group_for,
42        grouping.group_begin,
43
44        grouping.group_functions,
45        grouping.group_where,
46        grouping.group_period,
47        grouping.group_arrays,
48        # grouping.group_identifier,
49        grouping.group_operator,
50        grouping.group_order,
51        grouping.group_typecasts,
52        grouping.group_as,
53        grouping.group_aliased,
54        grouping.group_assignment,
55        grouping.group_comparison,
56
57        grouping.align_comments,
58        # group_identifier_list,
59    ]:
60        func(stmt)
61    return stmt