deepfos 1.1.2__tar.gz → 1.1.4__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.
- {deepfos-1.1.2 → deepfos-1.1.4}/PKG-INFO +1 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/dimension.py +20 -3
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/models/dimension.py +2 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/cache.py +11 -0
- deepfos-1.1.4/deepfos/core/__init__.py +27 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/tablemodel.py +28 -5
- deepfos-1.1.4/deepfos/db/__init__.py +32 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/clickhouse.py +3 -3
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/dbkits.py +33 -8
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/deepengine.py +3 -3
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/mysql.py +6 -2
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/oracle.py +2 -2
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/postgresql.py +3 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/sqlserver.py +3 -3
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/utils.py +45 -0
- deepfos-1.1.4/deepfos/element/__init__.py +77 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/apvlprocess.py +13 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/bizmodel.py +63 -28
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/datatable.py +101 -21
- deepfos-1.1.2/deepfos/lazy_import.py → deepfos-1.1.4/deepfos/lazy.py +20 -3
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/decorator.py +10 -4
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/PKG-INFO +1 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/SOURCES.txt +1 -1
- {deepfos-1.1.2 → deepfos-1.1.4}/setup.py +1 -1
- deepfos-1.1.4/tests/__init__.py +4 -0
- deepfos-1.1.2/deepfos/core/__init__.py +0 -27
- deepfos-1.1.2/deepfos/db/__init__.py +0 -50
- deepfos-1.1.2/deepfos/element/__init__.py +0 -96
- deepfos-1.1.2/tests/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/MANIFEST.in +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/README.md +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/_version.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/account.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/app.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/base.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/python.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/space.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/system.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/config.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/base.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/dimension.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/finmodel.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/workflow.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/sysutils.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/local.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/options.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/translation.py +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/setup.cfg +0 -0
- {deepfos-1.1.2 → deepfos-1.1.4}/versioneer.py +0 -0
|
@@ -3,7 +3,7 @@ APIs provided by dimension-server1-2
|
|
|
3
3
|
|
|
4
4
|
generated by api_code_gen.py
|
|
5
5
|
- **filename** : ``dimension.py``
|
|
6
|
-
- **json timestamp** : ``
|
|
6
|
+
- **json timestamp** : ``2023-05-26 15:05:44``
|
|
7
7
|
"""
|
|
8
8
|
from deepfos.api.base import get, post, DynamicRootAPI, ChildAPI
|
|
9
9
|
from .models.dimension import *
|
|
@@ -170,7 +170,7 @@ class DimCheckAPI(last_ver.DimCheckAPI):
|
|
|
170
170
|
|
|
171
171
|
class Extra(last_ver.Extra):
|
|
172
172
|
endpoint = '/'
|
|
173
|
-
|
|
173
|
+
|
|
174
174
|
@post('refactor/dimension/info/query')
|
|
175
175
|
def refactor_dimension_info_query(self, param: ElementBaseInfoParam) -> Union[NewDimension, Awaitable[NewDimension]]:
|
|
176
176
|
"""
|
|
@@ -191,6 +191,18 @@ class Extra(last_ver.Extra):
|
|
|
191
191
|
return {'body': dimension}
|
|
192
192
|
|
|
193
193
|
|
|
194
|
+
class DimObjectAPI(ChildAPI):
|
|
195
|
+
endpoint = '/refactor/dimension/object'
|
|
196
|
+
|
|
197
|
+
@get('sync-data')
|
|
198
|
+
def sync_data(self, folderId: str = None, name: str = None, path: str = None) -> Union[Any, Awaitable[Any]]:
|
|
199
|
+
"""
|
|
200
|
+
导出多维实体维度配置表
|
|
201
|
+
|
|
202
|
+
"""
|
|
203
|
+
return {'param': {'folderId': folderId, 'name': name, 'path': path}}
|
|
204
|
+
|
|
205
|
+
|
|
194
206
|
class DimensionAPI(DynamicRootAPI, builtin=True):
|
|
195
207
|
"""维度组件接口"""
|
|
196
208
|
module_type = 'DIM'
|
|
@@ -228,4 +240,9 @@ class DimensionAPI(DynamicRootAPI, builtin=True):
|
|
|
228
240
|
"""
|
|
229
241
|
return Extra(self)
|
|
230
242
|
|
|
231
|
-
|
|
243
|
+
@cached_property
|
|
244
|
+
def object(self) -> DimObjectAPI:
|
|
245
|
+
"""
|
|
246
|
+
维度与模型对象相关接口
|
|
247
|
+
"""
|
|
248
|
+
return DimObjectAPI(self)
|
|
@@ -3,7 +3,7 @@ Models used by /dimension-server1-2
|
|
|
3
3
|
|
|
4
4
|
generated by model_code_gen.py
|
|
5
5
|
- **filename** : ``dimension.py``
|
|
6
|
-
- **json timestamp** : ``
|
|
6
|
+
- **json timestamp** : ``2023-05-26 15:05:44``
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
|
|
@@ -1767,6 +1767,7 @@ class ResponseResult(BaseModel):
|
|
|
1767
1767
|
- **POST** ``/dimension/query/get-all-year-period-of-sceanrio`` (Response: 200)
|
|
1768
1768
|
- **POST** ``/dimension/query/select-dimension-member-by-name-function`` (Response: 200)
|
|
1769
1769
|
- **POST** ``/dimension/query/select-dimension-member-by-name-function-batch`` (Response: 200)
|
|
1770
|
+
- **GET** ``/refactor/dimension/object/sync-data`` (Response: 200)
|
|
1770
1771
|
"""
|
|
1771
1772
|
#: code
|
|
1772
1773
|
code: Optional[int]
|
|
@@ -49,6 +49,8 @@ class CustomedCache:
|
|
|
49
49
|
def __init_subclass__(cls, *args, **kwargs):
|
|
50
50
|
if hasattr(cls, 'clear'):
|
|
51
51
|
cls.clear = cls.customed_clear(getattr(cls, 'clear'))
|
|
52
|
+
if hasattr(cls, 'pop'):
|
|
53
|
+
cls.pop = cls.customed_pop(getattr(cls, 'pop'))
|
|
52
54
|
|
|
53
55
|
for funcname in {'__getitem__', '__setitem__', '__delitem__', '__contains__'}:
|
|
54
56
|
if hasattr(cls, funcname):
|
|
@@ -75,6 +77,15 @@ class CustomedCache:
|
|
|
75
77
|
|
|
76
78
|
return new_func
|
|
77
79
|
|
|
80
|
+
@staticmethod
|
|
81
|
+
def customed_pop(ori_func):
|
|
82
|
+
@functools.wraps(ori_func)
|
|
83
|
+
def new_func(self, key, *args, **kwargs):
|
|
84
|
+
key = key[1]
|
|
85
|
+
return ori_func(self, key, *args, **kwargs)
|
|
86
|
+
|
|
87
|
+
return new_func
|
|
88
|
+
|
|
78
89
|
@classmethod
|
|
79
90
|
def additional_key(cls): # pragma: no cover
|
|
80
91
|
raise NotImplementedError
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from deepfos.lazy import lazify
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
6
|
+
from .cube import SysCube, Cube, as_function_node
|
|
7
|
+
from .dimension import (
|
|
8
|
+
DimMember, SysDimension, read_expr,
|
|
9
|
+
Dimension, DimExprAnalysor, ElementDimension
|
|
10
|
+
)
|
|
11
|
+
from .logictable import SQLCondition, BaseTable, MetaTable, TreeRenderer
|
|
12
|
+
|
|
13
|
+
lazify(
|
|
14
|
+
{
|
|
15
|
+
'deepfos.core.cube': (
|
|
16
|
+
'SysCube', 'Cube', 'as_function_node'
|
|
17
|
+
),
|
|
18
|
+
'deepfos.core.dimension': (
|
|
19
|
+
'DimMember', 'SysDimension', 'read_expr',
|
|
20
|
+
'Dimension', 'DimExprAnalysor', 'ElementDimension'
|
|
21
|
+
),
|
|
22
|
+
'deepfos.core.logictable': (
|
|
23
|
+
'SQLCondition', 'BaseTable', 'MetaTable', 'TreeRenderer'
|
|
24
|
+
),
|
|
25
|
+
},
|
|
26
|
+
globals()
|
|
27
|
+
)
|
|
@@ -8,7 +8,11 @@ from loguru import logger
|
|
|
8
8
|
from deepfos.lib.decorator import cached_property
|
|
9
9
|
from deepfos.element.datatable import (
|
|
10
10
|
DataTableMySQL, DataTableClickHouse,
|
|
11
|
-
DataTableOracle, DataTableSQLServer,
|
|
11
|
+
DataTableOracle, DataTableSQLServer, DataTableDeepEngine, DataTablePostgreSQL, DataTableDaMeng,
|
|
12
|
+
DataTableGauss, DataTableKingBase,
|
|
13
|
+
AsyncDataTableMySQL, AsyncDataTableClickHouse, AsyncDataTableOracle, AsyncDataTableSQLServer,
|
|
14
|
+
AsyncDataTableKingBase, AsyncDataTableGauss, AsyncDataTableDaMeng, AsyncDataTablePostgreSQL,
|
|
15
|
+
AsyncDataTableDeepEngine, get_table_class
|
|
12
16
|
)
|
|
13
17
|
from deepfos.api.models.app import ConfirmElementInfoDto
|
|
14
18
|
import pandas as pd
|
|
@@ -19,8 +23,15 @@ from contextlib import contextmanager
|
|
|
19
23
|
from collections import defaultdict
|
|
20
24
|
import copy
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
T_AbsDataTable = Union[
|
|
27
|
+
DataTableMySQL, DataTableClickHouse, DataTableOracle, DataTableSQLServer,
|
|
28
|
+
DataTableKingBase, DataTableGauss, DataTableDaMeng, DataTablePostgreSQL, DataTableDeepEngine
|
|
29
|
+
]
|
|
30
|
+
T_AbsAsyncDataTable = Union[
|
|
31
|
+
AsyncDataTableMySQL, AsyncDataTableClickHouse, AsyncDataTableOracle, AsyncDataTableSQLServer,
|
|
32
|
+
AsyncDataTableKingBase, AsyncDataTableGauss, AsyncDataTableDaMeng, AsyncDataTablePostgreSQL,
|
|
33
|
+
AsyncDataTableDeepEngine
|
|
34
|
+
]
|
|
24
35
|
|
|
25
36
|
|
|
26
37
|
# -----------------------------------------------------------------------------
|
|
@@ -30,7 +41,7 @@ class TableInfo(ConfirmElementInfoDto):
|
|
|
30
41
|
serverName: Optional[str]
|
|
31
42
|
|
|
32
43
|
|
|
33
|
-
def get_datatable(table_info: Union[TableInfo, dict]) -> T_AbsDataTable:
|
|
44
|
+
def get_datatable(table_info: Union[TableInfo, dict], sync=True) -> Union[T_AbsDataTable, T_AbsAsyncDataTable]:
|
|
34
45
|
if isinstance(table_info, TableInfo):
|
|
35
46
|
init_args = {
|
|
36
47
|
'element_name': table_info.elementName,
|
|
@@ -46,7 +57,7 @@ def get_datatable(table_info: Union[TableInfo, dict]) -> T_AbsDataTable:
|
|
|
46
57
|
if element_type is None:
|
|
47
58
|
raise ValueError("element_type is needed in table_info")
|
|
48
59
|
|
|
49
|
-
return get_table_class(element_type)(**init_args)
|
|
60
|
+
return get_table_class(element_type, sync)(**init_args)
|
|
50
61
|
|
|
51
62
|
|
|
52
63
|
class ConditionPassError(Exception):
|
|
@@ -154,6 +165,7 @@ class MetaTable(MetaNodeMixin):
|
|
|
154
165
|
cls.object = cls()
|
|
155
166
|
|
|
156
167
|
cls.__datatable = datatable = attrdict.pop('datatable', None)
|
|
168
|
+
cls.__async_datatable = attrdict.pop('async_datatable', None)
|
|
157
169
|
cls.__table_info = attrdict.pop('table_info', None)
|
|
158
170
|
|
|
159
171
|
cls._datatable = datatable
|
|
@@ -194,6 +206,17 @@ class MetaTable(MetaNodeMixin):
|
|
|
194
206
|
del cls.__table_info
|
|
195
207
|
return tbl
|
|
196
208
|
|
|
209
|
+
@cached_property
|
|
210
|
+
def async_datatable(cls) -> T_AbsAsyncDataTable:
|
|
211
|
+
"""异步数据表元素"""
|
|
212
|
+
if cls.__async_datatable is not None:
|
|
213
|
+
return cls.__async_datatable
|
|
214
|
+
if cls.__table_info is None:
|
|
215
|
+
raise KeyError("Either 'table_info' or 'async_datatable' should be presented.")
|
|
216
|
+
tbl = get_datatable(cls.__table_info, sync=False)
|
|
217
|
+
del cls.__table_info
|
|
218
|
+
return tbl
|
|
219
|
+
|
|
197
220
|
@cached_property
|
|
198
221
|
def name(cls) -> str:
|
|
199
222
|
"""表名"""
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from deepfos.lazy import lazify
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
6
|
+
from .mysql import MySQLClient, AsyncMySQLClient
|
|
7
|
+
from .clickhouse import ClickHouseClient, AsyncClickHouseClient
|
|
8
|
+
from .oracle import OracleClient, AsyncOracleClient, OracleDFSQLConvertor
|
|
9
|
+
from .sqlserver import SQLServerClient, AsyncSQLServerClient
|
|
10
|
+
from .kingbase import KingBaseClient, AsyncKingBaseClient
|
|
11
|
+
from .gauss import GaussClient, AsyncGaussClient
|
|
12
|
+
from .dameng import DaMengClient, AsyncDaMengClient
|
|
13
|
+
from .postgresql import PostgreSQLClient, AsyncPostgreSQLClient
|
|
14
|
+
from .deepengine import DeepEngineClient, AsyncDeepEngineClient
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
lazify(
|
|
18
|
+
{
|
|
19
|
+
'deepfos.db.mysql': ('MySQLClient', 'AsyncMySQLClient'),
|
|
20
|
+
'deepfos.db.clickhouse': ('ClickHouseClient', 'AsyncClickHouseClient'),
|
|
21
|
+
'deepfos.db.oracle': (
|
|
22
|
+
'OracleClient', 'AsyncOracleClient', 'OracleDFSQLConvertor'
|
|
23
|
+
),
|
|
24
|
+
'deepfos.db.sqlserver': ('SQLServerClient', 'AsyncSQLServerClient'),
|
|
25
|
+
'deepfos.db.kingbase': ('KingBaseClient', 'AsyncKingBaseClient'),
|
|
26
|
+
'deepfos.db.gauss': ('GaussClient', 'AsyncGaussClient'),
|
|
27
|
+
'deepfos.db.dameng': ('DaMengClient', 'AsyncDaMengClient'),
|
|
28
|
+
'deepfos.db.postgresql': ('PostgreSQLClient', 'AsyncPostgreSQLClient'),
|
|
29
|
+
'deepfos.db.deepengine': ('DeepEngineClient', 'AsyncDeepEngineClient'),
|
|
30
|
+
},
|
|
31
|
+
globals()
|
|
32
|
+
)
|
|
@@ -10,9 +10,9 @@ from deepfos.cache import Manager
|
|
|
10
10
|
from deepfos.lib.utils import cachedclass, split_dataframe
|
|
11
11
|
from deepfos.lib.decorator import singleton, cached_property
|
|
12
12
|
from deepfos.options import OPTION
|
|
13
|
-
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
13
|
+
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
14
14
|
from .connector import ClickHouseAPIConnector, ClickHouseDirectAccess
|
|
15
|
-
from .mysql import _AbsAsyncMySQLClient # noqa
|
|
15
|
+
from .mysql import _AbsAsyncMySQLClient, MySQLConvertor # noqa
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
__all__ = [
|
|
@@ -32,7 +32,7 @@ class SqlParser(BaseSqlParser):
|
|
|
32
32
|
return AsyncDataTableClickHouse
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
class ClickHouseConvertor(
|
|
35
|
+
class ClickHouseConvertor(MySQLConvertor):
|
|
36
36
|
def build_sql(
|
|
37
37
|
self,
|
|
38
38
|
columns: str,
|
|
@@ -5,7 +5,6 @@ from deepfos.lib.decorator import cached_property
|
|
|
5
5
|
|
|
6
6
|
from cachetools import TTLCache
|
|
7
7
|
from pandas.core.dtypes.common import is_datetime64_dtype, is_numeric_dtype
|
|
8
|
-
from pymysql import escape_string
|
|
9
8
|
import numpy as np
|
|
10
9
|
import pandas as pd
|
|
11
10
|
|
|
@@ -179,12 +178,28 @@ class SyncMeta(type):
|
|
|
179
178
|
raise AttributeError(attr)
|
|
180
179
|
|
|
181
180
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
181
|
+
_escape_table = [chr(x) for x in range(128)]
|
|
182
|
+
_escape_table[ord("'")] = u"''"
|
|
183
|
+
|
|
184
|
+
_escape_table_mysql = list(_escape_table)
|
|
185
|
+
_escape_table_mysql[ord('\\')] = u'\\\\'
|
|
186
|
+
|
|
187
|
+
_escape_table_pg = list(_escape_table)
|
|
188
|
+
_escape_table_pg[0] = ''
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def escape_string(value):
|
|
192
|
+
return value.translate(_escape_table)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def escape_mysql_string(value):
|
|
196
|
+
# for mysql & ck & deepengine & sqlserver
|
|
197
|
+
return value.translate(_escape_table_mysql)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def escape_pg_string(value):
|
|
201
|
+
# for pg & kingbase & gauss
|
|
202
|
+
return value.translate(_escape_table_pg)
|
|
188
203
|
|
|
189
204
|
|
|
190
205
|
# noinspection PyPep8Naming
|
|
@@ -202,6 +217,8 @@ class Skip(metaclass=FrozenClass):
|
|
|
202
217
|
|
|
203
218
|
|
|
204
219
|
class DataframeSQLConvertor:
|
|
220
|
+
escape_string = escape_string
|
|
221
|
+
|
|
205
222
|
def __init__(self, quote_char=None):
|
|
206
223
|
self.quote_char = quote_char
|
|
207
224
|
|
|
@@ -243,6 +260,14 @@ class DataframeSQLConvertor:
|
|
|
243
260
|
for i in range(0, nrows, chunksize):
|
|
244
261
|
yield self.convert(dataframe.iloc[i: i + chunksize], tablename, updatecol, **opts)
|
|
245
262
|
|
|
263
|
+
@classmethod
|
|
264
|
+
def _quote_escape(cls, value):
|
|
265
|
+
if value is null:
|
|
266
|
+
return null
|
|
267
|
+
if not isinstance(value, str):
|
|
268
|
+
return str(value)
|
|
269
|
+
return f"'{cls.escape_string(value)}'"
|
|
270
|
+
|
|
246
271
|
def convert(
|
|
247
272
|
self,
|
|
248
273
|
dataframe: pd.DataFrame,
|
|
@@ -286,7 +311,7 @@ class DataframeSQLConvertor:
|
|
|
286
311
|
for x, is_datetime in zip(data_df.dtypes, datetime_col)
|
|
287
312
|
]
|
|
288
313
|
# 对字符串型列转义,加引号
|
|
289
|
-
data_df.loc[:, str_like_cols] = data_df.loc[:, str_like_cols].applymap(_quote_escape)
|
|
314
|
+
data_df.loc[:, str_like_cols] = data_df.loc[:, str_like_cols].applymap(self._quote_escape)
|
|
290
315
|
# 全部转化为字符串类型
|
|
291
316
|
data_df = data_df.astype(str, errors='ignore')
|
|
292
317
|
values = "(" + pd.Series(data_df.values.tolist()).str.join(',') + ")"
|
|
@@ -7,9 +7,9 @@ from deepfos.api.datatable import DeepEngineAPI
|
|
|
7
7
|
from deepfos.cache import Manager, SpaceSeperatedTTLCache
|
|
8
8
|
from deepfos.lib.utils import cachedclass
|
|
9
9
|
from deepfos.lib.decorator import singleton, cached_property
|
|
10
|
-
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
10
|
+
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
11
11
|
from .connector import DeepEngineAPIConnector
|
|
12
|
-
from .mysql import _AbsAsyncMySQLClient # noqa
|
|
12
|
+
from .mysql import _AbsAsyncMySQLClient, MySQLConvertor # noqa
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
__all__ = [
|
|
@@ -29,7 +29,7 @@ class SqlParser(BaseSqlParser):
|
|
|
29
29
|
return AsyncDataTableDeepEngine
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
class DeepEngineDFSQLConvertor(
|
|
32
|
+
class DeepEngineDFSQLConvertor(MySQLConvertor):
|
|
33
33
|
def build_sql(
|
|
34
34
|
self,
|
|
35
35
|
columns: str,
|
|
@@ -13,7 +13,7 @@ from deepfos.lib.utils import cachedclass
|
|
|
13
13
|
from deepfos.lib.decorator import singleton
|
|
14
14
|
from deepfos.cache import Manager
|
|
15
15
|
from deepfos.options import OPTION
|
|
16
|
-
from .dbkits import BaseSqlParser, SyncMeta, DataframeSQLConvertor, T_DataInfo
|
|
16
|
+
from .dbkits import BaseSqlParser, SyncMeta, DataframeSQLConvertor, T_DataInfo, escape_mysql_string
|
|
17
17
|
from .connector import MySQLAPIConnector, MySQLDirectAccess
|
|
18
18
|
|
|
19
19
|
|
|
@@ -33,11 +33,15 @@ class SqlParser(BaseSqlParser):
|
|
|
33
33
|
return AsyncDataTableMySQL
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
class MySQLConvertor(DataframeSQLConvertor):
|
|
37
|
+
escape_string = escape_mysql_string
|
|
38
|
+
|
|
39
|
+
|
|
36
40
|
# -----------------------------------------------------------------------------
|
|
37
41
|
# core
|
|
38
42
|
class _AbsAsyncMySQLClient:
|
|
39
43
|
connector_cls = None
|
|
40
|
-
convertor =
|
|
44
|
+
convertor = MySQLConvertor(quote_char='`')
|
|
41
45
|
|
|
42
46
|
def __init__(self, version: Union[float, str] = None):
|
|
43
47
|
self.parser = SqlParser()
|
|
@@ -34,7 +34,7 @@ class OracleDFSQLConvertor(DataframeSQLConvertor):
|
|
|
34
34
|
raise NotImplementedError("`updatecol` is not yet implemented for OracleDB.")
|
|
35
35
|
|
|
36
36
|
inserts = '\n'.join(
|
|
37
|
-
f'INTO {self.quote_char}{tablename}{self.quote_char} ({columns}) VALUES {value}'
|
|
37
|
+
f'INTO {self.quote_char}{tablename.upper()}{self.quote_char} ({columns}) VALUES {value}'
|
|
38
38
|
for value in values_in_line
|
|
39
39
|
)
|
|
40
40
|
|
|
@@ -80,7 +80,7 @@ class SqlParser(BaseSqlParser):
|
|
|
80
80
|
# -----------------------------------------------------------------------------
|
|
81
81
|
# core
|
|
82
82
|
class _AsyncOracleClient(_AbsAsyncMySQLClient):
|
|
83
|
-
convertor = OracleDFSQLConvertor(quote_char=
|
|
83
|
+
convertor = OracleDFSQLConvertor(quote_char='"')
|
|
84
84
|
|
|
85
85
|
def __init__(self, version: Union[float, str] = None): # noqa
|
|
86
86
|
self.parser = SqlParser()
|
|
@@ -8,7 +8,7 @@ from deepfos.api.datatable import PostgreSQLAPI
|
|
|
8
8
|
from deepfos.cache import Manager, SpaceSeperatedTTLCache
|
|
9
9
|
from deepfos.lib.utils import cachedclass
|
|
10
10
|
from deepfos.lib.decorator import singleton
|
|
11
|
-
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo, DataframeSQLConvertor
|
|
11
|
+
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo, DataframeSQLConvertor, escape_pg_string
|
|
12
12
|
from .connector import PostgreSQLAPIConnector
|
|
13
13
|
from .mysql import _AbsAsyncMySQLClient # noqa
|
|
14
14
|
|
|
@@ -32,6 +32,8 @@ class SqlParser(BaseSqlParser):
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class PostgreSQLConvertor(DataframeSQLConvertor):
|
|
35
|
+
escape_string = escape_pg_string
|
|
36
|
+
|
|
35
37
|
def iter_sql(
|
|
36
38
|
self,
|
|
37
39
|
dataframe: pd.DataFrame,
|
|
@@ -8,9 +8,9 @@ from deepfos.api.datatable import SQLServerAPI
|
|
|
8
8
|
from deepfos.cache import Manager, SpaceSeperatedTTLCache
|
|
9
9
|
from deepfos.lib.utils import cachedclass
|
|
10
10
|
from deepfos.lib.decorator import singleton
|
|
11
|
-
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
11
|
+
from .dbkits import BaseSqlParser, SyncMeta, T_DataInfo
|
|
12
12
|
from .connector import SQLServerAPIConnector
|
|
13
|
-
from .mysql import _AbsAsyncMySQLClient # noqa
|
|
13
|
+
from .mysql import _AbsAsyncMySQLClient, MySQLConvertor # noqa
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
__all__ = [
|
|
@@ -30,7 +30,7 @@ class SqlParser(BaseSqlParser):
|
|
|
30
30
|
return AsyncDataTableSQLServer
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class SQLServerDFSQLConvertor(
|
|
33
|
+
class SQLServerDFSQLConvertor(MySQLConvertor):
|
|
34
34
|
def build_sql(
|
|
35
35
|
self,
|
|
36
36
|
columns: str,
|
|
@@ -10,6 +10,8 @@ from deepfos.lib.asynchronous import evloop
|
|
|
10
10
|
from deepfos.options import OPTION
|
|
11
11
|
from deepfos.exceptions import APIResponseError
|
|
12
12
|
from .cipher import AES
|
|
13
|
+
from deepfos.api.datatable import (MySQLAPI, ClickHouseAPI, SQLServerAPI, OracleAPI, KingBaseAPI,
|
|
14
|
+
GaussAPI, DaMengAPI, PostgreSQLAPI, DeepEngineAPI)
|
|
13
15
|
|
|
14
16
|
# -----------------------------------------------------------------------------
|
|
15
17
|
# constants
|
|
@@ -88,3 +90,46 @@ def decrypt(secret, cipher_text, encoding='utf8'):
|
|
|
88
90
|
return AES(secret).decrypt(
|
|
89
91
|
base64.b16decode(cipher_text)
|
|
90
92
|
).rstrip().decode(encoding)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def get_client_class(
|
|
96
|
+
element_type: str,
|
|
97
|
+
sync: bool = True
|
|
98
|
+
):
|
|
99
|
+
"""
|
|
100
|
+
根据元素类型获取对应的数据表元素类
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
element_type: 元素类型
|
|
104
|
+
sync: 同步或异步元素类,默认同步
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
from deepfos.db import (MySQLClient, AsyncMySQLClient,
|
|
108
|
+
ClickHouseClient, AsyncClickHouseClient,
|
|
109
|
+
OracleClient, AsyncOracleClient,
|
|
110
|
+
SQLServerClient, AsyncSQLServerClient,
|
|
111
|
+
KingBaseClient, AsyncKingBaseClient,
|
|
112
|
+
GaussClient, AsyncGaussClient,
|
|
113
|
+
DaMengClient, AsyncDaMengClient,
|
|
114
|
+
PostgreSQLClient, AsyncPostgreSQLClient,
|
|
115
|
+
DeepEngineClient, AsyncDeepEngineClient)
|
|
116
|
+
if sync:
|
|
117
|
+
index = 0
|
|
118
|
+
else:
|
|
119
|
+
index = 1
|
|
120
|
+
cli = {
|
|
121
|
+
MySQLAPI.module_type: (MySQLClient, AsyncMySQLClient),
|
|
122
|
+
ClickHouseAPI.module_type: (ClickHouseClient, AsyncClickHouseClient),
|
|
123
|
+
SQLServerAPI.module_type: (SQLServerClient, AsyncSQLServerClient),
|
|
124
|
+
OracleAPI.module_type: (OracleClient, AsyncOracleClient),
|
|
125
|
+
KingBaseAPI.module_type: (KingBaseClient, AsyncKingBaseClient),
|
|
126
|
+
GaussAPI.module_type: (GaussClient, AsyncGaussClient),
|
|
127
|
+
DaMengAPI.module_type: (DaMengClient, AsyncDaMengClient),
|
|
128
|
+
PostgreSQLAPI.module_type: (PostgreSQLClient, AsyncPostgreSQLClient),
|
|
129
|
+
DeepEngineAPI.module_type: (DeepEngineClient, AsyncDeepEngineClient),
|
|
130
|
+
}.get(element_type.upper())
|
|
131
|
+
|
|
132
|
+
if cli is None:
|
|
133
|
+
raise TypeError(f"Unknown module type: {element_type}")
|
|
134
|
+
else:
|
|
135
|
+
return cli[index]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from deepfos.lazy import lazify
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
6
|
+
from .accounting import (
|
|
7
|
+
AccountingEngines, AsyncAccountingEngines,
|
|
8
|
+
BillEngines, AsyncBillEngines, CallbackInfo
|
|
9
|
+
)
|
|
10
|
+
from .apvlprocess import AsyncApprovalProcess, ApprovalProcess
|
|
11
|
+
from .bizmodel import BusinessModel, AsyncBusinessModel, CopyConfig
|
|
12
|
+
from .datatable import (
|
|
13
|
+
Datatable, AsyncDataTableMySQL, DataTableMySQL,
|
|
14
|
+
AsyncDataTableClickHouse, DataTableClickHouse,
|
|
15
|
+
AsyncDataTableOracle, DataTableOracle,
|
|
16
|
+
AsyncDataTableSQLServer, DataTableSQLServer,
|
|
17
|
+
AsyncDataTableKingBase, DataTableKingBase,
|
|
18
|
+
AsyncDataTableGauss, DataTableGauss,
|
|
19
|
+
AsyncDataTableDaMeng, DataTableDaMeng,
|
|
20
|
+
AsyncDataTablePostgreSQL, DataTablePostgreSQL,
|
|
21
|
+
AsyncDataTableDeepEngine, DataTableDeepEngine,
|
|
22
|
+
)
|
|
23
|
+
from .dimension import AsyncDimension, Dimension
|
|
24
|
+
from .fact_table import AsyncFactTable, FactTable
|
|
25
|
+
from .finmodel import AsyncFinancialCube, FinancialCube
|
|
26
|
+
from .journal_template import (
|
|
27
|
+
AsyncJournalTemplate, JournalTemplate, FullPostingParameter
|
|
28
|
+
)
|
|
29
|
+
from .rolestrategy import AsyncRoleStrategy, RoleStrategy
|
|
30
|
+
from .smartlist import AsyncSmartList, SmartList
|
|
31
|
+
from .variable import AsyncVariable, Variable
|
|
32
|
+
from .workflow import AsyncWorkFlow, WorkFlow
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
lazify(
|
|
36
|
+
{
|
|
37
|
+
'deepfos.element.finmodel': (
|
|
38
|
+
'AsyncFinancialCube', 'FinancialCube'
|
|
39
|
+
),
|
|
40
|
+
'deepfos.element.accounting': (
|
|
41
|
+
'AccountingEngines', 'AsyncAccountingEngines',
|
|
42
|
+
'BillEngines', 'AsyncBillEngines', 'CallbackInfo'
|
|
43
|
+
),
|
|
44
|
+
'deepfos.element.apvlprocess': (
|
|
45
|
+
'AsyncApprovalProcess', 'ApprovalProcess'
|
|
46
|
+
),
|
|
47
|
+
'deepfos.element.bizmodel': (
|
|
48
|
+
'BusinessModel', 'AsyncBusinessModel', 'CopyConfig'
|
|
49
|
+
),
|
|
50
|
+
'deepfos.element.datatable': (
|
|
51
|
+
'Datatable',
|
|
52
|
+
'AsyncDataTableMySQL', 'DataTableMySQL',
|
|
53
|
+
'AsyncDataTableClickHouse', 'DataTableClickHouse',
|
|
54
|
+
'AsyncDataTableOracle', 'DataTableOracle',
|
|
55
|
+
'AsyncDataTableSQLServer', 'DataTableSQLServer',
|
|
56
|
+
'AsyncDataTableKingBase', 'DataTableKingBase',
|
|
57
|
+
'AsyncDataTableGauss', 'DataTableGauss',
|
|
58
|
+
'AsyncDataTableDaMeng', 'DataTableDaMeng',
|
|
59
|
+
'AsyncDataTablePostgreSQL', 'DataTablePostgreSQL',
|
|
60
|
+
'AsyncDataTableDeepEngine', 'DataTableDeepEngine',
|
|
61
|
+
),
|
|
62
|
+
'deepfos.element.dimension': ('AsyncDimension', 'Dimension'),
|
|
63
|
+
'deepfos.element.fact_table': ('AsyncFactTable', 'FactTable'),
|
|
64
|
+
'deepfos.element.journal_template': (
|
|
65
|
+
'AsyncJournalTemplate', 'JournalTemplate', 'FullPostingParameter'
|
|
66
|
+
),
|
|
67
|
+
'deepfos.element.rolestrategy': ('AsyncRoleStrategy', 'RoleStrategy'),
|
|
68
|
+
'deepfos.element.smartlist': ('AsyncSmartList', 'SmartList'),
|
|
69
|
+
'deepfos.element.variable': ('AsyncVariable', 'Variable'),
|
|
70
|
+
'deepfos.element.workflow': ('AsyncWorkFlow', 'WorkFlow'),
|
|
71
|
+
'deepfos.element.reconciliation': (
|
|
72
|
+
'AsyncReconciliationEngine', 'AsyncReconciliationMsEngine',
|
|
73
|
+
'ReconciliationEngine', 'ReconciliationMsEngine',
|
|
74
|
+
),
|
|
75
|
+
},
|
|
76
|
+
globals()
|
|
77
|
+
)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from typing import List, Dict, Optional, Union, Tuple, TYPE_CHECKING, Any # noqa
|
|
2
2
|
|
|
3
3
|
from .base import ElementBase, SyncMeta
|
|
4
|
-
from .datatable import DataTableMySQL, DataTableClickHouse, get_table_class
|
|
4
|
+
from .datatable import (DataTableMySQL, DataTableClickHouse, get_table_class, AsyncDataTableMySQL,
|
|
5
|
+
AsyncDataTableClickHouse)
|
|
5
6
|
from deepfos.lib.decorator import cached_property
|
|
6
7
|
from deepfos.lib.constant import UNSET
|
|
7
8
|
from deepfos.api.approval_process import ApprovalProcessAPI
|
|
@@ -42,6 +43,17 @@ class AsyncApprovalProcess(ElementBase[ApprovalProcessAPI]):
|
|
|
42
43
|
folder_id=ctrl_info.approvalRecordTableFolderId,
|
|
43
44
|
path=ctrl_info.approvalRecordTablePath)
|
|
44
45
|
|
|
46
|
+
@cached_property
|
|
47
|
+
def async_record_table(self) -> Union[AsyncDataTableMySQL, AsyncDataTableClickHouse]:
|
|
48
|
+
"""审批记录表"""
|
|
49
|
+
ctrl_info = self.meta.processInfo.controlInfo
|
|
50
|
+
cls = get_table_class(ctrl_info.approvalRecordTableElementType, sync=False)
|
|
51
|
+
return cls(
|
|
52
|
+
element_name=ctrl_info.approvalRecordTableName,
|
|
53
|
+
folder_id=ctrl_info.approvalRecordTableFolderId,
|
|
54
|
+
path=ctrl_info.approvalRecordTablePath
|
|
55
|
+
)
|
|
56
|
+
|
|
45
57
|
@cached_property
|
|
46
58
|
def _name2opinfo(self) -> Dict[str, ProcessOperationDto]:
|
|
47
59
|
return {
|