Skip to content

Commit

Permalink
Refactor the filter
Browse files Browse the repository at this point in the history
  • Loading branch information
lubomir committed Sep 7, 2015
1 parent 6f1ff52 commit 8e9cffc
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 52 deletions.
49 changes: 12 additions & 37 deletions pdc/apps/package/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,57 +24,32 @@ def dependency_filter(type, queryset, value):
for dep in models.Dependency.objects.filter(type=type, name=groups['name']):

is_equal = dep.is_equal(groups['version']) if groups['version'] else False
is_lower = dep.is_lower(groups['version']) if groups['version'] else False
is_higher = dep.is_higher(groups['version']) if groups['version'] else False

if groups['op'] == '=':
if not dep.is_satisfied_by(groups['version']):
queryset = queryset.exclude(pk=dep.rpm_id)
if groups['op'] == '=' and not dep.is_satisfied_by(groups['version']):
queryset = queryset.exclude(pk=dep.rpm_id)

# User requests everything depending on higher than X
elif groups['op'] == '>':
if dep.comparison == '>' or dep.comparison == '>=':
# Same direction, does not limit anything
pass
elif dep.comparison == '<' and (dep.is_lower(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '<=' and (dep.is_lower(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '=' and (dep.is_lower(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif groups['op'] == '>' and dep.comparison in ('<', '<=', '=') and (is_lower or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)

# User requests everything depending on lesser than X
elif groups['op'] == '<':
if dep.comparison == '<' or dep.comparison == '<=':
# Same direction, does not limit anything
pass
elif dep.comparison == '>' and (dep.is_higher(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '>=' and (dep.is_higher(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '=' and (dep.is_higher(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif groups['op'] == '<' and dep.comparison in ('>', '>=', '=') and (is_higher or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)

# User requests everything depending on at least X
elif groups['op'] == '>=':
if dep.comparison == '>' or dep.comparison == '>=':
# Same direction, does not limit anything
pass
elif dep.comparison == '<' and (dep.is_lower(groups['version']) or is_equal):
if dep.comparison == '<' and (is_lower or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '<=' and dep.is_lower(groups['version']):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '=' and dep.is_lower(groups['version']):
elif dep.comparison in ('<=', '=') and is_lower:
queryset = queryset.exclude(pk=dep.rpm_id)

# User requests everything depending on at most X
elif groups['op'] == '<=':
if dep.comparison == '<' or dep.comparison == '<=':
# Same direction, does not limit anything
pass
elif dep.comparison == '>' and (dep.is_higher(groups['version']) or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '>=' and dep.is_higher(groups['version']):
if dep.comparison == '>' and (is_higher or is_equal):
queryset = queryset.exclude(pk=dep.rpm_id)
elif dep.comparison == '=' and dep.is_higher(groups['version']):
elif dep.comparison in ('>=', '=') and is_higher:
queryset = queryset.exclude(pk=dep.rpm_id)

return queryset
Expand Down
42 changes: 27 additions & 15 deletions pdc/apps/package/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,32 +172,44 @@ def clean(self):
# programmer error can cause this to fail.
raise ValidationError('Bad version constraint: both version and comparison must be specified.')

def is_satisfied_by(self, other):
@property
def parsed_version(self):
if not hasattr(self, '_version'):
self._version = parse_epoch_version(self.version)
return self._version

def is_satisfied_by(self, other):
"""
Check if other version satisfies this dependency.
:paramtype other: string
"""
funcs = {
'=': lambda x: x == self._version,
'<': lambda x: x < self._version,
'<=': lambda x: x <= self._version,
'>': lambda x: x > self._version,
'>=': lambda x: x >= self._version,
'=': lambda x: x == self.parsed_version,
'<': lambda x: x < self.parsed_version,
'<=': lambda x: x <= self.parsed_version,
'>': lambda x: x > self.parsed_version,
'>=': lambda x: x >= self.parsed_version,
}
return funcs[self.comparison](parse_epoch_version(other))

def is_equal(self, other):
if not hasattr(self, '_version'):
self._version = parse_epoch_version(self.version)
return self._version == parse_epoch_version(other)
"""
Return true if the other version is equal to version in this dep.
"""
return self.parsed_version == parse_epoch_version(other)

def is_higher(self, other):
if not hasattr(self, '_version'):
self._version = parse_epoch_version(self.version)
return self._version > parse_epoch_version(other)
"""
Return true if version in this dep is higher than the other version.
"""
return self.parsed_version > parse_epoch_version(other)

def is_lower(self, other):
if not hasattr(self, '_version'):
self._version = parse_epoch_version(self.version)
return self._version < parse_epoch_version(other)
"""
Return true if version in this dep is lower than the other version.
"""
return self.parsed_version < parse_epoch_version(other)


class ImageFormat(models.Model):
Expand Down

0 comments on commit 8e9cffc

Please sign in to comment.