deepfos 1.1.30__tar.gz → 1.1.32__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 (183) hide show
  1. {deepfos-1.1.30 → deepfos-1.1.32}/PKG-INFO +1 -1
  2. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/_version.py +3 -3
  3. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepmodel.py +2 -2
  4. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/space.py +1 -1
  5. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/edb.py +66 -30
  6. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/deepmodel.py +115 -48
  7. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/dimension.py +14 -11
  8. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/constant.py +5 -0
  9. deepfos-1.1.32/deepfos/lib/deepux.py +477 -0
  10. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/eureka.py +26 -8
  11. deepfos-1.1.32/deepfos/lib/serutils.py +172 -0
  12. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/sysutils.py +9 -2
  13. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/PKG-INFO +1 -1
  14. deepfos-1.1.30/deepfos/lib/deepux.py +0 -248
  15. deepfos-1.1.30/deepfos/lib/serutils.py +0 -140
  16. {deepfos-1.1.30 → deepfos-1.1.32}/MANIFEST.in +0 -0
  17. {deepfos-1.1.30 → deepfos-1.1.32}/README.md +0 -0
  18. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/__init__.py +0 -0
  19. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/algo/__init__.py +0 -0
  20. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/algo/graph.py +0 -0
  21. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/__init__.py +0 -0
  22. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/business_model.py +0 -0
  23. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/dimension.py +0 -0
  24. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/__init__.py +0 -0
  25. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/business_model.py +0 -0
  26. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/dimension.py +0 -0
  27. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/__init__.py +0 -0
  28. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/dimension.py +0 -0
  29. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/models/__init__.py +0 -0
  30. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/models/dimension.py +0 -0
  31. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/__init__.py +0 -0
  32. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/account.py +0 -0
  33. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/accounting_engines.py +0 -0
  34. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/app.py +0 -0
  35. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/approval_process.py +0 -0
  36. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/base.py +0 -0
  37. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/business_model.py +0 -0
  38. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/consolidation.py +0 -0
  39. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/consolidation_process.py +0 -0
  40. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/datatable.py +0 -0
  41. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepconnector.py +0 -0
  42. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepfos_task.py +0 -0
  43. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepmodel.py +0 -0
  44. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/dimension.py +0 -0
  45. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/financial_model.py +0 -0
  46. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/journal_model.py +0 -0
  47. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/journal_template.py +0 -0
  48. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/memory_financial_model.py +0 -0
  49. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/__init__.py +0 -0
  50. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/account.py +0 -0
  51. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/accounting_engines.py +0 -0
  52. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/app.py +0 -0
  53. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/approval_process.py +0 -0
  54. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/base.py +0 -0
  55. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/business_model.py +0 -0
  56. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/consolidation.py +0 -0
  57. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/consolidation_process.py +0 -0
  58. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/datatable_mysql.py +0 -0
  59. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepconnector.py +0 -0
  60. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepfos_task.py +0 -0
  61. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/dimension.py +0 -0
  62. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/financial_model.py +0 -0
  63. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/journal_model.py +0 -0
  64. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/journal_template.py +0 -0
  65. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/memory_financial_model.py +0 -0
  66. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/platform.py +0 -0
  67. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/python.py +0 -0
  68. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/reconciliation_engine.py +0 -0
  69. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/reconciliation_report.py +0 -0
  70. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/role_strategy.py +0 -0
  71. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/smartlist.py +0 -0
  72. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/space.py +0 -0
  73. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/system.py +0 -0
  74. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/variable.py +0 -0
  75. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/workflow.py +0 -0
  76. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/platform.py +0 -0
  77. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/python.py +0 -0
  78. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/reconciliation_engine.py +0 -0
  79. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/reconciliation_report.py +0 -0
  80. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/role_strategy.py +0 -0
  81. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/smartlist.py +0 -0
  82. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/system.py +0 -0
  83. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/variable.py +0 -0
  84. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/workflow.py +0 -0
  85. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/__init__.py +0 -0
  86. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/jstream.c +0 -0
  87. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/jstream.pyx +0 -0
  88. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/pandas.c +0 -0
  89. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/pandas.pyx +0 -0
  90. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/py_jstream.py +0 -0
  91. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/py_pandas.py +0 -0
  92. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/cache.py +0 -0
  93. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/config.py +0 -0
  94. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/__init__.py +0 -0
  95. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/__init__.py +0 -0
  96. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/_base.py +0 -0
  97. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/constants.py +0 -0
  98. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/cube.py +0 -0
  99. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/formula.py +0 -0
  100. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/syscube.py +0 -0
  101. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/typing.py +0 -0
  102. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/utils.py +0 -0
  103. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/__init__.py +0 -0
  104. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/_base.py +0 -0
  105. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimcreator.py +0 -0
  106. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimension.py +0 -0
  107. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimexpr.py +0 -0
  108. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimmember.py +0 -0
  109. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/eledimension.py +0 -0
  110. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/filters.py +0 -0
  111. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/sysdimension.py +0 -0
  112. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/__init__.py +0 -0
  113. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/_cache.py +0 -0
  114. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/_operator.py +0 -0
  115. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/nodemixin.py +0 -0
  116. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/sqlcondition.py +0 -0
  117. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/tablemodel.py +0 -0
  118. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/__init__.py +0 -0
  119. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/cipher.py +0 -0
  120. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/clickhouse.py +0 -0
  121. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/connector.py +0 -0
  122. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/daclickhouse.py +0 -0
  123. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/dameng.py +0 -0
  124. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/damysql.py +0 -0
  125. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/dbkits.py +0 -0
  126. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepengine.py +0 -0
  127. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepmodel.py +0 -0
  128. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepmodel_kingbase.py +0 -0
  129. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/gauss.py +0 -0
  130. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/kingbase.py +0 -0
  131. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/mysql.py +0 -0
  132. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/oracle.py +0 -0
  133. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/postgresql.py +0 -0
  134. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/sqlserver.py +0 -0
  135. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/utils.py +0 -0
  136. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/__init__.py +0 -0
  137. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/accounting.py +0 -0
  138. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/apvlprocess.py +0 -0
  139. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/base.py +0 -0
  140. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/bizmodel.py +0 -0
  141. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/datatable.py +0 -0
  142. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/deepconnector.py +0 -0
  143. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/fact_table.py +0 -0
  144. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/finmodel.py +0 -0
  145. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/journal.py +0 -0
  146. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/journal_template.py +0 -0
  147. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/pyscript.py +0 -0
  148. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/reconciliation.py +0 -0
  149. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/rolestrategy.py +0 -0
  150. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/smartlist.py +0 -0
  151. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/variable.py +0 -0
  152. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/workflow.py +0 -0
  153. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/exceptions/__init__.py +0 -0
  154. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/exceptions/hook.py +0 -0
  155. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lazy.py +0 -0
  156. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/__init__.py +0 -0
  157. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/_javaobj.py +0 -0
  158. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/asynchronous.py +0 -0
  159. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/concurrency.py +0 -0
  160. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/decorator.py +0 -0
  161. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/deepchart.py +0 -0
  162. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/discovery.py +0 -0
  163. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/filterparser.py +0 -0
  164. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/httpcli.py +0 -0
  165. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/jsonstreamer.py +0 -0
  166. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/nacos.py +0 -0
  167. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/patch.py +0 -0
  168. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/redis.py +0 -0
  169. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/stopwatch.py +0 -0
  170. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/subtask.py +0 -0
  171. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/utils.py +0 -0
  172. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/local.py +0 -0
  173. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/options.py +0 -0
  174. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/translation.py +0 -0
  175. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/SOURCES.txt +0 -0
  176. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/dependency_links.txt +0 -0
  177. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/not-zip-safe +0 -0
  178. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/requires.txt +0 -0
  179. {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/top_level.txt +0 -0
  180. {deepfos-1.1.30 → deepfos-1.1.32}/setup.cfg +0 -0
  181. {deepfos-1.1.30 → deepfos-1.1.32}/setup.py +0 -0
  182. {deepfos-1.1.30 → deepfos-1.1.32}/tests/__init__.py +0 -0
  183. {deepfos-1.1.30 → deepfos-1.1.32}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.30
3
+ Version: 1.1.32
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
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-03-19T02:19:15+0000",
11
+ "date": "2024-04-08T07:12:04+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "adeda255af80779e2cbe13668d58404bbeecee0e",
15
- "version": "1.1.30"
14
+ "full-revisionid": "2eb652409a767c757a4324b2ceb60a88d649f355",
15
+ "version": "1.1.32"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1,4 +1,4 @@
1
- from typing import List, Optional, Dict
1
+ from typing import List, Optional, Dict, Any
2
2
 
3
3
  from pydantic import Field
4
4
 
@@ -148,7 +148,7 @@ class QueryResultObjectInfo(BaseModel):
148
148
 
149
149
  class QueryResult(BaseModel):
150
150
  objectInfos: Optional[List[QueryResultObjectInfo]]
151
- json_: List = Field(default_factory=list, alias='json')
151
+ json_: Any = Field(alias='json')
152
152
 
153
153
 
154
154
  ObjectParam.update_forward_refs()
@@ -379,7 +379,7 @@ class SpaceUserAPI(ChildAPI):
379
379
 
380
380
  批量获取用户组内所有用户信息(含子集组用户)依赖平台版本2.6.7
381
381
  """
382
- return {'param': {'groupIds': groupIds}}
382
+ return {'body': {'groupIds': groupIds}}
383
383
 
384
384
  @get('query')
385
385
  def query(self, userId: str, status: str = None) -> Union[SingleUserVo, Awaitable[SingleUserVo]]:
@@ -1,46 +1,45 @@
1
- from edgedb import AsyncIOClient, errors, enums, describe
2
- from edgedb.abstract import DescribeContext
3
- from edgedb.asyncio_client import AsyncIOConnection # noqa
4
- from edgedb.protocol import protocol
1
+ import asyncio
2
+
3
+ from edgedb import AsyncIOClient, errors, enums, describe, abstract
4
+ from edgedb.abstract import (
5
+ DescribeContext, QueryContext, QueryWithArgs,
6
+ _query_opts # noqa
7
+ )
8
+ from edgedb.asyncio_client import (
9
+ AsyncIOConnection, AsyncIOIteration, # noqa
10
+ AsyncIORetry
11
+ )
5
12
 
6
13
  from deepfos import OPTION
7
14
 
8
15
  __all__ = ['create_async_client']
9
16
 
10
17
 
11
- def collect_output_frame(des: describe.ObjectType):
12
- if isinstance(des, describe.ObjectType):
18
+ def collect_output_frame(ele_desc: describe.AnyType):
19
+ if isinstance(ele_desc, describe.ObjectType):
20
+ return {
21
+ field: collect_output_frame(element.type)
22
+ for field, element in ele_desc.elements.items()
23
+ if element.is_implicit == 0
24
+ }
25
+ if isinstance(ele_desc, describe.ArrayType):
26
+ return collect_output_frame(ele_desc.element_type)
27
+ if isinstance(ele_desc, describe.NamedTupleType):
13
28
  return {
14
- field: ele.type.name
15
- for field, ele in des.elements.items()
16
- if ele.is_implicit == 0
29
+ field: collect_output_frame(ele_type)
30
+ for field, ele_type in ele_desc.element_types.items()
17
31
  }
18
- # Scalar or ArrayType
19
- return {}
32
+ if isinstance(ele_desc, describe.TupleType):
33
+ return [collect_output_frame(ele_type) for ele_type in ele_desc.element_types]
34
+ return ele_desc.name
20
35
 
21
36
 
22
37
  class _AsyncEdgeDBConnection(AsyncIOConnection):
23
- async def _execute(self, execute_context) -> None:
24
- await self._protocol.execute(
25
- query=execute_context.query.query,
26
- args=execute_context.query.args,
27
- kwargs=execute_context.query.kwargs,
28
- reg=execute_context.cache.codecs_registry,
29
- qc=execute_context.cache.query_cache,
30
- output_format=protocol.OutputFormat.NONE,
31
- allow_capabilities=enums.Capability.MODIFICATIONS,
32
- state=(
33
- execute_context.state.as_dict()
34
- if execute_context.state else None
35
- ),
36
- )
37
-
38
- async def raw_query(self, query_context):
38
+ async def raw_query(self, query_context, capabilities=enums.Capability.NONE):
39
39
  if self.is_closed():
40
40
  await self.connect()
41
41
 
42
42
  reconnect = False
43
- capabilities = None
44
43
  i = 0
45
44
  args = dict(
46
45
  query=query_context.query.query,
@@ -51,7 +50,7 @@ class _AsyncEdgeDBConnection(AsyncIOConnection):
51
50
  output_format=query_context.query_options.output_format,
52
51
  expect_one=query_context.query_options.expect_one,
53
52
  required_one=query_context.query_options.required_one,
54
- allow_capabilities=enums.Capability.NONE,
53
+ allow_capabilities=capabilities,
55
54
  )
56
55
  if query_context.state is not None:
57
56
  args["state"] = query_context.state.as_dict()
@@ -115,6 +114,43 @@ class _AsyncEdgeDBConnection(AsyncIOConnection):
115
114
  reconnect = self.is_closed()
116
115
 
117
116
 
117
+ class _AsyncIOIteration(AsyncIOIteration):
118
+ async def _execute(self, query_context: abstract.QueryContext):
119
+ with self._exclusive():
120
+ await self._ensure_transaction()
121
+ return await self._connection.raw_query(
122
+ query_context, enums.Capability.MODIFICATIONS
123
+ )
124
+
125
+ async def execute(self, commands: str, *args, **kwargs):
126
+ return await self._execute(QueryContext(
127
+ query=QueryWithArgs(commands, args, kwargs),
128
+ cache=self._get_query_cache(),
129
+ query_options=_query_opts,
130
+ retry_options=self._get_retry_options(),
131
+ state=self._get_state(),
132
+ ))
133
+
134
+
135
+ class _AsyncIORetry(AsyncIORetry):
136
+ async def __anext__(self):
137
+ # Note: when changing this code consider also
138
+ # updating Retry.__next__.
139
+ if self._done:
140
+ raise StopAsyncIteration
141
+ if self._next_backoff:
142
+ await asyncio.sleep(self._next_backoff)
143
+ self._done = True
144
+ iteration = _AsyncIOIteration(self, self._owner, self._iteration)
145
+ self._iteration += 1
146
+ return iteration
147
+
148
+
149
+ class _AsyncIOClient(AsyncIOClient):
150
+ def transaction(self) -> _AsyncIORetry:
151
+ return _AsyncIORetry(self)
152
+
153
+
118
154
  # All deprecated space in v3dev & v3test & alpha
119
155
  deprecated_space = [
120
156
  'ulqtqb',
@@ -137,7 +173,7 @@ deprecated_space = [
137
173
  def create_async_client(default_module=None):
138
174
  space = OPTION.api.header['space']
139
175
  dbname = None if space in deprecated_space else f"deepmodel_space{space}"
140
- cli = AsyncIOClient(
176
+ cli = _AsyncIOClient(
141
177
  connection_class=_AsyncEdgeDBConnection,
142
178
  max_concurrency=None,
143
179
  dsn=OPTION.edgedb.dsn,
@@ -243,7 +243,7 @@ class BaseField(FieldInfo):
243
243
  # df[self.col_name] = df[self.col_name].astype(self.dtype, errors='ignore')
244
244
  pass
245
245
 
246
- def cast(self, df: pd.DataFrame, field_name: str):
246
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
247
247
  """
248
248
  对 :class:`Dataframe` 对应的列作类型转换。
249
249
  一般在获取 :class:`Dataframe` 时使用。
@@ -261,7 +261,7 @@ class FieldDateTime(BaseField):
261
261
  def extra_fit(self, df: pd.DataFrame, field_name: str):
262
262
  df[field_name] = df[field_name].apply(self.format_datetime)
263
263
 
264
- def cast(self, df: pd.DataFrame, field_name: str):
264
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
265
265
  df[field_name] = pd.to_datetime(df[field_name], errors='ignore')
266
266
 
267
267
 
@@ -281,11 +281,11 @@ class FieldJson(BaseField):
281
281
  return data
282
282
  return json.dumps(data)
283
283
 
284
- def cast(self, df: pd.DataFrame, field_name: str):
284
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
285
285
  # std::json needed to be cast only when data is from http
286
286
  # since json value will be converted to json string(type: str)
287
287
  # in edgedb python protocol
288
- if not ONLINE_MODE:
288
+ if not direct_access:
289
289
  df[field_name] = df[field_name].apply(self.format_json)
290
290
 
291
291
 
@@ -295,17 +295,17 @@ class FieldInt(FieldString):
295
295
  return pd.NA
296
296
  return str(int(data))
297
297
 
298
- def cast(self, df: pd.DataFrame, field_name: str):
298
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
299
299
  df[field_name] = df[field_name].astype(pd.Int64Dtype(), errors='ignore')
300
300
 
301
301
 
302
302
  class FieldDecimal(FieldString):
303
- def cast(self, df: pd.DataFrame, field_name: str):
303
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
304
304
  df[field_name] = df[field_name].astype(pd.Float64Dtype(), errors='ignore')
305
305
 
306
306
 
307
307
  class FieldBool(BaseField):
308
- def cast(self, df: pd.DataFrame, field_name: str):
308
+ def cast(self, df: pd.DataFrame, field_name: str, direct_access: bool = True):
309
309
  df[field_name] = df[field_name].astype(pd.BooleanDtype(), errors='ignore')
310
310
 
311
311
 
@@ -362,10 +362,10 @@ class ObjectStructure:
362
362
 
363
363
  return df[valid_fields]
364
364
 
365
- def cast(self, df: pd.DataFrame):
365
+ def cast(self, df: pd.DataFrame, direct_access: bool = True):
366
366
  for field in df.columns:
367
367
  if field in self.fields:
368
- self.fields[field].cast(df, field)
368
+ self.fields[field].cast(df, field, direct_access)
369
369
 
370
370
 
371
371
  def _iter_link_prop_assign(link, business_key, prop_name, prop_type, is_multi):
@@ -545,7 +545,10 @@ def collect_frame_desc_structure(desc: Dict[str, str]):
545
545
  fields = [
546
546
  FieldInfo(
547
547
  name=name,
548
- target=TargetField(name=tname or NOT_SCALAR)
548
+ target=TargetField(
549
+ name=tname
550
+ if isinstance(tname, str) else NOT_SCALAR
551
+ )
549
552
  )
550
553
  for name, tname in desc.items()
551
554
  ]
@@ -564,23 +567,25 @@ class _TxnConfig:
564
567
  self.txn_support = False
565
568
 
566
569
 
567
- if OPTION.edgedb.dsn:
568
- ONLINE_MODE = True
569
- else:
570
- ONLINE_MODE = False
571
-
572
-
573
570
  # -----------------------------------------------------------------------------
574
571
  # core
575
572
  class AsyncDeepModel(ElementBase[DeepModelAPI]):
576
573
  """DeepModel"""
577
574
 
578
- def __init__(self): # noqa
575
+ def __init__(self, direct_access: bool=True): # noqa
579
576
  self._txn_ = ContextVar('QLTXN')
580
577
  self.appmodule = f"app{OPTION.api.header['app']}"
581
578
  self.spacemodule = f"space{OPTION.api.header['space']}"
582
- if ONLINE_MODE:
579
+ self.direct_access = direct_access
580
+ if direct_access:
583
581
  self.client = create_async_client(default_module=self.appmodule)
582
+ if user_id := OPTION.api.header.get('user'):
583
+ self.client = self.client.with_globals(
584
+ **{
585
+ f'{self.spacemodule}::current_user_id':
586
+ user_id
587
+ }
588
+ )
584
589
  else:
585
590
  self.client = None
586
591
  self.alias = AliasGenerator()
@@ -687,7 +692,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
687
692
 
688
693
  """
689
694
 
690
- if ONLINE_MODE:
695
+ if self.direct_access:
691
696
  logger.opt(lazy=True).debug(f"Query: [{ql}], \nkwargs: [{kwargs}].")
692
697
  async with self.client as cli:
693
698
  _, result = await cli.query(ql, **kwargs)
@@ -723,9 +728,13 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
723
728
  :func:`query_object`, 执行ql查询语句,得到原始结果返回
724
729
 
725
730
  """
726
- if ONLINE_MODE:
727
- result = await self.query_object(ql, **kwargs)
728
- return serutils.serialize(result)
731
+ if self.direct_access:
732
+ logger.opt(lazy=True).debug(f"Query: [{ql}], \nkwargs: [{kwargs}].")
733
+ async with self.client as cli:
734
+ frame_desc, result = await cli.query(ql, **kwargs)
735
+ return serutils.serialize(
736
+ result, ctx=serutils.Context(frame_desc=frame_desc)
737
+ )
729
738
 
730
739
  result = await self._http_query(ql, **kwargs)
731
740
  return result.json_
@@ -768,28 +777,35 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
768
777
  :func:`query_object`, 执行ql查询语句,得到原始结果返回
769
778
 
770
779
  """
771
- if ONLINE_MODE:
780
+ if self.direct_access:
772
781
  async with self.client as cli:
773
782
  frame_desc, data = await cli.query(ql, **kwargs)
774
- data = pd.DataFrame(data=serutils.serialize(data))
775
- # No object structure info
776
- if not frame_desc:
783
+
784
+ data = pd.DataFrame(data=serutils.serialize(
785
+ data, ctx=serutils.Context(frame_desc=frame_desc)
786
+ ))
787
+ # Not records for dict-like
788
+ if not isinstance(frame_desc, dict):
777
789
  return data
778
790
 
779
791
  structure = collect_frame_desc_structure(frame_desc)
780
792
  else:
781
793
  result = await self._http_query(ql, **kwargs)
782
- data = pd.DataFrame(data=result.json_)
783
794
  # No object structure info
784
795
  if result.objectInfos is None:
785
- return data
796
+ return pd.DataFrame(data=result.json_)
797
+
798
+ data = pd.DataFrame(
799
+ data=result.json_,
800
+ columns=[f.name for f in result.objectInfos[0].fields]
801
+ )
786
802
 
787
803
  structure = collect_query_result_structure(result.objectInfos[0])
788
804
 
789
805
  if data.empty:
790
806
  return pd.DataFrame(columns=structure.fields.keys())
791
807
 
792
- structure.cast(data)
808
+ structure.cast(data, self.direct_access)
793
809
  return data
794
810
 
795
811
  query.__doc__ = query.__doc__ + DOC_ARGS_KWARGS
@@ -797,7 +813,11 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
797
813
  query_df.__doc__ = query_df.__doc__ + DOC_ARGS_KWARGS
798
814
 
799
815
  @txn_support
800
- async def execute(self, qls: Union[str, List[str], List[QueryWithArgs]], **kwargs):
816
+ async def execute(
817
+ self,
818
+ qls: Union[str, List[str], List[QueryWithArgs]],
819
+ **kwargs
820
+ ) -> Optional[List]:
801
821
  """以事务执行多句ql
802
822
 
803
823
  Args:
@@ -814,10 +834,12 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
814
834
  seen_kwargs_key = set()
815
835
  for ql in qls:
816
836
  if isinstance(ql, QueryWithArgs):
817
- if not ONLINE_MODE and ql.kwargs and seen_kwargs_key.intersection(
818
- ql.kwargs.keys()
837
+ if (
838
+ not self.direct_access
839
+ and ql.kwargs
840
+ and seen_kwargs_key.intersection(ql.kwargs.keys())
819
841
  ):
820
- raise NotImplementedError('线下模式不支持重名variables')
842
+ raise NotImplementedError('非直连模式不支持重名variables')
821
843
 
822
844
  qls_with_args.append(ql)
823
845
  if ql.kwargs:
@@ -828,19 +850,19 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
828
850
  else:
829
851
  raise TypeError(f'qls参数中出现类型非法成员:{type(ql)}')
830
852
 
831
- await self._maybe_exec_qls(qls_with_args)
853
+ return await self._maybe_exec_qls(qls_with_args)
832
854
 
833
855
  execute.__doc__ = execute.__doc__ + DOC_ARGS_KWARGS
834
856
 
835
- async def _execute(self, qls_with_args: List[QueryWithArgs]):
857
+ async def _execute(self, qls_with_args: List[QueryWithArgs]) -> List:
836
858
  self.alias.reset(BATCH_INSERT_KW)
837
- if not ONLINE_MODE:
859
+ if not self.direct_access:
838
860
  kwargs = {}
839
861
  seen_kwargs_key = set()
840
862
 
841
863
  for ql in qls_with_args:
842
864
  if ql.kwargs and seen_kwargs_key.intersection(ql.kwargs.keys()):
843
- raise NotImplementedError('线下模式不支持重名variables')
865
+ raise NotImplementedError('非直连模式不支持重名variables')
844
866
  if ql.kwargs:
845
867
  kwargs.update(ql.kwargs)
846
868
  seen_kwargs_key = seen_kwargs_key.union(ql.kwargs.keys())
@@ -855,9 +877,11 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
855
877
  query=commands,
856
878
  variables=self._prepare_variables(kwargs)
857
879
  )
858
- self._maybe_handle_error(res.get('json'))
859
- return
880
+ affected = res.get('json')
881
+ self._maybe_handle_error(affected)
882
+ return affected
860
883
 
884
+ result = []
861
885
  async with self.client as cli:
862
886
  async for tx in cli.transaction():
863
887
  async with tx:
@@ -865,7 +889,13 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
865
889
  logger.opt(lazy=True).debug(
866
890
  f"Execute QL: [{ql.commands}], \nkwargs: [{ql.kwargs}]."
867
891
  )
868
- await tx.execute(ql.commands, **ql.kwargs)
892
+ desc, affected = await tx.execute(ql.commands, **ql.kwargs)
893
+ result.append(serutils.serialize(
894
+ affected, ctx=serutils.Context(frame_desc=desc)
895
+ ))
896
+ if len(result) == 1:
897
+ return result[0]
898
+ return result
869
899
 
870
900
  @staticmethod
871
901
  def _maybe_handle_error(res):
@@ -874,17 +904,20 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
874
904
 
875
905
  if error := res.get('errors'): # pragma: no cover
876
906
  ex_msg = error['message'].strip()
877
- ex_code = error['code']
907
+ ex_code = int(error['code'])
878
908
  raise edgedb.EdgeDBError._from_code(ex_code, ex_msg) # noqa
879
909
 
880
- async def _maybe_exec_qls(self, qls_with_args: List[QueryWithArgs]):
910
+ async def _maybe_exec_qls(
911
+ self,
912
+ qls_with_args: List[QueryWithArgs]
913
+ ) -> Optional[List]:
881
914
  txn_conf = self._safe_get_txn_conf()
882
915
 
883
916
  if txn_conf.in_txn and self._txn_support_:
884
917
  txn_conf.qls.extend(qls_with_args)
885
918
  return
886
919
 
887
- await self._execute(qls_with_args)
920
+ return await self._execute(qls_with_args)
888
921
 
889
922
  @txn_support
890
923
  async def insert_df(
@@ -895,7 +928,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
895
928
  chunksize: int = 500,
896
929
  enable_upsert: bool = False,
897
930
  update_fields: List[str] = None,
898
- ):
931
+ ) -> None:
899
932
  """以事务执行基于DataFrame字段信息的批量插入数据
900
933
 
901
934
  Args:
@@ -1105,7 +1138,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1105
1138
  kwargs={kw_name: part.to_json(orient='records')}
1106
1139
  ))
1107
1140
 
1108
- def get_object(self, object_name):
1141
+ def get_object(self, object_name) -> edgedb.Object:
1109
1142
  if object_name in self.user_objects:
1110
1143
  obj = self.user_objects[object_name]
1111
1144
  elif object_name in self.system_objects:
@@ -1123,7 +1156,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1123
1156
  obj: Union[ObjectTypeFrame, TargetField],
1124
1157
  source_name: str = None,
1125
1158
  field_name: str = None
1126
- ):
1159
+ ) -> str:
1127
1160
  # 如可在object结构的annotations中取业务主键,则优先取,否则走接口
1128
1161
  if obj.info and BUSINESS_KEY in obj.info:
1129
1162
  return obj.info[BUSINESS_KEY]
@@ -1248,6 +1281,36 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1248
1281
  finally:
1249
1282
  self._txn_.set(_TxnConfig())
1250
1283
 
1284
+ @contextmanager
1285
+ def with_globals(self, globals_):
1286
+ if not self.direct_access:
1287
+ try:
1288
+ yield
1289
+ finally:
1290
+ raise NotImplemented('非直连模式不支持设置state信息')
1291
+ else:
1292
+ bak_cli = self.client
1293
+ try:
1294
+ self.client = self.client.with_globals(**globals_)
1295
+ yield
1296
+ finally:
1297
+ self.client = bak_cli
1298
+
1299
+ @contextmanager
1300
+ def without_globals(self, *global_names):
1301
+ if not self.direct_access:
1302
+ try:
1303
+ yield
1304
+ finally:
1305
+ raise NotImplemented('非直连模式不支持设置state信息')
1306
+ else:
1307
+ bak_cli = self.client
1308
+ try:
1309
+ self.client = self.client.without_globals(*global_names)
1310
+ yield
1311
+ finally:
1312
+ self.client = bak_cli
1313
+
1251
1314
 
1252
1315
  class DeepModel(AsyncDeepModel, metaclass=SyncMeta):
1253
1316
  synchronize = ('query_object', 'query', 'query_df', 'execute', 'insert_df')
@@ -1262,7 +1325,11 @@ class DeepModel(AsyncDeepModel, metaclass=SyncMeta):
1262
1325
  def query_df(self, ql: str, **kwargs) -> pd.DataFrame:
1263
1326
  ...
1264
1327
 
1265
- def execute(self, qls: Union[str, List[str], List[QueryWithArgs]], **kwargs):
1328
+ def execute(
1329
+ self,
1330
+ qls: Union[str, List[str], List[QueryWithArgs]],
1331
+ **kwargs
1332
+ ) -> Optional[List]:
1266
1333
  ...
1267
1334
 
1268
1335
  def insert_df(
@@ -1273,7 +1340,7 @@ class DeepModel(AsyncDeepModel, metaclass=SyncMeta):
1273
1340
  chunksize: int = 500,
1274
1341
  enable_upsert: bool = False,
1275
1342
  update_fields: List[str] = None,
1276
- ):
1343
+ ) -> None:
1277
1344
  ...
1278
1345
 
1279
1346
  @contextmanager
@@ -38,7 +38,8 @@ from deepfos.lib.utils import unpack_expr, CIEnum, get_language_key_map
38
38
  from deepfos.lib.asynchronous import future_property
39
39
  from deepfos.lib.constant import (
40
40
  ROOT, ACCEPT_LANS, DFLT_NAME_COLUMN,
41
- DFLT_PNAME_COLUMN, SHAREDMEMBER, INDEX_FIELD
41
+ DFLT_PNAME_COLUMN, SHAREDMEMBER, INDEX_FIELD,
42
+ SHAREDMEMBERV12, DFLT_PNAME_COLUMN_V12
42
43
  )
43
44
 
44
45
  __all__ = [
@@ -813,10 +814,6 @@ class AsyncDimension(ElementBase[DimensionAPI]):
813
814
  # split dataframe by existed data
814
815
  upd_df, add_df = await self._split_dimension_df(df[valid_columns])
815
816
 
816
- if not self.is_v1_0_api:
817
- to_v12 = {DFLT_PNAME_COLUMN: 'parentName', SHAREDMEMBER: 'sharedMember'}
818
- upd_df = upd_df.rename(columns=to_v12)
819
- add_df = add_df.rename(columns=to_v12)
820
817
  # modify operation column
821
818
  with self._local_memo():
822
819
  if strategy is Strategy.incr_replace:
@@ -918,7 +915,13 @@ class AsyncDimension(ElementBase[DimensionAPI]):
918
915
  self,
919
916
  df: pd.DataFrame
920
917
  ) -> Tuple[pd.DataFrame, pd.DataFrame]:
921
- if SHAREDMEMBER not in df.columns:
918
+ shared_mbr_col = SHAREDMEMBER
919
+ pname_col = DFLT_PNAME_COLUMN
920
+ if not self.is_v1_0_api:
921
+ shared_mbr_col = SHAREDMEMBERV12
922
+ pname_col = DFLT_PNAME_COLUMN_V12
923
+
924
+ if shared_mbr_col not in df.columns:
922
925
  if self._strict:
923
926
  existed_mbrs = self._member_memo
924
927
  else:
@@ -934,14 +937,14 @@ class AsyncDimension(ElementBase[DimensionAPI]):
934
937
 
935
938
  # -----------------------------------------------------------------------------
936
939
  # has shared member
937
- df_shared: pd.DataFrame = df[df[SHAREDMEMBER]]
940
+ df_shared: pd.DataFrame = df[df[shared_mbr_col]]
938
941
  if self._strict:
939
942
  existed_mbrs = self._member_memo
940
943
 
941
944
  dup_sharedmbrs = []
942
945
  for idx, row in df_shared.iterrows():
943
- for mbr in self._member_memo.getall(row[DFLT_NAME_COLUMN]):
944
- if mbr.sharedmember and mbr.parent_name == row[DFLT_PNAME_COLUMN]:
946
+ for mbr in self._member_memo.getall(row[DFLT_NAME_COLUMN], []):
947
+ if mbr.sharedmember and mbr.parent_name == row[pname_col]:
945
948
  dup_sharedmbrs.append(idx)
946
949
  break
947
950
  else:
@@ -961,13 +964,13 @@ class AsyncDimension(ElementBase[DimensionAPI]):
961
964
  shared_memo = set(tuple(item) for item in existed_shared.to_numpy())
962
965
  dup_sharedmbrs = []
963
966
  for idx, row in df_shared.iterrows():
964
- if (row[DFLT_NAME_COLUMN], row[DFLT_PNAME_COLUMN]) in shared_memo:
967
+ if (row[DFLT_NAME_COLUMN], row[pname_col]) in shared_memo:
965
968
  dup_sharedmbrs.append(idx)
966
969
 
967
970
  # 在df中丢弃系统中已存在的共享节点
968
971
  df_shared_remain = df_shared[~df_shared.index.isin(dup_sharedmbrs)]
969
972
 
970
- df_not_shared = df[~df[SHAREDMEMBER]]
973
+ df_not_shared = df[~df[shared_mbr_col]]
971
974
  existed_idx = df_not_shared[DFLT_NAME_COLUMN].isin(existed_mbrs)
972
975
  return df_not_shared.loc[existed_idx], \
973
976
  pd.concat([df_not_shared.loc[~existed_idx], df_shared_remain])
@@ -6,6 +6,11 @@ DFLT_DATA_COLUMN = 'data'
6
6
  DFLT_NAME_COLUMN = 'name'
7
7
  DFLT_PNAME_COLUMN = 'parent_name'
8
8
  SHAREDMEMBER = 'sharedmember'
9
+
10
+ SHAREDMEMBERV12 = 'sharedMember'
11
+ DFLT_PNAME_COLUMN_V12 = 'parentName'
12
+
13
+
9
14
  VIEW = "View"
10
15
  VIEW_DICT = CaseInsensitiveDict(view=VIEW)
11
16
  HIERARCHY = CaseInsensitiveDict(