提交 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 """
res = {}
bin_provides_set = data_name.session.query( res_pro = database.session.execute(
BinProvides).filter_by(pkgKey=bin_pack_obj.pkgKey).all() text(sql_str), {"src_name": src_name}).fetchall()
provide_list = provide_(tablename, bin_provides_set)
bin_pack_dict['provides'] = provide_list for pro_obj in res_pro:
bin_require_set = data_name.session.query( if pro_obj.sub_name not in res:
BinRequires).filter_by(pkgKey=bin_pack_obj.pkgKey).all() res[pro_obj.sub_name] = {
require_list = require_(tablename, bin_require_set) "id": pro_obj.sub_id,
bin_pack_dict['requires'] = require_list "name": pro_obj.sub_name,
pack_list.append(bin_pack_dict) "provides": {
return pack_list pro_obj.sub_pro_name: {
"id": pro_obj.sub_pro_id,
"name": pro_obj.sub_pro_name,
def provide_(tablename, bin_provides_set): "requiredby": {
""" pro_obj.sub_reqby_name: pro_obj.sub_reqby_name
pkgKey goes to the bin_pack table to obtain } if pro_obj.sub_reqby_name else {}
bin_name corresponding to requiredby }
} if pro_obj.sub_pro_name else {}
Args: }
tablename: table name else:
bin_provides_set: Query set provided by the binary package pro_info = res[pro_obj.sub_name]["provides"]
if pro_obj.sub_pro_name in pro_info:
Returns: pro_info[pro_obj.sub_pro_name]["requiredby"].update(
provide_list: Provided list {pro_obj.sub_reqby_name: pro_obj.sub_reqby_name})
""" else:
with DBHelper(db_name=tablename) as data_name: pro_info.update(
provide_list = [] {
for bin_provides_obj in bin_provides_set: pro_obj.sub_pro_name: {
bin_provides_dict = dict() "id": pro_obj.sub_pro_id,
bin_provides_dict['id'] = bin_provides_obj.id "name": pro_obj.sub_pro_name,
bin_provides_dict['name'] = bin_provides_obj.name "requiredby": {
reqired_set = data_name.session.query( pro_obj.sub_reqby_name: pro_obj.sub_reqby_name
BinRequires).filter_by(name=bin_provides_obj.name).all() } if pro_obj.sub_reqby_name else {}
required_pkgkey_list = [ } if pro_obj.sub_pro_name else {}
reqired_obj.pkgKey for reqired_obj in reqired_set] }
required_bin_set = data_name.session.query(BinPack).filter( )
BinPack.pkgKey.in_(required_pkgkey_list)).all()
requiredby = [ sql_re = """
required_bin_obj.name for required_bin_obj in required_bin_set] SELECT DISTINCT
bin_provides_dict['requiredby'] = requiredby b2.pkgKey AS sub_id,
provide_list.append(bin_provides_dict) b2.name AS sub_name,
return provide_list req.id AS sub_req_id,
req.name AS sub_req_name,
b1.name AS sub_proby_name
def require_(tablename, bin_require_set): FROM
""" ( SELECT pkgKey, name, src_name FROM bin_pack WHERE src_name = :src_name ) b2
pkgKey goes to the bin_pack table to obtain LEFT JOIN bin_requires req ON b2.pkgKey = req.pkgKey
bin_name corresponding to provideBy LEFT JOIN bin_provides pro ON pro.name = req.name
LEFT JOIN bin_pack b1 ON pro.pkgKey = b1.pkgKey;
Args: """
tablename: table name res_req = database.session.execute(
bin_provides_set: Query set provided by the binary package text(sql_re), {"src_name": src_name}).fetchall()
Returns: for req_obj in res_req:
require_list: require list sub_pkg_info = res[req_obj.sub_name]
""" # if req_obj.sub_name not in sub_pkg_info:
with DBHelper(db_name=tablename) as data_name:
# Sub-package to find the required components if "requires" not in sub_pkg_info:
require_list = [] if not req_obj.sub_req_name:
sub_pkg_info['requires'] = {}
for bin_require_obj in bin_require_set: else:
bin_require_dict = dict() sub_pkg_info.update(
bin_require_dict['id'] = bin_require_obj.id {
bin_require_dict['name'] = bin_require_obj.name "requires": {
provide_set = data_name.session.query( req_obj.sub_req_name: {
BinProvides).filter_by(name=bin_require_obj.name).all() "id": req_obj.sub_req_id,
provide_pkg_list = [ "name": req_obj.sub_req_name,
provide_obj.pkgKey for provide_obj in provide_set] "providedby": {
required_bin_set = data_name.session.query(BinPack).filter( req_obj.sub_proby_name: req_obj.sub_proby_name
BinPack.pkgKey.in_(provide_pkg_list)).all() } if req_obj.sub_proby_name else {}
providedby = [ }
required_bin_obj.name for required_bin_obj in required_bin_set] }
bin_require_dict['providedby'] = providedby }
require_list.append(bin_require_dict) )
return require_list else:
req_info = sub_pkg_info["requires"]
if req_obj.sub_req_name in req_info:
req_info[req_obj.sub_req_name]["providedby"].update(
{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.
先完成此消息的编辑!
想要评论请 注册