jupyter-duckdb 0.9.2.5__py3-none-any.whl → 0.10.1.1__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.
@@ -17,7 +17,7 @@ class Difference(RABinaryOperator):
17
17
 
18
18
  # check number of columns
19
19
  if len(lcols) != len(rcols):
20
- raise AssertionError(f'difference can only be applied to relations with the same number of columns')
20
+ raise AssertionError('difference can only be applied to relations with the same number of columns')
21
21
 
22
22
  # create sql
23
23
  return f'{lq} EXCEPT {rq}', lcols
@@ -0,0 +1,48 @@
1
+ from typing import Tuple, Dict
2
+
3
+ from duckdb_kernel.db import Table
4
+ from ..RABinaryOperator import RABinaryOperator
5
+ from ...util.RenamableColumnList import RenamableColumnList
6
+
7
+
8
+ class Division(RABinaryOperator):
9
+ @staticmethod
10
+ def symbols() -> Tuple[str, ...]:
11
+ return '÷', ':'
12
+
13
+ def to_sql(self, tables: Dict[str, Table]) -> Tuple[str, RenamableColumnList]:
14
+ # execute subqueries
15
+ lq, lcols = self.left.to_sql(tables)
16
+ rq, rcols = self.right.to_sql(tables)
17
+
18
+ # difference and intersection preparation
19
+ diff_cols = lcols.difference(rcols)
20
+ diff_name = ', '.join(c.current_name for c in diff_cols)
21
+
22
+ inter_cols, p = lcols.intersect(rcols)
23
+ if len(inter_cols) == 0:
24
+ raise AssertionError('divison can only be applied to relations with common columns')
25
+
26
+ inter_name = ' AND '.join(f'{r.current_name} = {l.current_name}' for l, r in inter_cols)
27
+ # inter_name_left = ', '.join(l.current_name for l, _ in inter_cols)
28
+ inter_name_right = ', '.join(r.current_name for _, r in inter_cols)
29
+
30
+ print('-', diff_name)
31
+ print(inter_name)
32
+ print(inter_name_right)
33
+
34
+ # create sql
35
+ return f'''
36
+ SELECT {diff_name}
37
+ FROM ({lq}) {self._name()}
38
+ WHERE EXISTS (
39
+ SELECT {inter_name_right}
40
+ FROM ({rq}) {self._name()}
41
+ WHERE {inter_name}
42
+ )
43
+ GROUP BY {diff_name}
44
+ HAVING COUNT(*) = (
45
+ SELECT COUNT(*)
46
+ FROM ({rq}) {self._name()}
47
+ )
48
+ ''', diff_cols
@@ -9,6 +9,7 @@ from .And import And
9
9
  from .ArrowLeft import ArrowLeft
10
10
  from .ConditionalSet import ConditionalSet
11
11
  from .Divide import Divide
12
+ from .Division import Division
12
13
  from .Equal import Equal
13
14
  from .GreaterThan import GreaterThan
14
15
  from .GreaterThanEqual import GreaterThanEqual
@@ -33,7 +34,8 @@ RA_BINARY_OPERATORS = [
33
34
  Union,
34
35
  Intersection,
35
36
  Join,
36
- Cross
37
+ Cross,
38
+ Division
37
39
  ]
38
40
 
39
41
  DC_SET = ConditionalSet
@@ -61,6 +61,18 @@ class RenamableColumnList(list[RenamableColumn]):
61
61
 
62
62
  return RenamableColumnList(cols.values())
63
63
 
64
+ def difference(self, other: 'RenamableColumnList') -> 'RenamableColumnList':
65
+ cols: Dict[str, RenamableColumn] = {}
66
+
67
+ for col in self:
68
+ cols[col.name] = col
69
+
70
+ for col in other:
71
+ if col.name in cols:
72
+ del cols[col.name]
73
+
74
+ return RenamableColumnList(cols.values())
75
+
64
76
  def intersect(self, other: 'RenamableColumnList') \
65
77
  -> Tuple[List[Tuple[RenamableColumn, RenamableColumn]], 'RenamableColumnList']:
66
78
  self_cols: Dict[str, RenamableColumn] = {col.name: col for col in self}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jupyter-duckdb
