sql-blocks 1.25.1301__py3-none-any.whl → 1.25.1901__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sql_blocks/sql_blocks.py +42 -11
- {sql_blocks-1.25.1301.dist-info → sql_blocks-1.25.1901.dist-info}/METADATA +1 -1
- sql_blocks-1.25.1901.dist-info/RECORD +7 -0
- sql_blocks-1.25.1301.dist-info/RECORD +0 -7
- {sql_blocks-1.25.1301.dist-info → sql_blocks-1.25.1901.dist-info}/LICENSE +0 -0
- {sql_blocks-1.25.1301.dist-info → sql_blocks-1.25.1901.dist-info}/WHEEL +0 -0
- {sql_blocks-1.25.1301.dist-info → sql_blocks-1.25.1901.dist-info}/top_level.txt +0 -0
sql_blocks/sql_blocks.py
CHANGED
@@ -121,7 +121,8 @@ class SQLObject:
|
|
121
121
|
|
122
122
|
SQL_CONST_SYSDATE = 'SYSDATE'
|
123
123
|
SQL_CONST_CURR_DATE = 'Current_date'
|
124
|
-
|
124
|
+
SQL_ROW_NUM = 'ROWNUM'
|
125
|
+
SQL_CONSTS = [SQL_CONST_SYSDATE, SQL_CONST_CURR_DATE, SQL_ROW_NUM]
|
125
126
|
|
126
127
|
|
127
128
|
class Field:
|
@@ -334,6 +335,9 @@ class Cast(Function):
|
|
334
335
|
...
|
335
336
|
|
336
337
|
|
338
|
+
FUNCTION_CLASS = {f.__name__.lower(): f for f in Function.__subclasses__()}
|
339
|
+
|
340
|
+
|
337
341
|
class ExpressionField:
|
338
342
|
def __init__(self, expr: str):
|
339
343
|
self.expr = expr
|
@@ -467,8 +471,13 @@ class Where:
|
|
467
471
|
return cls(f'IN ({values})')
|
468
472
|
|
469
473
|
def add(self, name: str, main: SQLObject):
|
474
|
+
func_type = FUNCTION_CLASS.get(name.lower())
|
475
|
+
if func_type:
|
476
|
+
name = func_type.format('*', main)
|
477
|
+
else:
|
478
|
+
name = Field.format(name, main)
|
470
479
|
main.values.setdefault(WHERE, []).append('{}{} {}'.format(
|
471
|
-
self.prefix,
|
480
|
+
self.prefix, name, self.expr
|
472
481
|
))
|
473
482
|
|
474
483
|
|
@@ -548,7 +557,6 @@ class Clause:
|
|
548
557
|
def format(cls, name: str, main: SQLObject) -> str:
|
549
558
|
def is_function() -> bool:
|
550
559
|
diff = main.diff(SELECT, [name.lower()], True)
|
551
|
-
FUNCTION_CLASS = {f.__name__.lower(): f for f in Function.__subclasses__()}
|
552
560
|
return diff.intersection(FUNCTION_CLASS)
|
553
561
|
found = re.findall(r'^_\d', name)
|
554
562
|
if found:
|
@@ -654,7 +662,7 @@ class Rule:
|
|
654
662
|
...
|
655
663
|
|
656
664
|
class QueryLanguage:
|
657
|
-
pattern = '{select}{_from}{where}{group_by}{order_by}'
|
665
|
+
pattern = '{select}{_from}{where}{group_by}{order_by}{limit}'
|
658
666
|
has_default = {key: bool(key == SELECT) for key in KEYWORD}
|
659
667
|
|
660
668
|
@staticmethod
|
@@ -682,13 +690,16 @@ class QueryLanguage:
|
|
682
690
|
def set_group(self, values: list) -> str:
|
683
691
|
return self.join_with_tabs(values, ',')
|
684
692
|
|
693
|
+
def set_limit(self, values: list) -> str:
|
694
|
+
return self.join_with_tabs(values, ' ')
|
695
|
+
|
685
696
|
def __init__(self, target: 'Select'):
|
686
|
-
self.KEYWORDS = [SELECT, FROM, WHERE, GROUP_BY, ORDER_BY]
|
697
|
+
self.KEYWORDS = [SELECT, FROM, WHERE, GROUP_BY, ORDER_BY, LIMIT]
|
687
698
|
self.TABULATION = '\n\t' if target.break_lines else ' '
|
688
699
|
self.LINE_BREAK = '\n' if target.break_lines else ' '
|
689
700
|
self.TOKEN_METHODS = {
|
690
701
|
SELECT: self.add_field, FROM: self.get_tables,
|
691
|
-
WHERE: self.extract_conditions,
|
702
|
+
WHERE: self.extract_conditions, LIMIT: self.set_limit,
|
692
703
|
ORDER_BY: self.sort_by, GROUP_BY: self.set_group,
|
693
704
|
}
|
694
705
|
self.result = {}
|
@@ -1064,7 +1075,6 @@ class CypherParser(Parser):
|
|
1064
1075
|
Count().As(token, extra_classes).add(pk_field, self.queries[-1])
|
1065
1076
|
return
|
1066
1077
|
else:
|
1067
|
-
FUNCTION_CLASS = {f.__name__.lower(): f for f in Function.__subclasses__()}
|
1068
1078
|
class_list = [ FUNCTION_CLASS[func_name] ]
|
1069
1079
|
class_list += extra_classes
|
1070
1080
|
FieldList(token, class_list).add('', self.queries[-1])
|
@@ -1337,10 +1347,21 @@ class Select(SQLObject):
|
|
1337
1347
|
return True
|
1338
1348
|
|
1339
1349
|
def limit(self, row_count: int=100, offset: int=0):
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1350
|
+
if Function.dialect == Dialect.SQL_SERVER:
|
1351
|
+
fields = self.values.get(SELECT)
|
1352
|
+
if fields:
|
1353
|
+
fields[0] = f'SELECT TOP({row_count}) {fields[0]}'
|
1354
|
+
else:
|
1355
|
+
self.values[SELECT] = [f'SELECT TOP({row_count}) *']
|
1356
|
+
return self
|
1357
|
+
if Function.dialect == Dialect.ORACLE:
|
1358
|
+
Where.gte(row_count).add(SQL_ROW_NUM, self)
|
1359
|
+
if offset > 0:
|
1360
|
+
Where.lte(row_count+offset).add(SQL_ROW_NUM, self)
|
1361
|
+
return self
|
1362
|
+
self.values[LIMIT] = ['{}{}'.format(
|
1363
|
+
row_count, f' OFFSET {offset}' if offset > 0 else ''
|
1364
|
+
)]
|
1344
1365
|
return self
|
1345
1366
|
|
1346
1367
|
def match(self, field: str, key: str) -> bool:
|
@@ -1526,3 +1547,13 @@ def detect(text: str, join_queries: bool = True) -> Select:
|
|
1526
1547
|
for query in query_list[1:]:
|
1527
1548
|
result += query
|
1528
1549
|
return result
|
1550
|
+
|
1551
|
+
|
1552
|
+
if __name__ == '__main__':
|
1553
|
+
query = Select(
|
1554
|
+
'Tips t',
|
1555
|
+
tip=[Field, Lag().over(day=OrderBy).As('last')],
|
1556
|
+
diff=ExpressionField('Round(tip-last, 2) as {f}'),
|
1557
|
+
Row_Number=gt(1)
|
1558
|
+
)
|
1559
|
+
print(query)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: sql_blocks
|
3
|
-
Version: 1.25.
|
3
|
+
Version: 1.25.1901
|
4
4
|
Summary: Allows you to create objects for parts of SQL query commands. Also to combine these objects by joining them, adding or removing parts...
|
5
5
|
Home-page: https://github.com/julio-cascalles/sql_blocks
|
6
6
|
Author: Júlio Cascalles
|
@@ -0,0 +1,7 @@
|
|
1
|
+
sql_blocks/__init__.py,sha256=5ItzGCyqqa6kwY8wvF9kapyHsAiWJ7KEXCcC-OtdXKg,37
|
2
|
+
sql_blocks/sql_blocks.py,sha256=U2bcs8SnXcGOlsY9rhB3lpPzzb-W4MsG64N7r0QjKEI,51822
|
3
|
+
sql_blocks-1.25.1901.dist-info/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
|
4
|
+
sql_blocks-1.25.1901.dist-info/METADATA,sha256=MCkLq9JFvLiVAEJc_IhDLd3rExUKeVa04EtC9IwJwsA,15027
|
5
|
+
sql_blocks-1.25.1901.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
6
|
+
sql_blocks-1.25.1901.dist-info/top_level.txt,sha256=57AbUvUjYNy4m1EqDaU3WHeP-uyIAfV0n8GAUp1a1YQ,11
|
7
|
+
sql_blocks-1.25.1901.dist-info/RECORD,,
|
@@ -1,7 +0,0 @@
|
|
1
|
-
sql_blocks/__init__.py,sha256=5ItzGCyqqa6kwY8wvF9kapyHsAiWJ7KEXCcC-OtdXKg,37
|
2
|
-
sql_blocks/sql_blocks.py,sha256=XDjB6YpjJ4ojsHylPt8jGCVt3dViFPKLzE_hbVJwNMo,50844
|
3
|
-
sql_blocks-1.25.1301.dist-info/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
|
4
|
-
sql_blocks-1.25.1301.dist-info/METADATA,sha256=NqoWfNLGyyB32vgldi7qEC3xI6PiJ7Z25x6K5s8yyo0,15027
|
5
|
-
sql_blocks-1.25.1301.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
6
|
-
sql_blocks-1.25.1301.dist-info/top_level.txt,sha256=57AbUvUjYNy4m1EqDaU3WHeP-uyIAfV0n8GAUp1a1YQ,11
|
7
|
-
sql_blocks-1.25.1301.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|