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.
- duckdb_kernel/parser/elements/binary/Difference.py +1 -1
- duckdb_kernel/parser/elements/binary/Division.py +48 -0
- duckdb_kernel/parser/elements/binary/__init__.py +3 -1
- duckdb_kernel/parser/util/RenamableColumnList.py +12 -0
- {jupyter_duckdb-0.9.2.5.dist-info → jupyter_duckdb-0.10.1.1.dist-info}/METADATA +3 -2
- {jupyter_duckdb-0.9.2.5.dist-info → jupyter_duckdb-0.10.1.1.dist-info}/RECORD +8 -7
- {jupyter_duckdb-0.9.2.5.dist-info → jupyter_duckdb-0.10.1.1.dist-info}/WHEEL +1 -1
- {jupyter_duckdb-0.9.2.5.dist-info → jupyter_duckdb-0.10.1.1.dist-info}/top_level.txt +0 -0
|
@@ -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(
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
79
|
-
jupyter_duckdb-0.
|
|
80
|
-
jupyter_duckdb-0.
|
|
81
|
-
jupyter_duckdb-0.
|
|
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,,
|
|
File without changes
|