提交 ace3b282 编写于 作者: J jiangpengju

重构单包查询的代码,主要优化点源码包生成子包,子包提供的组件和二进包所需要的组件,及其这些组件被哪些二进制包所依赖和被哪些二进制包所提供。

上级 f48313d2
...@@ -8,6 +8,7 @@ import math ...@@ -8,6 +8,7 @@ import math
from flask import current_app, jsonify from flask import current_app, jsonify
from sqlalchemy import text
from sqlalchemy.exc import SQLAlchemyError, DisconnectionError from sqlalchemy.exc import SQLAlchemyError, DisconnectionError
...@@ -20,7 +21,6 @@ from packageship.application.models.package import PackagesMaintainer ...@@ -20,7 +21,6 @@ from packageship.application.models.package import PackagesMaintainer
from packageship.application.models.package import PackagesIssue from packageship.application.models.package import PackagesIssue
from packageship.application.models.package import SrcRequires from packageship.application.models.package import SrcRequires
from packageship.application.models.package import BinPack from packageship.application.models.package import BinPack
from packageship.application.models.package import BinRequires
from packageship.application.models.package import BinProvides from packageship.application.models.package import BinProvides
from packageship.libs.exception import Error from packageship.libs.exception import Error
from packageship.application.models.package import Packages from packageship.application.models.package import Packages
...@@ -159,8 +159,8 @@ def sing_pack(srcname, tablename): ...@@ -159,8 +159,8 @@ def sing_pack(srcname, tablename):
pack_info_dict = SinglePackInfoSchema( pack_info_dict = SinglePackInfoSchema(
many=False).dump(package_info_obj) many=False).dump(package_info_obj)
pack_info_dict = parsing_maintainner(srcname, pack_info_dict) pack_info_dict = parsing_maintainner(srcname, pack_info_dict)
issue_count = database_name.session.query( issue_count = database_name.session.query(PackagesIssue).filter_by(
PackagesIssue).filter_by(pkg_name=package_info_obj.name).count() pkg_name=package_info_obj.name).count()
pack_info_dict["issue"] = issue_count pack_info_dict["issue"] = issue_count
buildrequired = buildrequired_search(srcname, tablename) buildrequired = buildrequired_search(srcname, tablename)
pack_info_dict["buildrequired"] = buildrequired pack_info_dict["buildrequired"] = buildrequired
...@@ -180,7 +180,8 @@ def sing_pack(srcname, tablename): ...@@ -180,7 +180,8 @@ def sing_pack(srcname, tablename):
ResponseCode.response_json( ResponseCode.response_json(
ResponseCode.DIS_CONNECTION_DB)) ResponseCode.DIS_CONNECTION_DB))
def parsing_maintainner(srcname,pack_info_dict):
def parsing_maintainner(srcname, pack_info_dict):
""" """
Single package query maintainer and maintainlevel Single package query maintainer and maintainlevel
Args: Args:
...@@ -190,8 +191,8 @@ def parsing_maintainner(srcname,pack_info_dict): ...@@ -190,8 +191,8 @@ def parsing_maintainner(srcname,pack_info_dict):
""" """
with DBHelper(db_name="lifecycle") as database_name: with DBHelper(db_name="lifecycle") as database_name:
maintainer_obj = database_name.session.query(PackagesMaintainer).filter_by( maintainer_obj = database_name.session.query(
name=srcname).first() PackagesMaintainer).filter_by(name=srcname).first()
if maintainer_obj is None: if maintainer_obj is None:
pack_info_dict["maintainer"] = None pack_info_dict["maintainer"] = None
pack_info_dict["maintainlevel"] = None pack_info_dict["maintainlevel"] = None
...@@ -238,104 +239,147 @@ def buildrequired_search(srcname, tablename): ...@@ -238,104 +239,147 @@ def buildrequired_search(srcname, tablename):
return builddep return builddep
def _sub_pack(srcname, tablename): def helper(cls):
"""
Auxiliary function
The returned data format is converted,
the main function is to convert a dictionary to a list
Args:
cls: Data before conversion
Returns:
Converted data
"""
for obj in cls:
if "provides" in obj:
obj["provides"] = list(obj["provides"].values())
for values_p in obj["provides"]:
if 'requiredby' in values_p:
values_p['requiredby'] = list(
values_p['requiredby'].values())
if "requires" in obj:
obj["requires"] = list(obj["requires"].values())
for values_r in obj["requires"]:
if "providedby" in values_r:
values_r['providedby'] = list(
values_r['providedby'].values())
def _sub_pack(src_name, table_name):
""" """
One-level installation dependency of the source package One-level installation dependency of the source package
to generate the binary package to generate the binary package
Args: Args:
srcname: The name of the source package srcname: The name of the source package
tablename: The name of the table in the database tablename: The name of the table in the database
Returns: Returns:
One-level installation dependency of the source package to One-level installation dependency of the source package to
generate the binary package generate the binary package
""" """
with DBHelper(db_name=tablename) as data_name: with DBHelper(db_name=table_name) as database:
src_pack_obj = data_name.session.query( sql_str = """
SrcPack).filter_by(name=srcname).first() SELECT DISTINCT
if src_pack_obj is None: b2.pkgKey AS sub_id,
return [] b2.name AS sub_name,
# Sub-packages generated by the source package pro.id AS sub_pro_id,
bin_pack_set = data_name.session.query( pro.name AS sub_pro_name,
BinPack).filter_by(src_name=src_pack_obj.name).all() b1.name AS sub_reqby_name
pack_list = list() FROM
for bin_pack_obj in bin_pack_set: ( select pkgKey,name,src_name from bin_pack where src_name=:src_name) b2
bin_pack_dict = dict() left join bin_provides pro on b2.pkgKey=pro.pkgKey
bin_pack_dict['id'] = bin_pack_obj.pkgKey LEFT JOIN bin_requires req ON req.name = pro.name
bin_pack_dict['name'] = bin_pack_obj.name LEFT JOIN bin_pack b1 ON req.pkgKey = b1.pkgKey;
# Sub-package lookup provided components
bin_provides_set = data_name.session.query(
BinProvides).filter_by(pkgKey=bin_pack_obj.pkgKey).all()
provide_list = provide_(tablename, bin_provides_set)
bin_pack_dict['provides'] = provide_list
bin_require_set = data_name.session.query(
BinRequires).filter_by(pkgKey=bin_pack_obj.pkgKey).all()
require_list = require_(tablename, bin_require_set)
bin_pack_dict['requires'] = require_list
pack_list.append(bin_pack_dict)
return pack_list
def provide_(tablename, bin_provides_set):
"""
pkgKey goes to the bin_pack table to obtain
bin_name corresponding to requiredby
Args:
tablename: table name
bin_provides_set: Query set provided by the binary package
Returns:
provide_list: Provided list
""" """
with DBHelper(db_name=tablename) as data_name: res = {}
provide_list = [] res_pro = database.session.execute(
for bin_provides_obj in bin_provides_set: text(sql_str), {"src_name": src_name}).fetchall()
bin_provides_dict = dict()
bin_provides_dict['id'] = bin_provides_obj.id for pro_obj in res_pro:
bin_provides_dict['name'] = bin_provides_obj.name if pro_obj.sub_name not in res:
reqired_set = data_name.session.query( res[pro_obj.sub_name] = {
BinRequires).filter_by(name=bin_provides_obj.name).all() "id": pro_obj.sub_id,
required_pkgkey_list = [ "name": pro_obj.sub_name,
reqired_obj.pkgKey for reqired_obj in reqired_set] "provides": {
required_bin_set = data_name.session.query(BinPack).filter( pro_obj.sub_pro_name: {
BinPack.pkgKey.in_(required_pkgkey_list)).all() "id": pro_obj.sub_pro_id,
requiredby = [ "name": pro_obj.sub_pro_name,
required_bin_obj.name for required_bin_obj in required_bin_set] "requiredby": {
bin_provides_dict['requiredby'] = requiredby pro_obj.sub_reqby_name: pro_obj.sub_reqby_name
provide_list.append(bin_provides_dict) } if pro_obj.sub_reqby_name else {}
return provide_list }
} if pro_obj.sub_pro_name else {}
}
def require_(tablename, bin_require_set): else:
pro_info = res[pro_obj.sub_name]["provides"]
if pro_obj.sub_pro_name in pro_info:
pro_info[pro_obj.sub_pro_name]["requiredby"].update(
{pro_obj.sub_reqby_name: pro_obj.sub_reqby_name})
else:
pro_info.update(
{
pro_obj.sub_pro_name: {
"id": pro_obj.sub_pro_id,
"name": pro_obj.sub_pro_name,
"requiredby": {
pro_obj.sub_reqby_name: pro_obj.sub_reqby_name
} if pro_obj.sub_reqby_name else {}
} if pro_obj.sub_pro_name else {}
}
)
sql_re = """
SELECT DISTINCT
b2.pkgKey AS sub_id,
b2.name AS sub_name,
req.id AS sub_req_id,
req.name AS sub_req_name,
b1.name AS sub_proby_name
FROM
( SELECT pkgKey, name, src_name FROM bin_pack WHERE src_name = :src_name ) b2
LEFT JOIN bin_requires req ON b2.pkgKey = req.pkgKey
LEFT JOIN bin_provides pro ON pro.name = req.name
LEFT JOIN bin_pack b1 ON pro.pkgKey = b1.pkgKey;
""" """
pkgKey goes to the bin_pack table to obtain res_req = database.session.execute(
bin_name corresponding to provideBy text(sql_re), {"src_name": src_name}).fetchall()
Args: for req_obj in res_req:
tablename: table name sub_pkg_info = res[req_obj.sub_name]
bin_provides_set: Query set provided by the binary package # if req_obj.sub_name not in sub_pkg_info:
Returns: if "requires" not in sub_pkg_info:
require_list: require list if not req_obj.sub_req_name:
""" sub_pkg_info['requires'] = {}
with DBHelper(db_name=tablename) as data_name: else:
# Sub-package to find the required components sub_pkg_info.update(
require_list = [] {
"requires": {
for bin_require_obj in bin_require_set: req_obj.sub_req_name: {
bin_require_dict = dict() "id": req_obj.sub_req_id,
bin_require_dict['id'] = bin_require_obj.id "name": req_obj.sub_req_name,
bin_require_dict['name'] = bin_require_obj.name "providedby": {
provide_set = data_name.session.query( req_obj.sub_proby_name: req_obj.sub_proby_name
BinProvides).filter_by(name=bin_require_obj.name).all() } if req_obj.sub_proby_name else {}
provide_pkg_list = [ }
provide_obj.pkgKey for provide_obj in provide_set] }
required_bin_set = data_name.session.query(BinPack).filter( }
BinPack.pkgKey.in_(provide_pkg_list)).all() )
providedby = [ else:
required_bin_obj.name for required_bin_obj in required_bin_set] req_info = sub_pkg_info["requires"]
bin_require_dict['providedby'] = providedby if req_obj.sub_req_name in req_info:
require_list.append(bin_require_dict) req_info[req_obj.sub_req_name]["providedby"].update(
return require_list {req_obj.sub_proby_name: req_obj.sub_proby_name})
else:
req_info.update(
{
req_obj.sub_req_name: {
"id": req_obj.sub_req_id,
"name": req_obj.sub_req_name,
"providedby": {
req_obj.sub_proby_name: req_obj.sub_proby_name
} if req_obj.sub_proby_name else {}
}
}
)
helper([values for k, values in res.items()])
return (list(res.values()))
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
"id": 1, "id": 1,
"name": "Ac", "name": "Ac",
"providedby": [ "providedby": [
"C1",
"C1" "C1"
] ]
} }
...@@ -59,7 +58,6 @@ ...@@ -59,7 +58,6 @@
"id": 2, "id": 2,
"name": "Ac", "name": "Ac",
"providedby": [ "providedby": [
"C1",
"C1" "C1"
] ]
}, },
......
...@@ -134,7 +134,6 @@ class TestGetSinglePack(ReadTestBase): ...@@ -134,7 +134,6 @@ class TestGetSinglePack(ReadTestBase):
self.assertEqual(ResponseCode.CODE_MSG_MAP.get(ResponseCode.SUCCESS), self.assertEqual(ResponseCode.CODE_MSG_MAP.get(ResponseCode.SUCCESS),
resp_dict.get("msg"), resp_dict.get("msg"),
msg="Error in status prompt return") msg="Error in status prompt return")
self.assertIn("data", resp_dict, msg="Error in data format return") self.assertIn("data", resp_dict, msg="Error in data format return")
self.assertTrue( self.assertTrue(
compare_two_values( compare_two_values(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册