projects
/
arvados.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
3220: Adjust disk corruption behavior: If both corrupt and intact
[arvados.git]
/
services
/
api
/
lib
/
record_filters.rb
diff --git
a/services/api/lib/record_filters.rb
b/services/api/lib/record_filters.rb
index d7e556b197323e60ee6d8d95ecce56c947c9a3a3..01d0ae4da5907dbafdfa7060cea6feb1de7dea88 100644
(file)
--- a/
services/api/lib/record_filters.rb
+++ b/
services/api/lib/record_filters.rb
@@
-8,7
+8,7
@@
module RecordFilters
# Input:
module RecordFilters
# Input:
- # +filters+
Arvados filters as list of lists.
+ # +filters+
array of conditions, each being [column, operator, operand]
# +ar_table_name+ name of SQL table
#
# Output:
# +ar_table_name+ name of SQL table
#
# Output:
@@
-29,8
+29,11
@@
module RecordFilters
raise ArgumentError.new("Invalid attribute '#{attr}' in filter")
end
case operator.downcase
raise ArgumentError.new("Invalid attribute '#{attr}' in filter")
end
case operator.downcase
- when '=', '<', '<=', '>', '>=', 'like'
+ when '=', '<', '<=', '>', '>=', '
!=', '
like'
if operand.is_a? String
if operand.is_a? String
+ if operator == '!='
+ operator = '<>'
+ end
cond_out << "#{ar_table_name}.#{attr} #{operator} ?"
if (# any operator that operates on value rather than
# representation:
cond_out << "#{ar_table_name}.#{attr} #{operator} ?"
if (# any operator that operates on value rather than
# representation:
@@
-41,14
+44,20
@@
module RecordFilters
param_out << operand
elsif operand.nil? and operator == '='
cond_out << "#{ar_table_name}.#{attr} is null"
param_out << operand
elsif operand.nil? and operator == '='
cond_out << "#{ar_table_name}.#{attr} is null"
+ elsif operand.nil? and operator == '!='
+ cond_out << "#{ar_table_name}.#{attr} is not null"
else
raise ArgumentError.new("Invalid operand type '#{operand.class}' "\
"for '#{operator}' operator in filters")
end
else
raise ArgumentError.new("Invalid operand type '#{operand.class}' "\
"for '#{operator}' operator in filters")
end
- when 'in'
+ when 'in'
, 'not in'
if operand.is_a? Array
if operand.is_a? Array
- cond_out << "#{ar_table_name}.#{attr}
IN
(?)"
+ cond_out << "#{ar_table_name}.#{attr}
#{operator}
(?)"
param_out << operand
param_out << operand
+ if operator == 'not in' and not operand.include?(nil)
+ # explicitly allow NULL
+ cond_out[-1] = "(#{cond_out[-1]} OR #{ar_table_name}.#{attr} IS NULL)"
+ end
else
raise ArgumentError.new("Invalid operand type '#{operand.class}' "\
"for '#{operator}' operator in filters")
else
raise ArgumentError.new("Invalid operand type '#{operand.class}' "\
"for '#{operator}' operator in filters")