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.
Files changed (168) hide show
  1. {deepfos-1.1.2 → deepfos-1.1.4}/PKG-INFO +1 -1
  2. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/dimension.py +20 -3
  3. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/models/dimension.py +2 -1
  4. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/cache.py +11 -0
  5. deepfos-1.1.4/deepfos/core/__init__.py +27 -0
  6. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/tablemodel.py +28 -5
  7. deepfos-1.1.4/deepfos/db/__init__.py +32 -0
  8. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/clickhouse.py +3 -3
  9. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/dbkits.py +33 -8
  10. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/deepengine.py +3 -3
  11. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/mysql.py +6 -2
  12. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/oracle.py +2 -2
  13. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/postgresql.py +3 -1
  14. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/sqlserver.py +3 -3
  15. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/utils.py +45 -0
  16. deepfos-1.1.4/deepfos/element/__init__.py +77 -0
  17. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/apvlprocess.py +13 -1
  18. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/bizmodel.py +63 -28
  19. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/datatable.py +101 -21
  20. deepfos-1.1.2/deepfos/lazy_import.py → deepfos-1.1.4/deepfos/lazy.py +20 -3
  21. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/decorator.py +10 -4
  22. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/PKG-INFO +1 -1
  23. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/SOURCES.txt +1 -1
  24. {deepfos-1.1.2 → deepfos-1.1.4}/setup.py +1 -1
  25. deepfos-1.1.4/tests/__init__.py +4 -0
  26. deepfos-1.1.2/deepfos/core/__init__.py +0 -27
  27. deepfos-1.1.2/deepfos/db/__init__.py +0 -50
  28. deepfos-1.1.2/deepfos/element/__init__.py +0 -96
  29. deepfos-1.1.2/tests/__init__.py +0 -0
  30. {deepfos-1.1.2 → deepfos-1.1.4}/MANIFEST.in +0 -0
  31. {deepfos-1.1.2 → deepfos-1.1.4}/README.md +0 -0
  32. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/__init__.py +0 -0
  33. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/_version.py +0 -0
  34. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/algo/__init__.py +0 -0
  35. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/algo/graph.py +0 -0
  36. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/__init__.py +0 -0
  37. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/business_model.py +0 -0
  38. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/dimension.py +0 -0
  39. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/__init__.py +0 -0
  40. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/business_model.py +0 -0
  41. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_1/models/dimension.py +0 -0
  42. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/__init__.py +0 -0
  43. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/V1_2/models/__init__.py +0 -0
  44. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/__init__.py +0 -0
  45. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/account.py +0 -0
  46. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/accounting_engines.py +0 -0
  47. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/app.py +0 -0
  48. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/approval_process.py +0 -0
  49. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/base.py +0 -0
  50. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/business_model.py +0 -0
  51. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/consolidation.py +0 -0
  52. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/datatable.py +0 -0
  53. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/deepfos_task.py +0 -0
  54. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/dimension.py +0 -0
  55. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/financial_model.py +0 -0
  56. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/journal_template.py +0 -0
  57. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/memory_financial_model.py +0 -0
  58. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/__init__.py +0 -0
  59. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/account.py +0 -0
  60. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/accounting_engines.py +0 -0
  61. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/app.py +0 -0
  62. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/approval_process.py +0 -0
  63. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/base.py +0 -0
  64. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/business_model.py +0 -0
  65. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/consolidation.py +0 -0
  66. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/datatable_mysql.py +0 -0
  67. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/deepfos_task.py +0 -0
  68. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/dimension.py +0 -0
  69. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/financial_model.py +0 -0
  70. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/journal_template.py +0 -0
  71. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/memory_financial_model.py +0 -0
  72. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/platform.py +0 -0
  73. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/python.py +0 -0
  74. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/reconciliation_engine.py +0 -0
  75. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/reconciliation_report.py +0 -0
  76. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/role_strategy.py +0 -0
  77. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/smartlist.py +0 -0
  78. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/space.py +0 -0
  79. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/system.py +0 -0
  80. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/variable.py +0 -0
  81. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/models/workflow.py +0 -0
  82. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/platform.py +0 -0
  83. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/python.py +0 -0
  84. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/reconciliation_engine.py +0 -0
  85. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/reconciliation_report.py +0 -0
  86. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/role_strategy.py +0 -0
  87. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/smartlist.py +0 -0
  88. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/space.py +0 -0
  89. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/system.py +0 -0
  90. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/variable.py +0 -0
  91. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/api/workflow.py +0 -0
  92. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/__init__.py +0 -0
  93. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/jstream.c +0 -0
  94. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/jstream.pyx +0 -0
  95. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/pandas.c +0 -0
  96. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/pandas.pyx +0 -0
  97. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/py_jstream.py +0 -0
  98. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/boost/py_pandas.py +0 -0
  99. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/config.py +0 -0
  100. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/__init__.py +0 -0
  101. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/_base.py +0 -0
  102. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/constants.py +0 -0
  103. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/cube.py +0 -0
  104. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/formula.py +0 -0
  105. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/syscube.py +0 -0
  106. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/typing.py +0 -0
  107. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/cube/utils.py +0 -0
  108. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/__init__.py +0 -0
  109. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/_base.py +0 -0
  110. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimcreator.py +0 -0
  111. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimension.py +0 -0
  112. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimexpr.py +0 -0
  113. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/dimmember.py +0 -0
  114. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/eledimension.py +0 -0
  115. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/filters.py +0 -0
  116. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/dimension/sysdimension.py +0 -0
  117. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/__init__.py +0 -0
  118. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/_cache.py +0 -0
  119. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/_operator.py +0 -0
  120. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/nodemixin.py +0 -0
  121. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/core/logictable/sqlcondition.py +0 -0
  122. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/cipher.py +0 -0
  123. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/connector.py +0 -0
  124. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/daclickhouse.py +0 -0
  125. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/dameng.py +0 -0
  126. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/damysql.py +0 -0
  127. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/gauss.py +0 -0
  128. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/db/kingbase.py +0 -0
  129. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/accounting.py +0 -0
  130. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/base.py +0 -0
  131. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/dimension.py +0 -0
  132. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/fact_table.py +0 -0
  133. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/finmodel.py +0 -0
  134. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/journal_template.py +0 -0
  135. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/pyscript.py +0 -0
  136. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/reconciliation.py +0 -0
  137. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/rolestrategy.py +0 -0
  138. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/smartlist.py +0 -0
  139. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/variable.py +0 -0
  140. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/element/workflow.py +0 -0
  141. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/exceptions/__init__.py +0 -0
  142. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/exceptions/hook.py +0 -0
  143. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/__init__.py +0 -0
  144. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/_javaobj.py +0 -0
  145. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/asynchronous.py +0 -0
  146. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/concurrency.py +0 -0
  147. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/constant.py +0 -0
  148. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/deepchart.py +0 -0
  149. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/deepux.py +0 -0
  150. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/eureka.py +0 -0
  151. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/filterparser.py +0 -0
  152. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/httpcli.py +0 -0
  153. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/jsonstreamer.py +0 -0
  154. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/patch.py +0 -0
  155. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/redis.py +0 -0
  156. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/stopwatch.py +0 -0
  157. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/subtask.py +0 -0
  158. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/sysutils.py +0 -0
  159. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/lib/utils.py +0 -0
  160. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/local.py +0 -0
  161. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/options.py +0 -0
  162. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos/translation.py +0 -0
  163. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/dependency_links.txt +0 -0
  164. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/not-zip-safe +0 -0
  165. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/requires.txt +0 -0
  166. {deepfos-1.1.2 → deepfos-1.1.4}/deepfos.egg-info/top_level.txt +0 -0
  167. {deepfos-1.1.2 → deepfos-1.1.4}/setup.cfg +0 -0
  168. {deepfos-1.1.2 → deepfos-1.1.4}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Collecions of useful and handy tools for deepfos platform
5
5
  Home-page: http://py.deepfos.com
6
6
  Author: deepfos-python-team
@@ -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** : ``2022-09-02 19:26:55``
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** : ``2022-09-02 19:26:55``
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, get_table_class
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
- T_AbsDataTable = Union[DataTableMySQL, DataTableClickHouse, DataTableOracle, DataTableSQLServer]
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, DataframeSQLConvertor
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(DataframeSQLConvertor):
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
- def _quote_escape(value):
183
- if value is null:
184
- return null
185
- if not isinstance(value, str):
186
- return str(value)
187
- return f"'{escape_string(value)}'"
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, DataframeSQLConvertor
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(DataframeSQLConvertor):
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 = DataframeSQLConvertor(quote_char='`')
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=None)
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, DataframeSQLConvertor
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(DataframeSQLConvertor):
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 {