lib/philtre/predicates.rb in philtre-0.1.0 vs lib/philtre/predicates.rb in philtre-0.1.1
- old
+ new
@@ -58,16 +58,19 @@
# The main interface from Filter#to_expr
alias [] call
def predicate_names
- DefaultPredicates.instance_methods
+ # ruby-2.3 no longer stores methods in order of definition. So sort by
+ # longest so that we don't get false positives from shorter predicates
+ # that are substrings of longer predicates, eg blank matching
+ # thing_not_blank.
+ DefaultPredicates.instance_methods.sort_by{|name| -name.length}
end
# Define the set of default predicates.
DefaultPredicates = PredicateDsl.new do
- # longer suffixes first, so they match first in define_name_predicate
not_eq {|expr, val| ~Sequel.expr( expr => val) }
def not_like( expr, val )
Sequel.~(like expr, val)
end
@@ -76,17 +79,19 @@
def not_blank(expr, val)
Sequel.~(blank expr, val)
end
+ null {|expr,_| Sequel.expr(expr => nil)}
+ not_null {|expr,_| Sequel.~(Sequel.expr(expr => nil))}
+
def blank(expr, _)
is_nil = Sequel.expr(expr => nil)
is_empty = Sequel.expr(expr => '')
Sequel.| is_nil, is_empty
end
- # and now the shorter suffixes
eq {|expr, val| Sequel.expr( expr => val) }
gt {|expr, val| expr > val }
gte( :gteq ) {|expr, val| expr >= val }
lt {|expr, val| expr < val }
lte( :lteq ) {|expr, val| expr <= val }
@@ -101,9 +106,9 @@
exprs = Array(arg).map {|value| like expr, value }
Sequel.| *exprs
end
end
- # make the available to Predicates instances.
+ # make them available to Predicate instances.
include DefaultPredicates
end
end