Pārlūkot izejas kodu

补充f_rel_calc函数文档

jxing 4 gadi atpakaļ
vecāks
revīzija
04da38ba16
1 mainītis faili ar 91 papildinājumiem un 0 dzēšanām
  1. 91 0
      docs/dev/data-center/relations/belongs/f_rel_calc.md

+ 91 - 0
docs/dev/data-center/relations/belongs/f_rel_calc.md

@@ -0,0 +1,91 @@
+管理关系计算函数依赖和函数输入类型
+
+# 说明
+    classify 该变量是根据函数的输入将函数分类
+    dependency 该变量管理函数的依赖
+
+# 函数
+## 代码
+```
+CREATE OR REPLACE FUNCTION "public"."f_rel_calc"("func" text, "project_id" varchar, "tables" text, "out_tables" text, "sign1" int4, "sign2" int4)
+  RETURNS "pg_catalog"."int4" AS $BODY$
+# 根据函数输入类型分类
+classify = {"eq2bd":1, "eq2fl":1, "sp2fl":1, "eq2sh":1, "pe2bd":1, "pe2fl":1, "pe2sh":1, "pe2sp":1, "sh2sh":1, "sy2bd":1,
+    "sy2fl":1, "sy2sh":1, "sy2sp":1, "bd2sp":2, "eq2sp":3, "fl2fl":4}
+dependency = {"eq2bd":["eq2fl"], "eq2sh":["eq2sp"], "eq2sp":["eq2fl", "sp2fl"], "pe2bd":["eq2bd"], "pe2fl":["eq2fl"], "pe2sh":["eq2sh"],
+    "pe2sp":["eq2sp"], "sy2bd":["eq2bd"], "sy2fl":["eq2fl"], "sy2sh":["eq2sh"], "sy2sp":["eq2sp"]}
+def get_type_by_func_name(func_name):
+    return func_name.split('_')[-1]
+try:
+    with plpy.subtransaction():
+        type = get_type_by_func_name(func)
+        if type not in classify:
+            return 100
+        class_id = classify[type]
+        plpy.info("type : {0}, class_id : {1}, projectId : {2}".format(type, class_id, project_id))
+        status_plan = plpy.prepare("select graphtype.f_get_calc_state($1, $2)", ["text", "text"])
+        status = status_plan.execute([project_id, type])
+        plpy.info("status : {0}".format(status))
+        status = status[0]['f_get_calc_state']
+        plpy.info("status : {0}".format(status))
+        #if status != 2:
+            #return status
+        # 更新计算状态, 开始计算
+        set_status_plan = plpy.prepare("call graphtype.f_upd_calc_state($1, $2, 3)", ["text", "text"])
+        set_status_plan.execute([project_id, type])
+
+        # 开始计算依赖项
+        if type in dependency:
+            dep = dependency[type]
+            for dep_func in dep:
+                dep_plan = plpy.prepare("select public.f_rel_calc($1, $2, $3, $4, $5, $6)", ["text", "text", "text", "text", "int4", "int4"])
+                plpy.info("dep_func : {0}".format(dep_func))
+                result = dep_plan.execute(['rel_'+dep_func, project_id, tables, out_tables, sign1, sign2])
+                result_int = result[0]['f_rel_calc']
+                if result_int != 0:
+                    return -200 + result_int
+        if class_id == 1:
+            result_plan = plpy.prepare("select public.{0}($1)".format(func), ["text"])
+            result = result_plan.execute([project_id])
+        elif class_id == 2:
+            result_plan = plpy.prepare("select public.{0}($1, $2)".format(func), ["text", "text"])
+            result = result_plan.execute([tables, project_id])
+        elif class_id == 3:
+            result_plan = plpy.prepare("select public.{0}($1, $2, $3, $4, $5)".format(func), ["text", "text", "text", "int4", "int4"])
+            result = result_plan.execute([tables, out_tables, project_id, sign1, sign2])
+        elif class_id == 4:
+            result_plan = plpy.prepare("select public.{0}($1, $2, $3)".format(func), ["text", "int4", "int4"])
+            result = result_plan.execute([project_id, sign1, sign2])
+        result_bool = result[0][func]
+        plpy.info("func : {0}, result : {1}".format(func, result_bool))
+        if result_bool:
+            set_status_plan = plpy.prepare("call graphtype.f_upd_calc_state($1, $2, 1)", ["text", "text"])
+            set_status_plan.execute([project_id, type])
+        else:
+            set_status_plan = plpy.prepare("call graphtype.f_upd_calc_state($1, $2, 5)", ["text", "text"])
+            set_status_plan.execute([project_id, type])
+        return 0 if result_bool else -1
+except Exception as e:
+    set_status_plan = plpy.prepare("call graphtype.f_upd_calc_state($1, $2, 5)", ["text", "text"])
+    set_status_plan.execute([project_id, type])
+    plpy.info(e)
+    return -1
+else:
+    return 0
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+
+
+例子:
+select public.f_rel_calc('rel_eq2sh', 'Pj*******', 'zone_space_base','relationship.r_eq2sp', 2, 2)
+```
+## 输入
+    1. 想要计算的函数名
+    2. 项目id
+    3. 依赖的函数或此函数需要的业务空间的表名
+    4. 表示依赖的函数或此函数需要导出关系的表
+    5, 6. 删除旧关系时需要指明删除sign值为多少的关系
+## 返回结果
+    true    成功
+    false   失败