lib/ransack/constants.rb in ransack-3.2.1 vs lib/ransack/constants.rb in ransack-4.0.0

- old
+ new

@@ -45,7 +45,132 @@ NOT_EQ_ALL = 'not_eq_all'.freeze CONT = 'cont'.freeze RANSACK_SLASH_SEARCHES = 'ransack/searches'.freeze RANSACK_SLASH_SEARCHES_SLASH_SEARCH = 'ransack/searches/search'.freeze + + DISTINCT = 'DISTINCT '.freeze + + DERIVED_PREDICATES = [ + [CONT, { + arel_predicate: 'matches'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v)}%" } + } + ], + ['not_cont'.freeze, { + arel_predicate: 'does_not_match'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v)}%" } + } + ], + ['i_cont'.freeze, { + arel_predicate: 'matches'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v.downcase)}%" }, + case_insensitive: true + } + ], + ['not_i_cont'.freeze, { + arel_predicate: 'does_not_match'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v.downcase)}%" }, + case_insensitive: true + } + ], + ['start'.freeze, { + arel_predicate: 'matches'.freeze, + formatter: proc { |v| "#{escape_wildcards(v)}%" } + } + ], + ['not_start'.freeze, { + arel_predicate: 'does_not_match'.freeze, + formatter: proc { |v| "#{escape_wildcards(v)}%" } + } + ], + ['end'.freeze, { + arel_predicate: 'matches'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v)}" } + } + ], + ['not_end'.freeze, { + arel_predicate: 'does_not_match'.freeze, + formatter: proc { |v| "%#{escape_wildcards(v)}" } + } + ], + ['true'.freeze, { + arel_predicate: proc { |v| v ? EQ : NOT_EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| true } + } + ], + ['not_true'.freeze, { + arel_predicate: proc { |v| v ? NOT_EQ : EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| true } + } + ], + ['false'.freeze, { + arel_predicate: proc { |v| v ? EQ : NOT_EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| false } + } + ], + ['not_false'.freeze, { + arel_predicate: proc { |v| v ? NOT_EQ : EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| false } + } + ], + ['present'.freeze, { + arel_predicate: proc { |v| v ? NOT_EQ_ALL : EQ_ANY }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| [nil, ''.freeze].freeze } + } + ], + ['blank'.freeze, { + arel_predicate: proc { |v| v ? EQ_ANY : NOT_EQ_ALL }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| [nil, ''.freeze].freeze } + } + ], + ['null'.freeze, { + arel_predicate: proc { |v| v ? EQ : NOT_EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| nil } + } + ], + ['not_null'.freeze, { + arel_predicate: proc { |v| v ? NOT_EQ : EQ }, + compounds: false, + type: :boolean, + validator: proc { |v| BOOLEAN_VALUES.include?(v) }, + formatter: proc { |v| nil } } + ] + ].freeze + + module_function + # replace % \ to \% \\ + def escape_wildcards(unescaped) + case ActiveRecord::Base.connection.adapter_name + when "Mysql2".freeze + # Necessary for MySQL + unescaped.to_s.gsub(/([\\%_])/, '\\\\\\1') + when "PostgreSQL".freeze + # Necessary for PostgreSQL + unescaped.to_s.gsub(/([\\%_.])/, '\\\\\\1') + else + unescaped + end + end end end