deepfos 1.1.60__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.
- deepfos/__init__.py +6 -0
- deepfos/_version.py +21 -0
- deepfos/algo/__init__.py +0 -0
- deepfos/algo/graph.py +171 -0
- deepfos/algo/segtree.py +31 -0
- deepfos/api/V1_1/__init__.py +0 -0
- deepfos/api/V1_1/business_model.py +119 -0
- deepfos/api/V1_1/dimension.py +599 -0
- deepfos/api/V1_1/models/__init__.py +0 -0
- deepfos/api/V1_1/models/business_model.py +1033 -0
- deepfos/api/V1_1/models/dimension.py +2768 -0
- deepfos/api/V1_2/__init__.py +0 -0
- deepfos/api/V1_2/dimension.py +285 -0
- deepfos/api/V1_2/models/__init__.py +0 -0
- deepfos/api/V1_2/models/dimension.py +2923 -0
- deepfos/api/__init__.py +0 -0
- deepfos/api/account.py +167 -0
- deepfos/api/accounting_engines.py +147 -0
- deepfos/api/app.py +626 -0
- deepfos/api/approval_process.py +198 -0
- deepfos/api/base.py +983 -0
- deepfos/api/business_model.py +160 -0
- deepfos/api/consolidation.py +129 -0
- deepfos/api/consolidation_process.py +106 -0
- deepfos/api/datatable.py +341 -0
- deepfos/api/deep_pipeline.py +61 -0
- deepfos/api/deepconnector.py +36 -0
- deepfos/api/deepfos_task.py +92 -0
- deepfos/api/deepmodel.py +188 -0
- deepfos/api/dimension.py +486 -0
- deepfos/api/financial_model.py +319 -0
- deepfos/api/journal_model.py +119 -0
- deepfos/api/journal_template.py +132 -0
- deepfos/api/memory_financial_model.py +98 -0
- deepfos/api/models/__init__.py +3 -0
- deepfos/api/models/account.py +483 -0
- deepfos/api/models/accounting_engines.py +756 -0
- deepfos/api/models/app.py +1338 -0
- deepfos/api/models/approval_process.py +1043 -0
- deepfos/api/models/base.py +234 -0
- deepfos/api/models/business_model.py +805 -0
- deepfos/api/models/consolidation.py +711 -0
- deepfos/api/models/consolidation_process.py +248 -0
- deepfos/api/models/datatable_mysql.py +427 -0
- deepfos/api/models/deep_pipeline.py +55 -0
- deepfos/api/models/deepconnector.py +28 -0
- deepfos/api/models/deepfos_task.py +386 -0
- deepfos/api/models/deepmodel.py +308 -0
- deepfos/api/models/dimension.py +1576 -0
- deepfos/api/models/financial_model.py +1796 -0
- deepfos/api/models/journal_model.py +341 -0
- deepfos/api/models/journal_template.py +854 -0
- deepfos/api/models/memory_financial_model.py +478 -0
- deepfos/api/models/platform.py +178 -0
- deepfos/api/models/python.py +221 -0
- deepfos/api/models/reconciliation_engine.py +411 -0
- deepfos/api/models/reconciliation_report.py +161 -0
- deepfos/api/models/role_strategy.py +884 -0
- deepfos/api/models/smartlist.py +237 -0
- deepfos/api/models/space.py +1137 -0
- deepfos/api/models/system.py +1065 -0
- deepfos/api/models/variable.py +463 -0
- deepfos/api/models/workflow.py +946 -0
- deepfos/api/platform.py +199 -0
- deepfos/api/python.py +90 -0
- deepfos/api/reconciliation_engine.py +181 -0
- deepfos/api/reconciliation_report.py +64 -0
- deepfos/api/role_strategy.py +234 -0
- deepfos/api/smartlist.py +69 -0
- deepfos/api/space.py +582 -0
- deepfos/api/system.py +372 -0
- deepfos/api/variable.py +154 -0
- deepfos/api/workflow.py +264 -0
- deepfos/boost/__init__.py +6 -0
- deepfos/boost/py_jstream.py +89 -0
- deepfos/boost/py_pandas.py +20 -0
- deepfos/cache.py +121 -0
- deepfos/config.py +6 -0
- deepfos/core/__init__.py +27 -0
- deepfos/core/cube/__init__.py +10 -0
- deepfos/core/cube/_base.py +462 -0
- deepfos/core/cube/constants.py +21 -0
- deepfos/core/cube/cube.py +408 -0
- deepfos/core/cube/formula.py +707 -0
- deepfos/core/cube/syscube.py +532 -0
- deepfos/core/cube/typing.py +7 -0
- deepfos/core/cube/utils.py +238 -0
- deepfos/core/dimension/__init__.py +11 -0
- deepfos/core/dimension/_base.py +506 -0
- deepfos/core/dimension/dimcreator.py +184 -0
- deepfos/core/dimension/dimension.py +472 -0
- deepfos/core/dimension/dimexpr.py +271 -0
- deepfos/core/dimension/dimmember.py +155 -0
- deepfos/core/dimension/eledimension.py +22 -0
- deepfos/core/dimension/filters.py +99 -0
- deepfos/core/dimension/sysdimension.py +168 -0
- deepfos/core/logictable/__init__.py +5 -0
- deepfos/core/logictable/_cache.py +141 -0
- deepfos/core/logictable/_operator.py +663 -0
- deepfos/core/logictable/nodemixin.py +673 -0
- deepfos/core/logictable/sqlcondition.py +609 -0
- deepfos/core/logictable/tablemodel.py +497 -0
- deepfos/db/__init__.py +36 -0
- deepfos/db/cipher.py +660 -0
- deepfos/db/clickhouse.py +191 -0
- deepfos/db/connector.py +195 -0
- deepfos/db/daclickhouse.py +171 -0
- deepfos/db/dameng.py +101 -0
- deepfos/db/damysql.py +189 -0
- deepfos/db/dbkits.py +358 -0
- deepfos/db/deepengine.py +99 -0
- deepfos/db/deepmodel.py +82 -0
- deepfos/db/deepmodel_kingbase.py +83 -0
- deepfos/db/edb.py +214 -0
- deepfos/db/gauss.py +83 -0
- deepfos/db/kingbase.py +83 -0
- deepfos/db/mysql.py +184 -0
- deepfos/db/oracle.py +131 -0
- deepfos/db/postgresql.py +192 -0
- deepfos/db/sqlserver.py +99 -0
- deepfos/db/utils.py +135 -0
- deepfos/element/__init__.py +89 -0
- deepfos/element/accounting.py +348 -0
- deepfos/element/apvlprocess.py +215 -0
- deepfos/element/base.py +398 -0
- deepfos/element/bizmodel.py +1269 -0
- deepfos/element/datatable.py +2467 -0
- deepfos/element/deep_pipeline.py +186 -0
- deepfos/element/deepconnector.py +59 -0
- deepfos/element/deepmodel.py +1806 -0
- deepfos/element/dimension.py +1254 -0
- deepfos/element/fact_table.py +427 -0
- deepfos/element/finmodel.py +1485 -0
- deepfos/element/journal.py +840 -0
- deepfos/element/journal_template.py +943 -0
- deepfos/element/pyscript.py +412 -0
- deepfos/element/reconciliation.py +553 -0
- deepfos/element/rolestrategy.py +243 -0
- deepfos/element/smartlist.py +457 -0
- deepfos/element/variable.py +756 -0
- deepfos/element/workflow.py +560 -0
- deepfos/exceptions/__init__.py +239 -0
- deepfos/exceptions/hook.py +86 -0
- deepfos/lazy.py +104 -0
- deepfos/lazy_import.py +84 -0
- deepfos/lib/__init__.py +0 -0
- deepfos/lib/_javaobj.py +366 -0
- deepfos/lib/asynchronous.py +879 -0
- deepfos/lib/concurrency.py +107 -0
- deepfos/lib/constant.py +39 -0
- deepfos/lib/decorator.py +310 -0
- deepfos/lib/deepchart.py +778 -0
- deepfos/lib/deepux.py +477 -0
- deepfos/lib/discovery.py +273 -0
- deepfos/lib/edb_lexer.py +789 -0
- deepfos/lib/eureka.py +156 -0
- deepfos/lib/filterparser.py +751 -0
- deepfos/lib/httpcli.py +106 -0
- deepfos/lib/jsonstreamer.py +80 -0
- deepfos/lib/msg.py +394 -0
- deepfos/lib/nacos.py +225 -0
- deepfos/lib/patch.py +92 -0
- deepfos/lib/redis.py +241 -0
- deepfos/lib/serutils.py +181 -0
- deepfos/lib/stopwatch.py +99 -0
- deepfos/lib/subtask.py +572 -0
- deepfos/lib/sysutils.py +703 -0
- deepfos/lib/utils.py +1003 -0
- deepfos/local.py +160 -0
- deepfos/options.py +670 -0
- deepfos/translation.py +237 -0
- deepfos-1.1.60.dist-info/METADATA +33 -0
- deepfos-1.1.60.dist-info/RECORD +175 -0
- deepfos-1.1.60.dist-info/WHEEL +5 -0
- deepfos-1.1.60.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import time
|
|
3
|
+
from math import ceil
|
|
4
|
+
from typing import Any, TYPE_CHECKING, List
|
|
5
|
+
|
|
6
|
+
from deepfos import OPTION
|
|
7
|
+
from deepfos.api.deep_pipeline import DeepPipelineAPI
|
|
8
|
+
from deepfos.api.models.deep_pipeline import RunInfo, FlowInfo
|
|
9
|
+
from deepfos.element.base import ElementBase, SyncMeta
|
|
10
|
+
from deepfos.exceptions import (
|
|
11
|
+
APIResponseError, RunIdInvalid, RunTerminated,
|
|
12
|
+
ReleaseFlowTimeout, RunFailedError, ReleaseFlowNotExists,
|
|
13
|
+
)
|
|
14
|
+
from deepfos.lib.asynchronous import future_property
|
|
15
|
+
from deepfos.lib.decorator import cached_property
|
|
16
|
+
|
|
17
|
+
errcode_map = {
|
|
18
|
+
42030002: ReleaseFlowTimeout,
|
|
19
|
+
42030003: RunIdInvalid,
|
|
20
|
+
42030009: RunFailedError,
|
|
21
|
+
42030010: RunTerminated,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# -----------------------------------------------------------------------------
|
|
26
|
+
# core
|
|
27
|
+
class AsyncDeepPipeline(ElementBase[DeepPipelineAPI]):
|
|
28
|
+
"""数据流3.0"""
|
|
29
|
+
|
|
30
|
+
@future_property
|
|
31
|
+
async def release(self) -> FlowInfo:
|
|
32
|
+
"""发布版信息"""
|
|
33
|
+
api = await self.wait_for('async_api')
|
|
34
|
+
ele_info = await self.wait_for('element_info')
|
|
35
|
+
return await api.flow.open(
|
|
36
|
+
folder_id=ele_info.folderId,
|
|
37
|
+
element_name=ele_info.elementName,
|
|
38
|
+
version='release'
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
@cached_property
|
|
42
|
+
def has_approved_release(self) -> bool:
|
|
43
|
+
return (
|
|
44
|
+
self.release is not None
|
|
45
|
+
and self.release.configure.status == 'APPROVED'
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
async def run(
|
|
49
|
+
self,
|
|
50
|
+
parameter: Any = None,
|
|
51
|
+
timeout: int = None,
|
|
52
|
+
in_process: bool = True,
|
|
53
|
+
) -> Any:
|
|
54
|
+
"""
|
|
55
|
+
同步启动数据流
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
parameter: 执行参数
|
|
59
|
+
timeout: 超时时间(秒)
|
|
60
|
+
in_process: 是否在同一个进程执行
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
执行结果
|
|
64
|
+
"""
|
|
65
|
+
run_id = await self.run_async(parameter, in_process)
|
|
66
|
+
return await self.result(run_id, timeout)
|
|
67
|
+
|
|
68
|
+
async def run_async(
|
|
69
|
+
self,
|
|
70
|
+
parameter: Any = None,
|
|
71
|
+
in_process: bool = True,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""
|
|
74
|
+
异步启动数据流
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
parameter: 执行参数
|
|
78
|
+
in_process: 是否在同一个进程执行
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
执行ID
|
|
82
|
+
"""
|
|
83
|
+
if not self.has_approved_release:
|
|
84
|
+
raise ReleaseFlowNotExists('暂无启用中状态的数据流版本')
|
|
85
|
+
|
|
86
|
+
return await self.async_api.run.run_async(
|
|
87
|
+
RunInfo(
|
|
88
|
+
elementName=self.element_name,
|
|
89
|
+
parameter=parameter,
|
|
90
|
+
folderId=self.element_info.folderId,
|
|
91
|
+
inProcess=in_process
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
async def result(self, run_id: str, timeout: int = None) -> Any:
|
|
96
|
+
"""
|
|
97
|
+
获取异步执行结果
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
run_id: 执行ID
|
|
101
|
+
timeout: 超时时间(秒)
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
执行结果
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
start_time = time.time()
|
|
108
|
+
remaining_time = interval = min(max(OPTION.api.timeout - 1, 1), 5)
|
|
109
|
+
if timeout is not None:
|
|
110
|
+
remaining_time = min(interval, timeout)
|
|
111
|
+
|
|
112
|
+
while timeout is None or remaining_time > 0:
|
|
113
|
+
try:
|
|
114
|
+
return await self.async_api.run.result(
|
|
115
|
+
run_id,
|
|
116
|
+
timeout=remaining_time
|
|
117
|
+
)
|
|
118
|
+
except APIResponseError as e:
|
|
119
|
+
if e.code not in errcode_map:
|
|
120
|
+
raise
|
|
121
|
+
|
|
122
|
+
err_cls = errcode_map[e.code]
|
|
123
|
+
if err_cls is not ReleaseFlowTimeout:
|
|
124
|
+
raise errcode_map[e.code](str(e)) from None
|
|
125
|
+
|
|
126
|
+
delta_time = time.time() - start_time
|
|
127
|
+
remaining_time = (
|
|
128
|
+
ceil(min(interval, timeout - delta_time))
|
|
129
|
+
if timeout is not None else interval
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
raise ReleaseFlowTimeout() from None
|
|
133
|
+
|
|
134
|
+
async def run_batch(
|
|
135
|
+
self,
|
|
136
|
+
parameters: List[Any],
|
|
137
|
+
in_process: bool = True,
|
|
138
|
+
) -> List[str]:
|
|
139
|
+
"""
|
|
140
|
+
批量异步启动数据流
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
parameters: 执行参数列表
|
|
144
|
+
in_process: 是否在同一个进程执行
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
执行ID列表
|
|
148
|
+
"""
|
|
149
|
+
if not self.has_approved_release:
|
|
150
|
+
raise ReleaseFlowNotExists('暂无启用中状态的数据流版本')
|
|
151
|
+
|
|
152
|
+
result = await asyncio.gather(*(
|
|
153
|
+
self.run_async(parameter, in_process)
|
|
154
|
+
for parameter in parameters
|
|
155
|
+
))
|
|
156
|
+
return list(result)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class DeepPipeline(AsyncDeepPipeline, metaclass=SyncMeta):
|
|
160
|
+
synchronize = ('run', 'run_async', 'result', 'run_batch')
|
|
161
|
+
|
|
162
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
163
|
+
def run(
|
|
164
|
+
self,
|
|
165
|
+
parameter: Any = None,
|
|
166
|
+
timeout: int = None,
|
|
167
|
+
in_process: bool = True,
|
|
168
|
+
) -> Any:
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
def run_async(
|
|
172
|
+
self,
|
|
173
|
+
parameter: Any = None,
|
|
174
|
+
in_process: bool = True,
|
|
175
|
+
) -> str:
|
|
176
|
+
...
|
|
177
|
+
|
|
178
|
+
def result(self, run_id: str, timeout: int = None) -> Any:
|
|
179
|
+
...
|
|
180
|
+
|
|
181
|
+
def run_batch(
|
|
182
|
+
self,
|
|
183
|
+
parameters: List[Any],
|
|
184
|
+
in_process: bool = True,
|
|
185
|
+
):
|
|
186
|
+
...
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
|
|
3
|
+
from deepfos.api.deepconnector import DeepConnectorAPI
|
|
4
|
+
from deepfos.api.models import BaseModel
|
|
5
|
+
from deepfos.element.base import ElementBase, SyncMeta
|
|
6
|
+
from deepfos.lib.asynchronous import future_property
|
|
7
|
+
from deepfos.lib.decorator import cached_property
|
|
8
|
+
|
|
9
|
+
__all__ = ['AsyncDeepConnector', 'DeepConnector', 'ConnectionInfo']
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ConnectionInfo(BaseModel):
|
|
13
|
+
host: str
|
|
14
|
+
port: int
|
|
15
|
+
db: str
|
|
16
|
+
user: str
|
|
17
|
+
password: str
|
|
18
|
+
dbtype: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# -----------------------------------------------------------------------------
|
|
22
|
+
# core
|
|
23
|
+
class AsyncDeepConnector(ElementBase[DeepConnectorAPI]):
|
|
24
|
+
"""连接器"""
|
|
25
|
+
|
|
26
|
+
@cached_property
|
|
27
|
+
def api(self):
|
|
28
|
+
"""同步API对象"""
|
|
29
|
+
api = self.api_class(sync=True)
|
|
30
|
+
return api
|
|
31
|
+
|
|
32
|
+
@future_property
|
|
33
|
+
async def async_api(self):
|
|
34
|
+
"""异步API对象"""
|
|
35
|
+
return await self._init_api()
|
|
36
|
+
|
|
37
|
+
async def _init_api(self):
|
|
38
|
+
return self.api_class(sync=False)
|
|
39
|
+
|
|
40
|
+
@future_property
|
|
41
|
+
async def connection_info(self) -> ConnectionInfo:
|
|
42
|
+
"""当前连接器元素的连接信息"""
|
|
43
|
+
api = await self.wait_for('async_api')
|
|
44
|
+
ele_info = await self.wait_for('element_info')
|
|
45
|
+
info = await api.datasource.connection_info(
|
|
46
|
+
element_info=ele_info,
|
|
47
|
+
)
|
|
48
|
+
return ConnectionInfo(
|
|
49
|
+
host=info.connectionHost,
|
|
50
|
+
port=info.connectionPort,
|
|
51
|
+
db=info.dbName,
|
|
52
|
+
user=info.username,
|
|
53
|
+
password=base64.decodebytes(info.password.encode()).decode(),
|
|
54
|
+
dbtype=info.serviceName,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DeepConnector(AsyncDeepConnector, metaclass=SyncMeta):
|
|
59
|
+
pass
|