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.
- {deepfos-1.1.30 → deepfos-1.1.32}/PKG-INFO +1 -1
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/_version.py +3 -3
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepmodel.py +2 -2
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/space.py +1 -1
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/edb.py +66 -30
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/deepmodel.py +115 -48
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/dimension.py +14 -11
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/constant.py +5 -0
- deepfos-1.1.32/deepfos/lib/deepux.py +477 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/eureka.py +26 -8
- deepfos-1.1.32/deepfos/lib/serutils.py +172 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/sysutils.py +9 -2
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/PKG-INFO +1 -1
- deepfos-1.1.30/deepfos/lib/deepux.py +0 -248
- deepfos-1.1.30/deepfos/lib/serutils.py +0 -140
- {deepfos-1.1.30 → deepfos-1.1.32}/MANIFEST.in +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/README.md +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/account.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/app.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/base.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepconnector.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/deepmodel.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepconnector.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/python.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/system.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/cache.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/config.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/core/logictable/tablemodel.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/base.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/bizmodel.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/datatable.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/deepconnector.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/finmodel.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/element/workflow.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lazy.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/discovery.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/nacos.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/local.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/options.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos/translation.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/SOURCES.txt +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/setup.cfg +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/setup.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/tests/__init__.py +0 -0
- {deepfos-1.1.30 → deepfos-1.1.32}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2024-
|
|
11
|
+
"date": "2024-04-08T07:12:04+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
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_:
|
|
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 {'
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
from edgedb
|
|
4
|
-
from edgedb.
|
|
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(
|
|
12
|
-
if isinstance(
|
|
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:
|
|
15
|
-
for field,
|
|
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
|
-
|
|
19
|
-
|
|
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
|
|
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=
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
727
|
-
|
|
728
|
-
|
|
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
|
|
780
|
+
if self.direct_access:
|
|
772
781
|
async with self.client as cli:
|
|
773
782
|
frame_desc, data = await cli.query(ql, **kwargs)
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
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(
|
|
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
|
|
818
|
-
|
|
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('
|
|
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
|
|
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('
|
|
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
|
-
|
|
859
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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(
|