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 CHANGED
@@ -121,7 +121,8 @@ class SQLObject:
121
121
 
122
122
  SQL_CONST_SYSDATE = 'SYSDATE'
123
123
  SQL_CONST_CURR_DATE = 'Current_date'
124
- SQL_CONSTS = [SQL_CONST_SYSDATE, SQL_CONST_CURR_DATE]
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, Field.format(name, main), self.expr
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
- result = [str(row_count)]
1341
- if offset > 0:
1342
- result.append(f'OFFSET {offset}')
1343
- self.values.setdefault(LIMIT, result)
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.1301
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,,