fugue 0.9.7.dev1__tar.gz → 0.9.7.dev2__tar.gz
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.
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/PKG-INFO +7 -10
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/__init__.py +1 -1
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/misc.py +1 -3
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/constants.py +1 -1
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dev.py +1 -1
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/execution/__init__.py +1 -1
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/execution/native_execution_engine.py +41 -18
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/registry.py +2 -5
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/PKG-INFO +7 -10
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/requires.txt +6 -9
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/builtin_suite.py +29 -16
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/execution_suite.py +16 -9
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/pyproject.toml +23 -35
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/LICENSE +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/README.md +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/display.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/exception.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/interfaceless.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/io.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/_utils/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/bag/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/bag/array_bag.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/bag/bag.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/collections/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/collections/partition.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/collections/sql.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/collections/yielded.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/column/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/column/expressions.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/column/functions.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/column/sql.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/array_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/arrow_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/dataframe_iterable_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/dataframes.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/function_wrapper.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/iterable_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/pandas_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataframe/utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataset/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataset/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/dataset/dataset.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/exceptions.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/execution/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/execution/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/execution/factory.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/_builtins/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/_builtins/creators.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/_builtins/outputters.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/_builtins/processors.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/context.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/creator/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/creator/convert.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/creator/creator.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/outputter/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/outputter/convert.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/outputter/outputter.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/processor/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/processor/convert.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/processor/processor.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/transformer/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/transformer/constants.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/transformer/convert.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/extensions/transformer/transformer.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/plugins.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/py.typed +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/rpc/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/rpc/base.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/rpc/flask.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/sql/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/sql/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/sql/_visitors.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/sql/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/sql/workflow.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/test/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/test/pandas_tester.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/test/plugins.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/_checkpoint.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/_tasks.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/_workflow_context.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/api.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/input.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/module.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue/workflow/workflow.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/SOURCES.txt +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/dependency_links.txt +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/entry_points.txt +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue.egg-info/top_level.txt +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_contrib/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_contrib/contrib.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_contrib/seaborn/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_contrib/viz/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_contrib/viz/_ext.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/_constants.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/_dask_sql_wrapper.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/_io.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_dask/tester.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/_io.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/dask.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_duckdb/tester.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ibis/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ibis/_compat.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ibis/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ibis/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ibis/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/env.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/nbextension/README.md +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/nbextension/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/nbextension/description.yaml +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_notebook/nbextension/main.js +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_polars/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_polars/_utils.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_polars/polars_dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_polars/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/_constants.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/_utils/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/_utils/cluster.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/_utils/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/_utils/io.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_ray/tester.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_constants.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_utils/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_utils/convert.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_utils/io.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_utils/misc.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/_utils/partition.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/dataframe.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/execution_engine.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/registry.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_spark/tester.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_sql/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_sql/exceptions.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/__init__.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/bag_suite.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/dataframe_suite.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/fugue_test/fixtures.py +0 -0
- {fugue-0.9.7.dev1 → fugue-0.9.7.dev2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fugue
|
|
3
|
-
Version: 0.9.7.
|
|
3
|
+
Version: 0.9.7.dev2
|
|
4
4
|
Summary: An abstraction layer for distributed computing
|
|
5
5
|
Author-email: The Fugue Development Team <hello@fugue.ai>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -24,12 +24,12 @@ Requires-Dist: triad>=1.0.1
|
|
|
24
24
|
Requires-Dist: adagio>=0.2.6
|
|
25
25
|
Requires-Dist: pandas<3
|
|
26
26
|
Provides-Extra: sql
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: fugue-sql-antlr>=0.2.
|
|
27
|
+
Requires-Dist: duckdb>=0.5.0; extra == "sql"
|
|
28
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "sql"
|
|
29
29
|
Requires-Dist: sqlglot<28; extra == "sql"
|
|
30
30
|
Requires-Dist: jinja2; extra == "sql"
|
|
31
31
|
Provides-Extra: cpp-sql-parser
|
|
32
|
-
Requires-Dist: fugue-sql-antlr[cpp]>=0.2.
|
|
32
|
+
Requires-Dist: fugue-sql-antlr[cpp]>=0.2.4; extra == "cpp-sql-parser"
|
|
33
33
|
Provides-Extra: spark
|
|
34
34
|
Requires-Dist: pyspark>=3.1.1; extra == "spark"
|
|
35
35
|
Requires-Dist: zstandard>=0.25.0; extra == "spark"
|
|
@@ -43,8 +43,7 @@ Requires-Dist: duckdb>=0.5.0; extra == "ray"
|
|
|
43
43
|
Requires-Dist: pyarrow>=7.0.0; extra == "ray"
|
|
44
44
|
Requires-Dist: pandas; extra == "ray"
|
|
45
45
|
Provides-Extra: duckdb
|
|
46
|
-
Requires-Dist:
|
|
47
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "duckdb"
|
|
46
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "duckdb"
|
|
48
47
|
Requires-Dist: sqlglot<28; extra == "duckdb"
|
|
49
48
|
Requires-Dist: jinja2; extra == "duckdb"
|
|
50
49
|
Requires-Dist: duckdb>=0.5.0; extra == "duckdb"
|
|
@@ -52,8 +51,7 @@ Requires-Dist: numpy; extra == "duckdb"
|
|
|
52
51
|
Provides-Extra: polars
|
|
53
52
|
Requires-Dist: polars; extra == "polars"
|
|
54
53
|
Provides-Extra: ibis
|
|
55
|
-
Requires-Dist:
|
|
56
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "ibis"
|
|
54
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "ibis"
|
|
57
55
|
Requires-Dist: sqlglot<28; extra == "ibis"
|
|
58
56
|
Requires-Dist: jinja2; extra == "ibis"
|
|
59
57
|
Requires-Dist: ibis-framework[pandas]; extra == "ibis"
|
|
@@ -62,8 +60,7 @@ Requires-Dist: notebook; extra == "notebook"
|
|
|
62
60
|
Requires-Dist: jupyterlab; extra == "notebook"
|
|
63
61
|
Requires-Dist: ipython>=7.10.0; extra == "notebook"
|
|
64
62
|
Provides-Extra: all
|
|
65
|
-
Requires-Dist:
|
|
66
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "all"
|
|
63
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "all"
|
|
67
64
|
Requires-Dist: sqlglot<28; extra == "all"
|
|
68
65
|
Requires-Dist: jinja2; extra == "all"
|
|
69
66
|
Requires-Dist: pyspark>=3.1.1; extra == "all"
|
|
@@ -55,7 +55,7 @@ from fugue.execution.factory import (
|
|
|
55
55
|
from fugue.execution.native_execution_engine import (
|
|
56
56
|
NativeExecutionEngine,
|
|
57
57
|
PandasMapEngine,
|
|
58
|
-
|
|
58
|
+
DefaultSQLEngine,
|
|
59
59
|
)
|
|
60
60
|
from fugue.extensions.creator import Creator, creator, register_creator
|
|
61
61
|
from fugue.extensions.outputter import Outputter, outputter, register_outputter
|
|
@@ -23,6 +23,4 @@ def import_or_throw(package_name: str, message: str) -> Any:
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def import_fsql_dependency(package_name: str) -> Any:
|
|
26
|
-
return import_or_throw(
|
|
27
|
-
package_name, "Please try to install the package by `pip install fugue[sql]`."
|
|
28
|
-
)
|
|
26
|
+
return import_or_throw(package_name, "Please pip install with extra `fugue[sql]`.")
|
|
@@ -37,7 +37,7 @@ _FUGUE_GLOBAL_CONF = ParamDict(
|
|
|
37
37
|
FUGUE_CONF_WORKFLOW_CONCURRENCY: 1,
|
|
38
38
|
FUGUE_CONF_WORKFLOW_AUTO_PERSIST: False,
|
|
39
39
|
FUGUE_CONF_WORKFLOW_EXCEPTION_HIDE: "fugue.,six,adagio.,pandas,"
|
|
40
|
-
"fugue_dask.,dask.,fugue_spark.,pyspark.,antlr4,
|
|
40
|
+
"fugue_dask.,dask.,fugue_spark.,pyspark.,antlr4,triad,"
|
|
41
41
|
"fugue_notebook.,ipython.,jupyter.,ipykernel,_pytest,pytest,fugue_ibis.",
|
|
42
42
|
FUGUE_CONF_WORKFLOW_EXCEPTION_INJECT: 3,
|
|
43
43
|
FUGUE_CONF_WORKFLOW_EXCEPTION_OPTIMIZE: True,
|
|
@@ -32,7 +32,7 @@ from fugue.execution.factory import (
|
|
|
32
32
|
register_execution_engine,
|
|
33
33
|
register_sql_engine,
|
|
34
34
|
)
|
|
35
|
-
from fugue.execution.native_execution_engine import PandasMapEngine,
|
|
35
|
+
from fugue.execution.native_execution_engine import PandasMapEngine, DefaultSQLEngine
|
|
36
36
|
from fugue.rpc import (
|
|
37
37
|
EmptyRPCHandler,
|
|
38
38
|
RPCClient,
|
|
@@ -11,7 +11,6 @@ from triad.utils.io import makedirs
|
|
|
11
11
|
from triad.utils.pandas_like import PandasUtils
|
|
12
12
|
|
|
13
13
|
from fugue._utils.io import load_df, save_df
|
|
14
|
-
from fugue._utils.misc import import_fsql_dependency
|
|
15
14
|
from fugue.collections.partition import (
|
|
16
15
|
PartitionCursor,
|
|
17
16
|
PartitionSpec,
|
|
@@ -21,6 +20,7 @@ from fugue.collections.sql import StructuredRawSQL
|
|
|
21
20
|
from fugue.constants import KEYWORD_PARALLELISM, KEYWORD_ROWCOUNT
|
|
22
21
|
from fugue.dataframe import (
|
|
23
22
|
AnyDataFrame,
|
|
23
|
+
ArrowDataFrame,
|
|
24
24
|
DataFrame,
|
|
25
25
|
DataFrames,
|
|
26
26
|
LocalBoundedDataFrame,
|
|
@@ -39,31 +39,53 @@ from .execution_engine import (
|
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class
|
|
43
|
-
"""
|
|
42
|
+
class DefaultSQLEngine(SQLEngine):
|
|
43
|
+
"""DuckDB SQL backend implementation.
|
|
44
44
|
|
|
45
45
|
:param execution_engine: the execution engine this sql engine will run on
|
|
46
46
|
"""
|
|
47
47
|
|
|
48
48
|
@property
|
|
49
49
|
def dialect(self) -> Optional[str]:
|
|
50
|
-
return "
|
|
51
|
-
|
|
52
|
-
def to_df(self, df: AnyDataFrame, schema: Any = None) -> DataFrame:
|
|
53
|
-
return _to_native_execution_engine_df(df, schema)
|
|
54
|
-
|
|
55
|
-
@property
|
|
56
|
-
def is_distributed(self) -> bool:
|
|
57
|
-
return False
|
|
50
|
+
return "duckdb"
|
|
58
51
|
|
|
59
52
|
def select(self, dfs: DataFrames, statement: StructuredRawSQL) -> DataFrame:
|
|
60
|
-
|
|
53
|
+
import duckdb
|
|
54
|
+
|
|
55
|
+
from fugue_duckdb.dataframe import _duck_as_arrow
|
|
61
56
|
|
|
62
57
|
_dfs, _sql = self.encode(dfs, statement)
|
|
63
|
-
_dd = {k: self.to_df(v).as_pandas() for k, v in _dfs.items()} # type: ignore
|
|
64
58
|
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
with duckdb.connect() as conn:
|
|
60
|
+
for k, v in _dfs.items():
|
|
61
|
+
duckdb.from_arrow(v.as_arrow(), connection=conn).create_view(k)
|
|
62
|
+
return ArrowDataFrame(_duck_as_arrow(conn.sql(_sql)))
|
|
63
|
+
|
|
64
|
+
def table_exists(self, table: str) -> bool: # pragma: no cover
|
|
65
|
+
raise NotImplementedError(
|
|
66
|
+
"table_exists can only be used with DuckExecutionEngine"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def save_table(
|
|
70
|
+
self,
|
|
71
|
+
df: DataFrame,
|
|
72
|
+
table: str,
|
|
73
|
+
mode: str = "overwrite",
|
|
74
|
+
partition_spec: Optional[PartitionSpec] = None,
|
|
75
|
+
**kwargs: Any,
|
|
76
|
+
) -> None: # pragma: no cover
|
|
77
|
+
raise NotImplementedError(
|
|
78
|
+
"save_table can only be used with DuckExecutionEngine"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def load_table(self, table: str, **kwargs: Any) -> DataFrame: # pragma: no cover
|
|
82
|
+
raise NotImplementedError(
|
|
83
|
+
"load_table can only be used with DuckExecutionEngine"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def is_distributed(self) -> bool:
|
|
88
|
+
return False
|
|
67
89
|
|
|
68
90
|
|
|
69
91
|
class PandasMapEngine(MapEngine):
|
|
@@ -148,8 +170,9 @@ class PandasMapEngine(MapEngine):
|
|
|
148
170
|
output_df = PandasDataFrame(output_df.native, output_schema)
|
|
149
171
|
assert_or_throw(
|
|
150
172
|
output_df.schema == output_schema,
|
|
151
|
-
lambda:
|
|
152
|
-
|
|
173
|
+
lambda: (
|
|
174
|
+
f"map output {output_df.schema} mismatches given {output_schema}"
|
|
175
|
+
),
|
|
153
176
|
)
|
|
154
177
|
return self.to_df(output_df) # type: ignore
|
|
155
178
|
|
|
@@ -194,7 +217,7 @@ class NativeExecutionEngine(ExecutionEngine):
|
|
|
194
217
|
return False
|
|
195
218
|
|
|
196
219
|
def create_default_sql_engine(self) -> SQLEngine:
|
|
197
|
-
return
|
|
220
|
+
return DefaultSQLEngine(self)
|
|
198
221
|
|
|
199
222
|
def create_default_map_engine(self) -> MapEngine:
|
|
200
223
|
return PandasMapEngine(self)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from fugue.execution.factory import register_execution_engine, register_sql_engine
|
|
2
2
|
from fugue.execution.native_execution_engine import (
|
|
3
|
+
DefaultSQLEngine,
|
|
3
4
|
NativeExecutionEngine,
|
|
4
|
-
QPDPandasEngine,
|
|
5
5
|
)
|
|
6
6
|
|
|
7
7
|
|
|
@@ -25,8 +25,5 @@ def _register_engines() -> None:
|
|
|
25
25
|
"pandas", lambda conf: NativeExecutionEngine(conf), on_dup="ignore"
|
|
26
26
|
)
|
|
27
27
|
register_sql_engine(
|
|
28
|
-
"
|
|
29
|
-
)
|
|
30
|
-
register_sql_engine(
|
|
31
|
-
"qpd_pandas", lambda engine: QPDPandasEngine(engine), on_dup="ignore"
|
|
28
|
+
"default", lambda engine: DefaultSQLEngine(engine), on_dup="ignore"
|
|
32
29
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fugue
|
|
3
|
-
Version: 0.9.7.
|
|
3
|
+
Version: 0.9.7.dev2
|
|
4
4
|
Summary: An abstraction layer for distributed computing
|
|
5
5
|
Author-email: The Fugue Development Team <hello@fugue.ai>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -24,12 +24,12 @@ Requires-Dist: triad>=1.0.1
|
|
|
24
24
|
Requires-Dist: adagio>=0.2.6
|
|
25
25
|
Requires-Dist: pandas<3
|
|
26
26
|
Provides-Extra: sql
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: fugue-sql-antlr>=0.2.
|
|
27
|
+
Requires-Dist: duckdb>=0.5.0; extra == "sql"
|
|
28
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "sql"
|
|
29
29
|
Requires-Dist: sqlglot<28; extra == "sql"
|
|
30
30
|
Requires-Dist: jinja2; extra == "sql"
|
|
31
31
|
Provides-Extra: cpp-sql-parser
|
|
32
|
-
Requires-Dist: fugue-sql-antlr[cpp]>=0.2.
|
|
32
|
+
Requires-Dist: fugue-sql-antlr[cpp]>=0.2.4; extra == "cpp-sql-parser"
|
|
33
33
|
Provides-Extra: spark
|
|
34
34
|
Requires-Dist: pyspark>=3.1.1; extra == "spark"
|
|
35
35
|
Requires-Dist: zstandard>=0.25.0; extra == "spark"
|
|
@@ -43,8 +43,7 @@ Requires-Dist: duckdb>=0.5.0; extra == "ray"
|
|
|
43
43
|
Requires-Dist: pyarrow>=7.0.0; extra == "ray"
|
|
44
44
|
Requires-Dist: pandas; extra == "ray"
|
|
45
45
|
Provides-Extra: duckdb
|
|
46
|
-
Requires-Dist:
|
|
47
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "duckdb"
|
|
46
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "duckdb"
|
|
48
47
|
Requires-Dist: sqlglot<28; extra == "duckdb"
|
|
49
48
|
Requires-Dist: jinja2; extra == "duckdb"
|
|
50
49
|
Requires-Dist: duckdb>=0.5.0; extra == "duckdb"
|
|
@@ -52,8 +51,7 @@ Requires-Dist: numpy; extra == "duckdb"
|
|
|
52
51
|
Provides-Extra: polars
|
|
53
52
|
Requires-Dist: polars; extra == "polars"
|
|
54
53
|
Provides-Extra: ibis
|
|
55
|
-
Requires-Dist:
|
|
56
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "ibis"
|
|
54
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "ibis"
|
|
57
55
|
Requires-Dist: sqlglot<28; extra == "ibis"
|
|
58
56
|
Requires-Dist: jinja2; extra == "ibis"
|
|
59
57
|
Requires-Dist: ibis-framework[pandas]; extra == "ibis"
|
|
@@ -62,8 +60,7 @@ Requires-Dist: notebook; extra == "notebook"
|
|
|
62
60
|
Requires-Dist: jupyterlab; extra == "notebook"
|
|
63
61
|
Requires-Dist: ipython>=7.10.0; extra == "notebook"
|
|
64
62
|
Provides-Extra: all
|
|
65
|
-
Requires-Dist:
|
|
66
|
-
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "all"
|
|
63
|
+
Requires-Dist: fugue-sql-antlr>=0.2.4; extra == "all"
|
|
67
64
|
Requires-Dist: sqlglot<28; extra == "all"
|
|
68
65
|
Requires-Dist: jinja2; extra == "all"
|
|
69
66
|
Requires-Dist: pyspark>=3.1.1; extra == "all"
|
|
@@ -3,8 +3,7 @@ adagio>=0.2.6
|
|
|
3
3
|
pandas<3
|
|
4
4
|
|
|
5
5
|
[all]
|
|
6
|
-
|
|
7
|
-
fugue-sql-antlr>=0.2.0
|
|
6
|
+
fugue-sql-antlr>=0.2.4
|
|
8
7
|
sqlglot<28
|
|
9
8
|
jinja2
|
|
10
9
|
pyspark>=3.1.1
|
|
@@ -23,7 +22,7 @@ polars
|
|
|
23
22
|
ray[data]>=2.30.0
|
|
24
23
|
|
|
25
24
|
[cpp_sql_parser]
|
|
26
|
-
fugue-sql-antlr[cpp]>=0.2.
|
|
25
|
+
fugue-sql-antlr[cpp]>=0.2.4
|
|
27
26
|
|
|
28
27
|
[dask]
|
|
29
28
|
dask[dataframe,distributed]>=2024.4.0
|
|
@@ -31,16 +30,14 @@ pyarrow>=7.0.0
|
|
|
31
30
|
pandas>=2.0.2
|
|
32
31
|
|
|
33
32
|
[duckdb]
|
|
34
|
-
|
|
35
|
-
fugue-sql-antlr>=0.2.0
|
|
33
|
+
fugue-sql-antlr>=0.2.4
|
|
36
34
|
sqlglot<28
|
|
37
35
|
jinja2
|
|
38
36
|
duckdb>=0.5.0
|
|
39
37
|
numpy
|
|
40
38
|
|
|
41
39
|
[ibis]
|
|
42
|
-
|
|
43
|
-
fugue-sql-antlr>=0.2.0
|
|
40
|
+
fugue-sql-antlr>=0.2.4
|
|
44
41
|
sqlglot<28
|
|
45
42
|
jinja2
|
|
46
43
|
ibis-framework[pandas]
|
|
@@ -66,7 +63,7 @@ pyspark>=3.1.1
|
|
|
66
63
|
zstandard>=0.25.0
|
|
67
64
|
|
|
68
65
|
[sql]
|
|
69
|
-
|
|
70
|
-
fugue-sql-antlr>=0.2.
|
|
66
|
+
duckdb>=0.5.0
|
|
67
|
+
fugue-sql-antlr>=0.2.4
|
|
71
68
|
sqlglot<28
|
|
72
69
|
jinja2
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# pylint: disable-all
|
|
2
2
|
try:
|
|
3
|
-
import
|
|
3
|
+
import duckdb # noqa: F401
|
|
4
|
+
import sqlglot # noqa: F401
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
HAS_DEFAULT_SQL_ENGINE = True
|
|
6
7
|
except ImportError: # pragma: no cover
|
|
7
|
-
|
|
8
|
+
HAS_DEFAULT_SQL_ENGINE = False
|
|
8
9
|
|
|
9
10
|
import datetime
|
|
10
11
|
import os
|
|
@@ -29,6 +30,7 @@ from fugue import (
|
|
|
29
30
|
CoTransformer,
|
|
30
31
|
DataFrame,
|
|
31
32
|
DataFrames,
|
|
33
|
+
DefaultSQLEngine,
|
|
32
34
|
ExecutionEngine,
|
|
33
35
|
FugueWorkflow,
|
|
34
36
|
LocalDataFrame,
|
|
@@ -38,7 +40,6 @@ from fugue import (
|
|
|
38
40
|
PandasDataFrame,
|
|
39
41
|
PartitionSpec,
|
|
40
42
|
Processor,
|
|
41
|
-
QPDPandasEngine,
|
|
42
43
|
Schema,
|
|
43
44
|
Transformer,
|
|
44
45
|
cotransformer,
|
|
@@ -858,7 +859,9 @@ class BuiltInTests(object):
|
|
|
858
859
|
).assert_eq(d)
|
|
859
860
|
dag.run(self.engine)
|
|
860
861
|
|
|
861
|
-
@pytest.mark.skipif(
|
|
862
|
+
@pytest.mark.skipif(
|
|
863
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
864
|
+
)
|
|
862
865
|
def test_df_select(self):
|
|
863
866
|
with FugueWorkflow() as dag:
|
|
864
867
|
# wildcard
|
|
@@ -910,7 +913,9 @@ class BuiltInTests(object):
|
|
|
910
913
|
dag.select("select * from", a).assert_eq(b)
|
|
911
914
|
dag.run(self.engine, {"fugue.sql.compile.ignore_case": True})
|
|
912
915
|
|
|
913
|
-
@pytest.mark.skipif(
|
|
916
|
+
@pytest.mark.skipif(
|
|
917
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
918
|
+
)
|
|
914
919
|
def test_df_filter(self):
|
|
915
920
|
with FugueWorkflow() as dag:
|
|
916
921
|
a = dag.df([[1, 10], [2, 20], [3, 30]], "x:int,y:int")
|
|
@@ -918,7 +923,9 @@ class BuiltInTests(object):
|
|
|
918
923
|
a.filter((col("y") > 15) & (col("y") < 25)).assert_eq(b)
|
|
919
924
|
dag.run(self.engine)
|
|
920
925
|
|
|
921
|
-
@pytest.mark.skipif(
|
|
926
|
+
@pytest.mark.skipif(
|
|
927
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
928
|
+
)
|
|
922
929
|
def test_df_assign(self):
|
|
923
930
|
with FugueWorkflow() as dag:
|
|
924
931
|
a = dag.df([[1, 10], [2, 20], [3, 30]], "x:int,y:int")
|
|
@@ -932,7 +939,9 @@ class BuiltInTests(object):
|
|
|
932
939
|
a.assign(lit("x").alias("y"), z=(col("y") + 1).cast(float)).assert_eq(b)
|
|
933
940
|
dag.run(self.engine)
|
|
934
941
|
|
|
935
|
-
@pytest.mark.skipif(
|
|
942
|
+
@pytest.mark.skipif(
|
|
943
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
944
|
+
)
|
|
936
945
|
def test_aggregate(self):
|
|
937
946
|
with FugueWorkflow() as dag:
|
|
938
947
|
a = dag.df([[1, 10], [1, 200], [3, 30]], "x:int,y:int")
|
|
@@ -946,9 +955,11 @@ class BuiltInTests(object):
|
|
|
946
955
|
).assert_eq(c)
|
|
947
956
|
dag.run(self.engine)
|
|
948
957
|
|
|
949
|
-
@pytest.mark.skipif(
|
|
958
|
+
@pytest.mark.skipif(
|
|
959
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
960
|
+
)
|
|
950
961
|
def test_select(self):
|
|
951
|
-
class MockEngine(
|
|
962
|
+
class MockEngine(DefaultSQLEngine):
|
|
952
963
|
def __init__(self, execution_engine, p: int = 0):
|
|
953
964
|
super().__init__(execution_engine)
|
|
954
965
|
self.p = p
|
|
@@ -985,7 +996,7 @@ class BuiltInTests(object):
|
|
|
985
996
|
"AS t1 INNER JOIN",
|
|
986
997
|
b,
|
|
987
998
|
"AS t2 ON t1.x=t2.x",
|
|
988
|
-
sql_engine="
|
|
999
|
+
sql_engine="default",
|
|
989
1000
|
).assert_eq(c)
|
|
990
1001
|
|
|
991
1002
|
# specify sql engine and params
|
|
@@ -1059,7 +1070,6 @@ class BuiltInTests(object):
|
|
|
1059
1070
|
"x:long,y:double",
|
|
1060
1071
|
)
|
|
1061
1072
|
)
|
|
1062
|
-
# TODO: INTERSECT ALL is not implemented (QPD issue)
|
|
1063
1073
|
# a.intersect(b, distinct=False).assert_eq(
|
|
1064
1074
|
# ArrayDataFrame(
|
|
1065
1075
|
# [[2, None], [2, None]],
|
|
@@ -1091,7 +1101,6 @@ class BuiltInTests(object):
|
|
|
1091
1101
|
"x:long,y:double",
|
|
1092
1102
|
)
|
|
1093
1103
|
)
|
|
1094
|
-
# # TODO: EXCEPT ALL is not implemented (QPD issue)
|
|
1095
1104
|
# a.subtract(c, distinct=False).assert_eq(
|
|
1096
1105
|
# ArrayDataFrame(
|
|
1097
1106
|
# [[2, None], [2, None]],
|
|
@@ -1634,7 +1643,7 @@ class BuiltInTests(object):
|
|
|
1634
1643
|
df.partition(by=["a"]).out_transform(t12)
|
|
1635
1644
|
raises(
|
|
1636
1645
|
FugueInterfacelessError,
|
|
1637
|
-
lambda:
|
|
1646
|
+
lambda: df.partition(by=["a"]).out_transform(t1),
|
|
1638
1647
|
) # for t1, callback must be provided
|
|
1639
1648
|
df.assert_eq(res)
|
|
1640
1649
|
dag.run(self.engine)
|
|
@@ -1691,7 +1700,9 @@ class BuiltInTests(object):
|
|
|
1691
1700
|
|
|
1692
1701
|
assert 4 == cb3.n
|
|
1693
1702
|
|
|
1694
|
-
@pytest.mark.skipif(
|
|
1703
|
+
@pytest.mark.skipif(
|
|
1704
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
1705
|
+
)
|
|
1695
1706
|
def test_sql_api(self):
|
|
1696
1707
|
def tr(df: pd.DataFrame, n=1) -> pd.DataFrame:
|
|
1697
1708
|
return df + n
|
|
@@ -1738,7 +1749,9 @@ class BuiltInTests(object):
|
|
|
1738
1749
|
assert fa.is_local(sdf4)
|
|
1739
1750
|
|
|
1740
1751
|
@pytest.mark.skipif(os.name == "nt", reason="Skip Windows")
|
|
1741
|
-
@pytest.mark.skipif(
|
|
1752
|
+
@pytest.mark.skipif(
|
|
1753
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
1754
|
+
)
|
|
1742
1755
|
def test_any_column_name(self):
|
|
1743
1756
|
f_parquet = os.path.join(str(self.tmpdir), "a.parquet")
|
|
1744
1757
|
f_csv = os.path.join(str(self.tmpdir), "a.csv")
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# pylint: disable-all
|
|
2
2
|
try:
|
|
3
|
-
import
|
|
3
|
+
import duckdb # noqa: F401
|
|
4
|
+
import sqlglot # noqa: F401
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
HAS_DEFAULT_SQL_ENGINE = True
|
|
6
7
|
except ImportError: # pragma: no cover
|
|
7
|
-
|
|
8
|
+
HAS_DEFAULT_SQL_ENGINE = False
|
|
8
9
|
|
|
9
10
|
import copy
|
|
10
11
|
import os
|
|
@@ -81,7 +82,9 @@ class ExecutionEngineTests(object):
|
|
|
81
82
|
pdf = pdf[pdf.a < 0]
|
|
82
83
|
self.df_eq(o, fa.as_fugue_engine_df(e, pdf), throw=True)
|
|
83
84
|
|
|
84
|
-
@pytest.mark.skipif(
|
|
85
|
+
@pytest.mark.skipif(
|
|
86
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
87
|
+
)
|
|
85
88
|
def test_filter(self):
|
|
86
89
|
a = ArrayDataFrame(
|
|
87
90
|
[[1, 2], [None, 2], [None, 1], [3, 4], [None, 4]],
|
|
@@ -94,7 +97,9 @@ class ExecutionEngineTests(object):
|
|
|
94
97
|
c = fa.filter(a, col("a") + col("b") == 3)
|
|
95
98
|
self.df_eq(c, [[1, 2]], "a:double,b:int", throw=True)
|
|
96
99
|
|
|
97
|
-
@pytest.mark.skipif(
|
|
100
|
+
@pytest.mark.skipif(
|
|
101
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
102
|
+
)
|
|
98
103
|
def test_select(self):
|
|
99
104
|
a = ArrayDataFrame(
|
|
100
105
|
[[1, 2], [None, 2], [None, 1], [3, 4], [None, 4]], "a:double,b:int"
|
|
@@ -153,7 +158,9 @@ class ExecutionEngineTests(object):
|
|
|
153
158
|
b, [[1, "1", 2], [None, "1", 7]], "a:double,o:str,c:double", throw=True
|
|
154
159
|
)
|
|
155
160
|
|
|
156
|
-
@pytest.mark.skipif(
|
|
161
|
+
@pytest.mark.skipif(
|
|
162
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
163
|
+
)
|
|
157
164
|
def test_assign(self):
|
|
158
165
|
a = ArrayDataFrame(
|
|
159
166
|
[[1, 2], [None, 2], [None, 1], [3, 4], [None, 4]], "a:double,b:int"
|
|
@@ -173,7 +180,9 @@ class ExecutionEngineTests(object):
|
|
|
173
180
|
throw=True,
|
|
174
181
|
)
|
|
175
182
|
|
|
176
|
-
@pytest.mark.skipif(
|
|
183
|
+
@pytest.mark.skipif(
|
|
184
|
+
not HAS_DEFAULT_SQL_ENGINE, reason="Default sql engine not available"
|
|
185
|
+
)
|
|
177
186
|
def test_aggregate(self):
|
|
178
187
|
a = ArrayDataFrame(
|
|
179
188
|
[[1, 2], [None, 2], [None, 1], [3, 4], [None, 4]], "a:double,b:int"
|
|
@@ -605,7 +614,6 @@ class ExecutionEngineTests(object):
|
|
|
605
614
|
"a:double,b:double,c:int",
|
|
606
615
|
throw=True,
|
|
607
616
|
)
|
|
608
|
-
# TODO: EXCEPT ALL is not implemented (QPD issue)
|
|
609
617
|
# c = fa.subtract(a, b, distinct=False)
|
|
610
618
|
# self.df_eq(
|
|
611
619
|
# c,
|
|
@@ -648,7 +656,6 @@ class ExecutionEngineTests(object):
|
|
|
648
656
|
"a:double,b:double,c:int",
|
|
649
657
|
throw=True,
|
|
650
658
|
)
|
|
651
|
-
# TODO: INTERSECT ALL is not implemented (QPD issue)
|
|
652
659
|
# c = fa.intersect(a, b, distinct=False)
|
|
653
660
|
# self.df_eq(
|
|
654
661
|
# c,
|
|
@@ -4,14 +4,20 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "fugue"
|
|
7
|
-
version = "0.9.7.
|
|
7
|
+
version = "0.9.7.dev2"
|
|
8
8
|
description = "An abstraction layer for distributed computing"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
license = {text = "Apache-2.0"}
|
|
11
|
-
authors = [
|
|
12
|
-
|
|
10
|
+
license = { text = "Apache-2.0" }
|
|
11
|
+
authors = [{ name = "The Fugue Development Team", email = "hello@fugue.ai" }]
|
|
12
|
+
keywords = [
|
|
13
|
+
"distributed",
|
|
14
|
+
"spark",
|
|
15
|
+
"dask",
|
|
16
|
+
"ray",
|
|
17
|
+
"sql",
|
|
18
|
+
"dsl",
|
|
19
|
+
"domain specific language",
|
|
13
20
|
]
|
|
14
|
-
keywords = ["distributed", "spark", "dask", "ray", "sql", "dsl", "domain specific language"]
|
|
15
21
|
classifiers = [
|
|
16
22
|
"Development Status :: 5 - Production/Stable",
|
|
17
23
|
"Intended Audience :: Developers",
|
|
@@ -25,28 +31,16 @@ classifiers = [
|
|
|
25
31
|
"Programming Language :: Python :: 3 :: Only",
|
|
26
32
|
]
|
|
27
33
|
requires-python = ">=3.10"
|
|
28
|
-
dependencies = [
|
|
29
|
-
"triad>=1.0.1",
|
|
30
|
-
"adagio>=0.2.6",
|
|
31
|
-
"pandas<3",
|
|
32
|
-
]
|
|
34
|
+
dependencies = ["triad>=1.0.1", "adagio>=0.2.6", "pandas<3"]
|
|
33
35
|
|
|
34
36
|
[project.urls]
|
|
35
37
|
Homepage = "http://github.com/fugue-project/fugue"
|
|
36
38
|
Repository = "http://github.com/fugue-project/fugue"
|
|
37
39
|
|
|
38
40
|
[project.optional-dependencies]
|
|
39
|
-
sql = [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"sqlglot<28",
|
|
43
|
-
"jinja2",
|
|
44
|
-
]
|
|
45
|
-
cpp_sql_parser = ["fugue-sql-antlr[cpp]>=0.2.0"]
|
|
46
|
-
spark = [
|
|
47
|
-
"pyspark>=3.1.1",
|
|
48
|
-
"zstandard>=0.25.0",
|
|
49
|
-
]
|
|
41
|
+
sql = ["duckdb>=0.5.0", "fugue-sql-antlr>=0.2.4", "sqlglot<28", "jinja2"]
|
|
42
|
+
cpp_sql_parser = ["fugue-sql-antlr[cpp]>=0.2.4"]
|
|
43
|
+
spark = ["pyspark>=3.1.1", "zstandard>=0.25.0"]
|
|
50
44
|
dask = [
|
|
51
45
|
"dask[distributed,dataframe]>=2024.4.0",
|
|
52
46
|
"pyarrow>=7.0.0",
|
|
@@ -59,8 +53,7 @@ ray = [
|
|
|
59
53
|
"pandas",
|
|
60
54
|
]
|
|
61
55
|
duckdb = [
|
|
62
|
-
"
|
|
63
|
-
"fugue-sql-antlr>=0.2.0",
|
|
56
|
+
"fugue-sql-antlr>=0.2.4",
|
|
64
57
|
"sqlglot<28",
|
|
65
58
|
"jinja2",
|
|
66
59
|
"duckdb>=0.5.0",
|
|
@@ -68,20 +61,14 @@ duckdb = [
|
|
|
68
61
|
]
|
|
69
62
|
polars = ["polars"]
|
|
70
63
|
ibis = [
|
|
71
|
-
"
|
|
72
|
-
"fugue-sql-antlr>=0.2.0",
|
|
64
|
+
"fugue-sql-antlr>=0.2.4",
|
|
73
65
|
"sqlglot<28",
|
|
74
66
|
"jinja2",
|
|
75
67
|
"ibis-framework[pandas]",
|
|
76
68
|
]
|
|
77
|
-
notebook = [
|
|
78
|
-
"notebook",
|
|
79
|
-
"jupyterlab",
|
|
80
|
-
"ipython>=7.10.0",
|
|
81
|
-
]
|
|
69
|
+
notebook = ["notebook", "jupyterlab", "ipython>=7.10.0"]
|
|
82
70
|
all = [
|
|
83
|
-
"
|
|
84
|
-
"fugue-sql-antlr>=0.2.0",
|
|
71
|
+
"fugue-sql-antlr>=0.2.4",
|
|
85
72
|
"sqlglot<28",
|
|
86
73
|
"jinja2",
|
|
87
74
|
"pyspark>=3.1.1",
|
|
@@ -116,7 +103,7 @@ dev = [
|
|
|
116
103
|
"pytest",
|
|
117
104
|
"pytest-cov",
|
|
118
105
|
"pytest-mock",
|
|
119
|
-
"pytest-rerunfailures
|
|
106
|
+
"pytest-rerunfailures>10.2",
|
|
120
107
|
# Additional test dependencies
|
|
121
108
|
"flask",
|
|
122
109
|
"psutil",
|
|
@@ -148,7 +135,7 @@ fugue_test = "fugue_test"
|
|
|
148
135
|
fugue_test_fixtures = "fugue_test.fixtures"
|
|
149
136
|
|
|
150
137
|
[tool.setuptools]
|
|
151
|
-
packages = {find = {include = ["fugue*"]}}
|
|
138
|
+
packages = { find = { include = ["fugue*"] } }
|
|
152
139
|
|
|
153
140
|
[tool.setuptools.package-data]
|
|
154
141
|
fugue = ["py.typed"]
|
|
@@ -156,7 +143,8 @@ fugue_notebook = ["nbextension/*"]
|
|
|
156
143
|
|
|
157
144
|
[tool.pytest.ini_options]
|
|
158
145
|
addopts = [
|
|
159
|
-
"-p",
|
|
146
|
+
"-p",
|
|
147
|
+
"pytest_cov",
|
|
160
148
|
"--cov=fugue",
|
|
161
149
|
"--cov=fugue_test",
|
|
162
150
|
"--cov=fugue_spark",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|