Project

General

Profile

Download (3.06 KB) Statistics
| Branch: | Tag: | Revision:
#
# Copyright 2014 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public
# License as published by the Free Software Foundation; either version
# 2 of the License (GPLv2) or (at your option) any later version.
# There is NO WARRANTY for this software, express or implied,
# including the implied warranties of MERCHANTABILITY,
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
# have received a copy of GPLv2 along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.

module Katello
module Util

class PackageFilter
FILTER_COLUMNS = { :epoch => :epoch,
:version => :sortable_version,
:release => :sortable_release
}
LESS_THAN = "lt"
GREATER_THAN = "gt"
EQUAL = "eq"
OPERATORS = [LESS_THAN, GREATER_THAN, EQUAL]

attr_accessor :operator, :version, :epoch, :release

def initialize(evr, operator = nil)
extract_epoch_version_release(evr)
self.operator = operator
end

def extract_epoch_version_release(evr)
match = case evr
when /\A(\d+):(.*)-(.*)\z/
evr.match(/\A(?<epoch>\d+):(?<version>.*)-(?<release>.*)\z/)
when /\A(\d+):(.*)\z/
evr.match(/\A(?<epoch>\d+):(?<version>.*)\z/)
when /\A(.*)-(.*)\z/
evr.match(/\A(?<version>.*)-(?<release>.*)\z/)
else
evr.match(/\A(?<version>.*)\z/)
end
self.version = Package.sortable_version(match[:version])
self.epoch = match[:epoch] rescue nil
self.release = (match[:release] rescue nil) ? Package.sortable_version(match[:release]) : nil
end

def clauses
operator == "eq" ? equality_clauses : range_clauses
end

private

def equality_clauses
clauses = []
clauses << {:term => {:sortable_version => self.version}} unless self.version.blank?
clauses << {:term => {:sortable_release => self.release}} unless self.release.blank?
clauses << {:term => {:epoch => self.epoch}} unless self.epoch.blank?
{:and => clauses}
end

def range_clauses
clauses = []

if epoch
clauses << range_clause(:epoch, operator, epoch)
clauses << combo_clause({:epoch => epoch}, :version, operator, version)
if release
clauses << combo_clause({:epoch => epoch, :version => version},
:release, operator, release)
end
else
clauses << range_clause(:version, operator, version)
if release
clauses << combo_clause({:version => version}, :release, operator, release)
end
end

{:or => clauses}
end

def range_clause(field, operator, value)
{:range => {FILTER_COLUMNS[field] => {operator => value}}}
end

def combo_clause(eq_fields, field, operator, value)
eq_clauses = eq_fields.map do |key, val|
{:term => {FILTER_COLUMNS[key] => val}}
end

{:and => (eq_clauses << range_clause(field, operator, value))}
end
end
end
end
(8-8/15)