2011-03-31 00:31:39 +00:00
|
|
|
module Ransack
|
|
|
|
module Constants
|
|
|
|
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
|
|
|
|
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
|
2014-05-12 14:59:37 +00:00
|
|
|
BOOLEAN_VALUES = TRUE_VALUES + FALSE_VALUES
|
2011-03-31 00:31:39 +00:00
|
|
|
|
2014-10-06 21:27:55 +00:00
|
|
|
AREL_PREDICATES = %w(
|
|
|
|
eq not_eq matches does_not_match lt lteq gt gteq in not_in
|
|
|
|
).freeze
|
|
|
|
|
|
|
|
EQ = 'eq'.freeze
|
|
|
|
NOT_EQ = 'not_eq'.freeze
|
|
|
|
EQ_ANY = 'eq_any'.freeze
|
|
|
|
NOT_EQ_ALL = 'not_eq_all'.freeze
|
2011-03-31 00:31:39 +00:00
|
|
|
|
|
|
|
DERIVED_PREDICATES = [
|
2014-10-06 21:27:55 +00:00
|
|
|
['cont'.freeze, {
|
|
|
|
:arel_predicate => 'matches'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}%" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['i_cont'.freeze, {
|
|
|
|
:arel_predicate => 'i_matches'.freeze,
|
2014-08-01 14:36:47 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}%" }
|
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_cont'.freeze, {
|
|
|
|
:arel_predicate => 'does_not_match'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}%" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['i_not_cont'.freeze, {
|
|
|
|
:arel_predicate => 'i_does_not_match'.freeze,
|
2014-08-01 14:36:47 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}%" }
|
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['start'.freeze, {
|
|
|
|
:arel_predicate => 'matches'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "#{escape_wildcards(v)}%" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_start'.freeze, {
|
|
|
|
:arel_predicate => 'does_not_match'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "#{escape_wildcards(v)}%" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['end'.freeze, {
|
|
|
|
:arel_predicate => 'matches'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_end'.freeze, {
|
|
|
|
:arel_predicate => 'does_not_match'.freeze,
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| "%#{escape_wildcards(v)}" }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['true'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? EQ : NOT_EQ },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-08-07 00:24:04 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
|
|
|
:formatter => proc { |v| true }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_true'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? NOT_EQ : EQ },
|
2014-08-27 00:50:47 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
|
|
|
:formatter => proc { |v| true }
|
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['false'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? EQ : NOT_EQ },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-08-07 00:24:04 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
|
|
|
:formatter => proc { |v| false }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_false'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? NOT_EQ : EQ },
|
2014-08-27 00:50:47 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
|
|
|
:formatter => proc { |v| false }
|
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['present'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? NOT_EQ_ALL : EQ_ANY },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-05-12 15:10:52 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
2014-10-06 21:27:55 +00:00
|
|
|
:formatter => proc { |v| [nil, EMPTY_STRING] }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['blank'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? EQ_ANY : NOT_EQ_ALL },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-05-12 15:10:52 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
2014-10-06 21:27:55 +00:00
|
|
|
:formatter => proc { |v| [nil, EMPTY_STRING] }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['null'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? EQ : NOT_EQ },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-05-12 14:59:37 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v)},
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| nil }
|
2013-08-04 13:13:41 +00:00
|
|
|
}
|
|
|
|
],
|
2014-10-06 21:27:55 +00:00
|
|
|
['not_null'.freeze, {
|
|
|
|
:arel_predicate => proc { |v| v ? NOT_EQ : EQ },
|
2014-05-01 13:55:39 +00:00
|
|
|
:compounds => false,
|
|
|
|
:type => :boolean,
|
2014-05-12 14:59:37 +00:00
|
|
|
:validator => proc { |v| BOOLEAN_VALUES.include?(v) },
|
2014-05-01 13:55:39 +00:00
|
|
|
:formatter => proc { |v| nil } }
|
2013-08-04 13:13:41 +00:00
|
|
|
]
|
2014-10-06 21:27:55 +00:00
|
|
|
].freeze
|
2012-11-26 04:39:40 +00:00
|
|
|
|
2014-05-01 13:55:39 +00:00
|
|
|
module_function
|
2012-12-18 04:52:44 +00:00
|
|
|
# replace % \ to \% \\
|
2012-11-26 04:39:40 +00:00
|
|
|
def escape_wildcards(unescaped)
|
2013-12-07 00:51:55 +00:00
|
|
|
case ActiveRecord::Base.connection.adapter_name
|
2014-10-06 21:27:55 +00:00
|
|
|
when "Mysql2".freeze, "PostgreSQL".freeze
|
2013-12-07 00:51:55 +00:00
|
|
|
# Necessary for PostgreSQL and MySQL
|
|
|
|
unescaped.to_s.gsub(/([\\|\%|.])/, '\\\\\\1')
|
2014-06-04 05:28:40 +00:00
|
|
|
else
|
|
|
|
unescaped
|
2013-12-07 00:51:55 +00:00
|
|
|
end
|
2012-11-26 04:39:40 +00:00
|
|
|
end
|
2011-03-31 00:31:39 +00:00
|
|
|
end
|
2012-12-18 04:52:44 +00:00
|
|
|
end
|