提交 3e63523d 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!122 修改单包查询时间过长

Merge pull request !122 from jiangpengjuj/master
...@@ -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()))
...@@ -20,7 +20,7 @@ def validate_pagenum(pagenum): ...@@ -20,7 +20,7 @@ def validate_pagenum(pagenum):
Raises: Raises:
ValidationError: Test failed ValidationError: Test failed
""" """
if pagenum <= 0 or pagenum >= 65535: if pagenum <= 0 or pagenum > 65535:
raise ValidationError("pagenum is illegal data ") raise ValidationError("pagenum is illegal data ")
...@@ -34,7 +34,7 @@ def validate_pagesize(pagesize): ...@@ -34,7 +34,7 @@ def validate_pagesize(pagesize):
Raises: Raises:
ValidationError: Test failed ValidationError: Test failed
""" """
if pagesize <= 0 or pagesize >= 65535: if pagesize <= 0 or pagesize > 65535:
raise ValidationError("pagesize is illegal data ") raise ValidationError("pagesize is illegal data ")
......
...@@ -511,15 +511,9 @@ class AllPackageCommand(PkgshipCommand): ...@@ -511,15 +511,9 @@ class AllPackageCommand(PkgshipCommand):
self.params = [('tablename', 'str', 'name of the database operated', '', 'store'), self.params = [('tablename', 'str', 'name of the database operated', '', 'store'),
('-remote', 'str', 'The address of the remote service', ('-remote', 'str', 'The address of the remote service',
False, 'store_true'), False, 'store_true'),
('-pkgname', 'str', ('-packagename', 'str',
'Package name that needs fuzzy matching', '', 'store'), 'Package name that needs fuzzy matching', '', 'store'),
('-maintainner', 'str', 'Maintainer\'s name', '', 'store'), ('-maintainer', 'str', 'Maintainer\'s name', '', 'store')
('-maintainlevel', 'str',
'Maintain the level of data', '', 'store'),
('-page', 'int',
'Need to query the data on the first few pages', 1, 'store'),
('-pagesize', 'int',
'The size of the data displayed on each page', 10, 'store')
] ]
def register(self): def register(self):
...@@ -577,14 +571,14 @@ class AllPackageCommand(PkgshipCommand): ...@@ -577,14 +571,14 @@ class AllPackageCommand(PkgshipCommand):
self._set_read_host(params.remote) self._set_read_host(params.remote)
_url = self.read_host + \ _url = self.read_host + \
'/packages?table_name={table_name}&query_pkg_name={pkg_name}&\ '/packages?table_name={table_name}&query_pkg_name={pkg_name}&\
maintainner={maintainner}&maintainlevel={maintainlevel}&\ maintainner={maintainer}&maintainlevel={maintainlevel}&\
page_num={page}&page_size={pagesize}'.format( page_num={page}&page_size={pagesize}'.format(
table_name=params.tablename, table_name=params.tablename,
pkg_name=params.pkgname, pkg_name=params.packagename,
maintainner=params.maintainner, maintainer=params.maintainer,
maintainlevel=params.maintainlevel, maintainlevel='',
page=params.page, page=1,
pagesize=params.pagesize).replace(' ', '') pagesize=65535).replace(' ', '')
try: try:
response = requests.get(_url) response = requests.get(_url)
except ConnErr as conn_error: except ConnErr as conn_error:
...@@ -600,9 +594,6 @@ class AllPackageCommand(PkgshipCommand): ...@@ -600,9 +594,6 @@ class AllPackageCommand(PkgshipCommand):
print(response.text) print(response.text)
if getattr(self.table, 'rowcount'): if getattr(self.table, 'rowcount'):
print('total count : %d' % response_data['total_count'])
print('total page : %d' % response_data['total_page'])
print('current page : %s ' % params.page)
print(self.table) print(self.table)
else: else:
print('Sorry, no relevant information has been found yet') print('Sorry, no relevant information has been found yet')
...@@ -1382,7 +1373,7 @@ class IssueCommand(PkgshipCommand): ...@@ -1382,7 +1373,7 @@ class IssueCommand(PkgshipCommand):
self.parse = PkgshipCommand.subparsers.add_parser( self.parse = PkgshipCommand.subparsers.add_parser(
'issue', help='Query the issue list of the specified package') 'issue', help='Query the issue list of the specified package')
self.params = [ self.params = [
('-pkg_name', 'str', 'Query source package name', '', 'store'), ('-packagename', 'str', 'Query source package name', '', 'store'),
('-issue_type', 'str', 'Type of issue', '', 'store'), ('-issue_type', 'str', 'Type of issue', '', 'store'),
('-issue_status', 'str', 'the status of the issue', '', 'store'), ('-issue_status', 'str', 'the status of the issue', '', 'store'),
...@@ -1390,7 +1381,7 @@ class IssueCommand(PkgshipCommand): ...@@ -1390,7 +1381,7 @@ class IssueCommand(PkgshipCommand):
('-page', 'int', ('-page', 'int',
'Need to query the data on the first few pages', 1, 'store'), 'Need to query the data on the first few pages', 1, 'store'),
('-pagesize', 'int', ('-pagesize', 'int',
'The size of the data displayed on each page', 100, 'store'), 'The size of the data displayed on each page', 65535, 'store'),
('-remote', 'str', 'The address of the remote service', False, 'store_true') ('-remote', 'str', 'The address of the remote service', False, 'store_true')
] ]
self.table = self.create_table( self.table = self.create_table(
...@@ -1448,7 +1439,7 @@ class IssueCommand(PkgshipCommand): ...@@ -1448,7 +1439,7 @@ class IssueCommand(PkgshipCommand):
&issue_status={issue_status}&maintainer={maintainer}'\ &issue_status={issue_status}&maintainer={maintainer}'\
.format(page_num=params.page, .format(page_num=params.page,
page_size=params.pagesize, page_size=params.pagesize,
pkg_name=params.pkg_name, pkg_name=params.packagename,
issue_type=params.issue_type, issue_type=params.issue_type,
issue_status=params.issue_status, issue_status=params.issue_status,
maintainer=params.maintainer).replace(' ', '') maintainer=params.maintainer).replace(' ', '')
......
...@@ -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"
] ]
}, },
......
...@@ -172,7 +172,7 @@ class TestPackages(ReadTestBase): ...@@ -172,7 +172,7 @@ class TestPackages(ReadTestBase):
# test wrong page_num # test wrong page_num
resp = self.client.get( resp = self.client.get(
"/packages?table_name=mainline&page_num=65535&page_size=1") "/packages?table_name=mainline&page_num=65536&page_size=1")
resp_dict = json.loads(resp.data) resp_dict = json.loads(resp.data)
self.assertIn("code", resp_dict, msg="Error in data format return") self.assertIn("code", resp_dict, msg="Error in data format return")
...@@ -216,7 +216,7 @@ class TestPackages(ReadTestBase): ...@@ -216,7 +216,7 @@ class TestPackages(ReadTestBase):
# test wrong page_size # test wrong page_size
resp = self.client.get( resp = self.client.get(
"/packages?table_name=mainline&page_num=1&page_size=65535") "/packages?table_name=mainline&page_num=1&page_size=65536")
resp_dict = json.loads(resp.data) resp_dict = json.loads(resp.data)
self.assertIn("code", resp_dict, msg="Error in data format return") self.assertIn("code", resp_dict, msg="Error in data format return")
......
...@@ -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.
先完成此消息的编辑!
想要评论请 注册