このコミットが含まれているのは:
@@ -125,50 +125,8 @@ class CountsPopulation
|
||||
end
|
||||
|
||||
def apply_condition(entry)
|
||||
raise ArgumentError unless entry.is_a?(Hash)
|
||||
raise ArgumentError if (entry.keys - ['field', 'operator', 'value', 'end', 'blank']).any?
|
||||
|
||||
key = entry.fetch('field')
|
||||
type = definition.fields.fetch(key) { raise ArgumentError }
|
||||
operator = entry.fetch('operator')
|
||||
raise ArgumentError unless CountsResourceDefinition::OPERATORS.fetch(type, []).include?(operator)
|
||||
raise ArgumentError unless [true, false, nil].include?(entry['blank'])
|
||||
|
||||
expression = definition.expression(key)
|
||||
blank = type == :string || type == :enum ?
|
||||
"(#{ expression } IS NULL OR #{ expression } = '')" : "#{ expression } IS NULL"
|
||||
if entry['blank']
|
||||
@scope = @scope.where(Arel.sql(blank))
|
||||
return
|
||||
end
|
||||
values = [entry['value'], entry['end']]
|
||||
raise ArgumentError unless values.all? { _1.nil? || _1.is_a?(String) }
|
||||
return if values.all? { _1.nil? || _1 == '' }
|
||||
|
||||
parsed = values.map do |value|
|
||||
next nil if value.nil? || value == ''
|
||||
|
||||
case type
|
||||
when :integer
|
||||
raise ArgumentError unless value.match?(/\A-?\d+\z/)
|
||||
|
||||
value.to_i
|
||||
when :datetime then timestamp(value)
|
||||
else value
|
||||
end
|
||||
end
|
||||
if operator == 'range'
|
||||
@scope = @scope.where("#{ expression } >= ?", parsed[0]) if parsed[0]
|
||||
@scope = @scope.where("#{ expression } <= ?", parsed[1]) if parsed[1]
|
||||
return
|
||||
end
|
||||
return unless parsed[0]
|
||||
|
||||
sql_operator = { 'eq' => '=', 'ne' => '<>', 'gt' => '>', 'lt' => '<',
|
||||
'ge' => '>=', 'le' => '<=', 'like' => 'LIKE' }.fetch(operator)
|
||||
sql = "#{ expression } #{ sql_operator } ?"
|
||||
sql = "(#{ sql } OR #{ blank })" if operator == 'ne'
|
||||
@scope = @scope.where(sql, parsed[0])
|
||||
@condition ||= CountsCondition.new(self)
|
||||
@scope = @condition.apply(@scope, entry)
|
||||
end
|
||||
|
||||
def snapshot_membership(value)
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする