Merge "Improve 'latest' filter"
This commit is contained in:
commit
0f4c004952
|
@ -203,14 +203,46 @@ def get_all(context, session, filters=None, marker=None, limit=None,
|
||||||
return [af.to_dict() for af in artifacts]
|
return [af.to_dict() for af in artifacts]
|
||||||
|
|
||||||
|
|
||||||
def _get_all(context, session, filters=None, marker=None, limit=None,
|
def _apply_latest_filter(context, session, query,
|
||||||
sort=None, latest=False):
|
basic_conds, tag_conds, prop_conds):
|
||||||
|
# Subquery to fetch max version suffix for a group (name,
|
||||||
|
# version_prefix)
|
||||||
|
ver_suffix_subq = _apply_query_base_filters(
|
||||||
|
session.query(
|
||||||
|
models.Artifact.name,
|
||||||
|
models.Artifact.version_prefix,
|
||||||
|
func.max(models.Artifact.version_suffix).label(
|
||||||
|
'max_suffix')).group_by(
|
||||||
|
models.Artifact.name, models.Artifact.version_prefix),
|
||||||
|
context)
|
||||||
|
ver_suffix_subq = _apply_user_filters(
|
||||||
|
ver_suffix_subq, basic_conds, tag_conds, prop_conds).subquery()
|
||||||
|
# Subquery to fetch max version prefix for a name group
|
||||||
|
ver_prefix_subq = _apply_query_base_filters(
|
||||||
|
session.query(models.Artifact.name, func.max(
|
||||||
|
models.Artifact.version_prefix).label('max_prefix')).group_by(
|
||||||
|
models.Artifact.name),
|
||||||
|
context)
|
||||||
|
ver_prefix_subq = _apply_user_filters(
|
||||||
|
ver_prefix_subq, basic_conds, tag_conds, prop_conds).subquery()
|
||||||
|
# Combine two subqueries together joining them with Artifact table
|
||||||
|
query = query.join(
|
||||||
|
ver_prefix_subq,
|
||||||
|
and_(models.Artifact.name == ver_prefix_subq.c.name,
|
||||||
|
models.Artifact.version_prefix ==
|
||||||
|
ver_prefix_subq.c.max_prefix)).join(
|
||||||
|
ver_suffix_subq,
|
||||||
|
and_(models.Artifact.name == ver_suffix_subq.c.name,
|
||||||
|
models.Artifact.version_prefix ==
|
||||||
|
ver_suffix_subq.c.version_prefix,
|
||||||
|
models.Artifact.version_suffix ==
|
||||||
|
ver_suffix_subq.c.max_suffix)
|
||||||
|
)
|
||||||
|
|
||||||
filters = filters or {}
|
return query
|
||||||
|
|
||||||
query = _do_artifacts_query(context, session, latest)
|
|
||||||
|
|
||||||
basic_conds, tag_conds, prop_conds = _do_query_filters(filters)
|
def _apply_user_filters(query, basic_conds, tag_conds, prop_conds):
|
||||||
|
|
||||||
if basic_conds:
|
if basic_conds:
|
||||||
for basic_condition in basic_conds:
|
for basic_condition in basic_conds:
|
||||||
|
@ -226,6 +258,24 @@ def _get_all(context, session, filters=None, marker=None, limit=None,
|
||||||
query = query.join(models.ArtifactProperty, aliased=True).filter(
|
query = query.join(models.ArtifactProperty, aliased=True).filter(
|
||||||
and_(*prop_condition))
|
and_(*prop_condition))
|
||||||
|
|
||||||
|
return query
|
||||||
|
|
||||||
|
|
||||||
|
def _get_all(context, session, filters=None, marker=None, limit=None,
|
||||||
|
sort=None, latest=False):
|
||||||
|
|
||||||
|
filters = filters or {}
|
||||||
|
|
||||||
|
query = _do_artifacts_query(context, session)
|
||||||
|
|
||||||
|
basic_conds, tag_conds, prop_conds = _do_query_filters(filters)
|
||||||
|
|
||||||
|
query = _apply_user_filters(query, basic_conds, tag_conds, prop_conds)
|
||||||
|
|
||||||
|
if latest:
|
||||||
|
query = _apply_latest_filter(context, session, query,
|
||||||
|
basic_conds, tag_conds, prop_conds)
|
||||||
|
|
||||||
marker_artifact = None
|
marker_artifact = None
|
||||||
if marker is not None:
|
if marker is not None:
|
||||||
marker_artifact = get(context, marker, session)
|
marker_artifact = get(context, marker, session)
|
||||||
|
@ -334,37 +384,6 @@ def _do_artifacts_query(context, session, latest=False):
|
||||||
|
|
||||||
query = session.query(models.Artifact)
|
query = session.query(models.Artifact)
|
||||||
|
|
||||||
if latest:
|
|
||||||
# Subquery to fetch max version suffix for a group (name,
|
|
||||||
# version_prefix)
|
|
||||||
ver_suffix_subq = _apply_query_base_filters(
|
|
||||||
session.query(
|
|
||||||
models.Artifact.name,
|
|
||||||
models.Artifact.version_prefix,
|
|
||||||
func.max(models.Artifact.version_suffix).label(
|
|
||||||
'max_suffix')).group_by(
|
|
||||||
models.Artifact.name, models.Artifact.version_prefix),
|
|
||||||
context).subquery()
|
|
||||||
# Subquery to fetch max version prefix for a name group
|
|
||||||
ver_prefix_subq = _apply_query_base_filters(
|
|
||||||
session.query(models.Artifact.name, func.max(
|
|
||||||
models.Artifact.version_prefix).label('max_prefix')).group_by(
|
|
||||||
models.Artifact.name),
|
|
||||||
context).subquery()
|
|
||||||
# Combine two subqueries together joining them with Artifact table
|
|
||||||
query = query.join(
|
|
||||||
ver_prefix_subq,
|
|
||||||
and_(models.Artifact.name == ver_prefix_subq.c.name,
|
|
||||||
models.Artifact.version_prefix ==
|
|
||||||
ver_prefix_subq.c.max_prefix)).join(
|
|
||||||
ver_suffix_subq,
|
|
||||||
and_(models.Artifact.name == ver_suffix_subq.c.name,
|
|
||||||
models.Artifact.version_prefix ==
|
|
||||||
ver_suffix_subq.c.version_prefix,
|
|
||||||
models.Artifact.version_suffix ==
|
|
||||||
ver_suffix_subq.c.max_suffix)
|
|
||||||
)
|
|
||||||
|
|
||||||
query = (query.options(joinedload(models.Artifact.properties)).
|
query = (query.options(joinedload(models.Artifact.properties)).
|
||||||
options(joinedload(models.Artifact.tags)).
|
options(joinedload(models.Artifact.tags)).
|
||||||
options(joinedload(models.Artifact.blobs)))
|
options(joinedload(models.Artifact.blobs)))
|
||||||
|
@ -373,10 +392,6 @@ def _do_artifacts_query(context, session, latest=False):
|
||||||
|
|
||||||
|
|
||||||
def _apply_query_base_filters(query, context):
|
def _apply_query_base_filters(query, context):
|
||||||
|
|
||||||
# Don't show deleted artifacts
|
|
||||||
query = query.filter(models.Artifact.status != 'deleted')
|
|
||||||
|
|
||||||
# Don't show deleted artifacts
|
# Don't show deleted artifacts
|
||||||
query = query.filter(models.Artifact.status != 'deleted')
|
query = query.filter(models.Artifact.status != 'deleted')
|
||||||
|
|
||||||
|
|
|
@ -742,17 +742,19 @@ class TestList(TestArtifact):
|
||||||
{'name': 'group1',
|
{'name': 'group1',
|
||||||
'version': group1_versions[i],
|
'version': group1_versions[i],
|
||||||
'tags': ['tag%s' % i],
|
'tags': ['tag%s' % i],
|
||||||
'int1': 2048,
|
'int1': 2048 + i,
|
||||||
'float1': 123.456,
|
'float1': 123.456,
|
||||||
'str1': 'bugaga',
|
'str1': 'bugaga',
|
||||||
|
"string_required": "test_str",
|
||||||
'bool1': True})
|
'bool1': True})
|
||||||
self.create_artifact(
|
self.create_artifact(
|
||||||
{'name': 'group2',
|
{'name': 'group2',
|
||||||
'version': group2_versions[i],
|
'version': group2_versions[i],
|
||||||
'tags': ['tag%s' % i],
|
'tags': ['tag%s' % i],
|
||||||
'int1': 2048,
|
'int1': 2048 + i,
|
||||||
'float1': 123.456,
|
'float1': 123.456,
|
||||||
'str1': 'bugaga',
|
'str1': 'bugaga',
|
||||||
|
"string_required": "test_str",
|
||||||
'bool1': True})
|
'bool1': True})
|
||||||
|
|
||||||
url = '/sample_artifact?version=latest&sort=name:asc'
|
url = '/sample_artifact?version=latest&sort=name:asc'
|
||||||
|
@ -761,6 +763,20 @@ class TestList(TestArtifact):
|
||||||
self.assertEqual('20.0.0', res[0]['version'])
|
self.assertEqual('20.0.0', res[0]['version'])
|
||||||
self.assertEqual('1000.0.1', res[1]['version'])
|
self.assertEqual('1000.0.1', res[1]['version'])
|
||||||
|
|
||||||
|
self.patch('/sample_artifact/' + res[0]['id'], self.make_active)
|
||||||
|
|
||||||
|
url = '/sample_artifact?version=latest&sort=name:asc&status=drafted'
|
||||||
|
res = self.get(url=url, status=200)['sample_artifact']
|
||||||
|
self.assertEqual(2, len(res))
|
||||||
|
self.assertEqual('2.0.1', res[0]['version'])
|
||||||
|
self.assertEqual('1000.0.1', res[1]['version'])
|
||||||
|
|
||||||
|
url = '/sample_artifact?version=latest&sort=name:asc&int1=2050'
|
||||||
|
res = self.get(url=url, status=200)['sample_artifact']
|
||||||
|
self.assertEqual(2, len(res))
|
||||||
|
self.assertEqual('2.0.0', res[0]['version'])
|
||||||
|
self.assertEqual('99.0.0', res[1]['version'])
|
||||||
|
|
||||||
url = '/sample_artifact?version=latest&name=group1'
|
url = '/sample_artifact?version=latest&name=group1'
|
||||||
res = self.get(url=url, status=200)['sample_artifact']
|
res = self.get(url=url, status=200)['sample_artifact']
|
||||||
self.assertEqual(1, len(res))
|
self.assertEqual(1, len(res))
|
||||||
|
|
Loading…
Reference in New Issue