3
- Version: 0.9.2.5
3
+ Version: 0.10.1.1
4
4
  Summary: a basic wrapper kernel for DuckDB
5
5
  Home-page: https://github.com/erictroebs/jupyter-duckdb
6
6
  Author: Eric Tröbs
@@ -14,7 +14,7 @@ Description-Content-Type: text/markdown
14
14
  Requires-Dist: jupyter
15
15
  Requires-Dist: graphviz ==0.20.1
16
16
  Requires-Dist: checkmarkandcross
17
- Requires-Dist: duckdb ==0.9.2
17
+ Requires-Dist: duckdb ==0.10.1
18
18
 
19
19
  # DuckDB Kernel for Jupyter
20
20
 
@@ -247,6 +247,7 @@ The supported operations are:
247
247
  - Difference `\`
248
248
  - Natural Join `⋈`
249
249
  - Cross Product `×`
250
+ - Division `÷`
250
251
 
251
252
  The Dockerfile also installs the Jupyter Lab plugin
252
253
  [jupyter-ra-extension](https://pypi.org/project/jupyter-ra-extension/). It adds
@@ -42,8 +42,9 @@ duckdb_kernel/parser/elements/binary/And.py,sha256=0jgetTG8yo5TJSeK70Kj-PI9ERyek
42
42
  duckdb_kernel/parser/elements/binary/ArrowLeft.py,sha256=u4fZSoyT9lfvWXBwuhUl4DdjVZAOqyVIKmMVbpElLD4,203
43
43
  duckdb_kernel/parser/elements/binary/ConditionalSet.py,sha256=OKpUsTP3HzsDg0vVkb3JqWZd5AUL1RnZXmF-8qWoRq8,16649
44
44
  duckdb_kernel/parser/elements/binary/Cross.py,sha256=jVY3cvD6qDWZkJ7q74lFUPO2VdDt4aAjdk2YAfg-ZC4,687
45
- duckdb_kernel/parser/elements/binary/Difference.py,sha256=2oCdVm2dgd4Xh6ysLqqv1JgfNS_Bjtd8oA-kNBoFLf0,743
45
+ duckdb_kernel/parser/elements/binary/Difference.py,sha256=ZVRgJHYVMOFwnc97oPvGtKvLvHsjSCsn2Aao6ymxY8Y,742
46
46
  duckdb_kernel/parser/elements/binary/Divide.py,sha256=d7mzaOeRYSRO1F-2IHsv_C939TuYtLppbf4-5GSRJXs,265
47
+ duckdb_kernel/parser/elements/binary/Division.py,sha256=Tq98RzGHN7QYF3R2ZVpwIiLhSIMQXzRgIuZ7l0D2fXg,1624
47
48
  duckdb_kernel/parser/elements/binary/Equal.py,sha256=xd5eMwVwM7thXqmoBg-JSux4y6osxxznNzaChmgrnGI,192
48
49
  duckdb_kernel/parser/elements/binary/GreaterThan.py,sha256=lW7EPYjwwZ1VLZOE4ai6MBW7Zq5itsUTi_v6FxoAuU0,204
49
50
  duckdb_kernel/parser/elements/binary/GreaterThanEqual.py,sha256=gO1I3J5CZwrpqZb5Oc-WJ_fCnGylpj4YKl4s-ZAr_-4,286
@@ -56,7 +57,7 @@ duckdb_kernel/parser/elements/binary/Multiply.py,sha256=OctlfN71izFYxIpMo09Qwq-3
56
57
  duckdb_kernel/parser/elements/binary/Or.py,sha256=e1H_BuY7TQD7XHKGqJYLOebYQvrh1euWOUsXF0FT5dY,264
57
58
  duckdb_kernel/parser/elements/binary/Unequal.py,sha256=1hnC1RcPMxwKKv65OL5prunGgh9cRVDmzJutmtl7gtY,269
58
59
  duckdb_kernel/parser/elements/binary/Union.py,sha256=VYTj4M2PVEhWiDwjnyP8qpVVbGvIBSVshlEt-SZYCBY,739
59
- duckdb_kernel/parser/elements/binary/__init__.py,sha256=P_IoOcXPHNlK81PBveFeJW1NimNEadtzuUdRtJLatpU,938
60
+ duckdb_kernel/parser/elements/binary/__init__.py,sha256=PtZgC0vOQONRx0FnFvzaxK9dYobdCykbQATP20djivA,983
60
61
  duckdb_kernel/parser/elements/unary/Not.py,sha256=kG0a-dp3TNjPodUMPiQ6ihtsBrbvn1iWeIPCvtyAwdo,632
61
62
  duckdb_kernel/parser/elements/unary/Projection.py,sha256=CJ-MIf1-__1ewTjNZVy5hOz3Z18CWnCDNJBxUdpWXVQ,1112
62
63
  duckdb_kernel/parser/elements/unary/Rename.py,sha256=Zr2n9EJ3nA476lND0Djz2b6493nnsbSpJ9kkEgk5B_Y,1273
@@ -66,7 +67,7 @@ duckdb_kernel/parser/tokenizer/Token.py,sha256=vwN5hHg11kqzOHLeL5GO1c1BbCTZzYDTu
66
67
  duckdb_kernel/parser/tokenizer/Tokenizer.py,sha256=PWGgS7gYgpULiKGDho842UbaXuqmwEkccixuF10oi5g,5081
67
68
  duckdb_kernel/parser/tokenizer/__init__.py,sha256=EOSmfc2RJwtB5cE1Hhj1JAra97tckxxS8-legybPy60,58
68
69
  duckdb_kernel/parser/util/RenamableColumn.py,sha256=GjonYJHAP86PY_Ysn_kgfuLwz4ax3d5e57e-1KDohng,664
69
- duckdb_kernel/parser/util/RenamableColumnList.py,sha256=sKdozdlNXwG9kaEvBFMmVgRvfDLjKoZ4M9tfZ9ucJiY,2682
70
+ duckdb_kernel/parser/util/RenamableColumnList.py,sha256=GfhdGv4KYT64Z9YA9TCn-7hhcEcc3Gu3vI2zMZ52w-8,3015
70
71
  duckdb_kernel/parser/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
72
  duckdb_kernel/util/ResultSetComparator.py,sha256=RZDIfjJyx8-eR-HIqQlEYgZd_V1ympbszpVRF4TlA7o,2262
72
73
  duckdb_kernel/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -75,7 +76,7 @@ duckdb_kernel/visualization/Drawer.py,sha256=D0LkiGMvuJ2v6cQSg_axLTGaM4VXAJEQJAy
75
76
  duckdb_kernel/visualization/RATreeDrawer.py,sha256=j-Vy1zpYMzwZ3CsphyfPW-J7ou9a9tM6aXXgAlQTgDI,2128
76
77
  duckdb_kernel/visualization/SchemaDrawer.py,sha256=fkp7tnyfzKQBXVI6X7efAvT8lczi_XlA7Hc_rhP_47s,2955
77
78
  duckdb_kernel/visualization/__init__.py,sha256=5eMJmxJ01XAXcgWDn3t70eSZF2PGaXdNo6GK-x-0H3s,78
78
- jupyter_duckdb-0.9.2.5.dist-info/METADATA,sha256=bKmADNZ499mCqEeOktQpoPT4hXv4p91zo9bL4k4zxjQ,7748
79
- jupyter_duckdb-0.9.2.5.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
80
- jupyter_duckdb-0.9.2.5.dist-info/top_level.txt,sha256=KvRRPMnmkQNuhyBsXoPmwyt26LRDp0O-0HN6u0Dm5jA,14
81
- jupyter_duckdb-0.9.2.5.dist-info/RECORD,,
79
+ jupyter_duckdb-0.10.1.1.dist-info/METADATA,sha256=MbKFIsoNRRr_F2BL9wNrTaEW7xFlE4NZJ_1HVDvw_XY,7766
80
+ jupyter_duckdb-0.10.1.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
81
+ jupyter_duckdb-0.10.1.1.dist-info/top_level.txt,sha256=KvRRPMnmkQNuhyBsXoPmwyt26LRDp0O-0HN6u0Dm5jA,14
82
+ jupyter_duckdb-0.10.1.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5