searchlogic 2.4.19 → 2.4.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.yml +2 -2
- data/lib/searchlogic/named_scopes/alias_scope.rb +1 -1
- data/lib/searchlogic/named_scopes/conditions.rb +30 -27
- data/lib/searchlogic/named_scopes/or_conditions.rb +1 -1
- data/lib/searchlogic/rails_helpers.rb +5 -2
- data/lib/searchlogic/search.rb +4 -0
- data/searchlogic.gemspec +4 -4
- data/spec/searchlogic/named_scopes/alias_scope_spec.rb +5 -1
- data/spec/searchlogic/named_scopes/conditions_spec.rb +1 -1
- data/spec/searchlogic/search_spec.rb +8 -0
- data/spec/spec_helper.rb +11 -11
- metadata +11 -4
data/VERSION.yml
CHANGED
@@ -47,7 +47,7 @@ module Searchlogic
|
|
47
47
|
alias_method :scope_procedure, :alias_scope
|
48
48
|
|
49
49
|
def alias_scopes # :nodoc:
|
50
|
-
|
50
|
+
read_inheritable_attribute(:alias_scopes) || write_inheritable_attribute(:alias_scopes, {})
|
51
51
|
end
|
52
52
|
|
53
53
|
def alias_scope?(name) # :nodoc:
|
@@ -17,7 +17,7 @@ module Searchlogic
|
|
17
17
|
:greater_than => [:gt, :after],
|
18
18
|
:greater_than_or_equal_to => [:gte],
|
19
19
|
}
|
20
|
-
|
20
|
+
|
21
21
|
WILDCARD_CONDITIONS = {
|
22
22
|
:like => [:contains, :includes],
|
23
23
|
:not_like => [:does_not_include],
|
@@ -26,7 +26,7 @@ module Searchlogic
|
|
26
26
|
:ends_with => [:ew],
|
27
27
|
:not_end_with => [:does_not_end_with]
|
28
28
|
}
|
29
|
-
|
29
|
+
|
30
30
|
BOOLEAN_CONDITIONS = {
|
31
31
|
:null => [:nil],
|
32
32
|
:not_null => [:not_nil],
|
@@ -34,41 +34,41 @@ module Searchlogic
|
|
34
34
|
:blank => [],
|
35
35
|
:not_blank => [:present]
|
36
36
|
}
|
37
|
-
|
37
|
+
|
38
38
|
CONDITIONS = {}
|
39
|
-
|
39
|
+
|
40
40
|
# Add any / all variations to every comparison and wildcard condition
|
41
41
|
COMPARISON_CONDITIONS.merge(WILDCARD_CONDITIONS).each do |condition, aliases|
|
42
42
|
CONDITIONS[condition] = aliases
|
43
43
|
CONDITIONS["#{condition}_any".to_sym] = aliases.collect { |a| "#{a}_any".to_sym }
|
44
44
|
CONDITIONS["#{condition}_all".to_sym] = aliases.collect { |a| "#{a}_all".to_sym }
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
CONDITIONS[:equals_any] = CONDITIONS[:equals_any] + [:in]
|
48
48
|
CONDITIONS[:does_not_equal_all] = CONDITIONS[:does_not_equal_all] + [:not_in]
|
49
|
-
|
49
|
+
|
50
50
|
BOOLEAN_CONDITIONS.each { |condition, aliases| CONDITIONS[condition] = aliases }
|
51
|
-
|
51
|
+
|
52
52
|
PRIMARY_CONDITIONS = CONDITIONS.keys
|
53
53
|
ALIAS_CONDITIONS = CONDITIONS.values.flatten
|
54
|
-
|
54
|
+
|
55
55
|
# Is the name of the method a valid condition that can be dynamically created?
|
56
56
|
def condition?(name)
|
57
57
|
local_condition?(name)
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
private
|
61
61
|
def local_condition?(name)
|
62
62
|
return false if name.blank?
|
63
63
|
scope_names = scopes.keys.reject { |k| k == :scoped }
|
64
64
|
scope_names.include?(name.to_sym) || !condition_details(name).nil? || boolean_condition?(name)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def boolean_condition?(name)
|
68
68
|
column = columns_hash[name.to_s] || columns_hash[name.to_s.gsub(/^not_/, "")]
|
69
69
|
column && column.type == :boolean
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def method_missing(name, *args, &block)
|
73
73
|
if details = condition_details(name)
|
74
74
|
create_condition(details[:column], details[:condition], args)
|
@@ -81,8 +81,8 @@ module Searchlogic
|
|
81
81
|
super
|
82
82
|
end
|
83
83
|
end
|
84
|
-
|
85
|
-
|
84
|
+
|
85
|
+
|
86
86
|
def condition_details(method_name)
|
87
87
|
column_name_matcher = column_names.join("|")
|
88
88
|
conditions_matcher = (PRIMARY_CONDITIONS + ALIAS_CONDITIONS).join("|")
|
@@ -91,7 +91,7 @@ module Searchlogic
|
|
91
91
|
{:column => $1, :condition => $2}
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
def create_condition(column, condition, args)
|
96
96
|
if PRIMARY_CONDITIONS.include?(condition.to_sym)
|
97
97
|
create_primary_condition(column, condition)
|
@@ -99,12 +99,12 @@ module Searchlogic
|
|
99
99
|
create_alias_condition(column, condition, args)
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
def create_primary_condition(column, condition)
|
104
104
|
column_type = columns_hash[column.to_s].type
|
105
105
|
skip_conversion = skip_time_zone_conversion_for_attributes.include?(columns_hash[column.to_s].name.to_sym)
|
106
106
|
match_keyword = ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
|
107
|
-
|
107
|
+
|
108
108
|
scope_options = case condition.to_s
|
109
109
|
when /^equals/
|
110
110
|
scope_options(condition, column_type, lambda { |a| attribute_condition("#{table_name}.#{column}", a) }, :skip_conversion => skip_conversion)
|
@@ -141,10 +141,10 @@ module Searchlogic
|
|
141
141
|
when "not_blank"
|
142
142
|
{:conditions => "#{table_name}.#{column} != '' AND #{table_name}.#{column} IS NOT NULL"}
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
named_scope("#{column}_#{condition}".to_sym, scope_options)
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
# This method helps cut down on defining scope options for conditions that allow *_any or *_all conditions.
|
149
149
|
# Kepp in mind that the lambdas get cached in a method, so you want to keep the contents of the lambdas as
|
150
150
|
# fast as possible, which is why I didn't do the case statement inside of the lambda.
|
@@ -152,15 +152,18 @@ module Searchlogic
|
|
152
152
|
case condition.to_s
|
153
153
|
when /_(any|all)$/
|
154
154
|
searchlogic_lambda(column_type, :skip_conversion => options[:skip_conversion]) { |*values|
|
155
|
-
|
156
|
-
|
157
|
-
|
155
|
+
unless values.empty?
|
156
|
+
values.flatten!
|
157
|
+
values.collect! { |value| value_with_modifier(value, options[:value_modifier]) }
|
158
158
|
|
159
|
-
|
159
|
+
join = $1 == "any" ? " OR " : " AND "
|
160
160
|
|
161
|
-
|
161
|
+
scope_sql = values.collect { |value| sql.is_a?(Proc) ? sql.call(value) : sql }.join(join)
|
162
162
|
|
163
|
-
|
163
|
+
{:conditions => [scope_sql, *expand_range_bind_variables(values)]}
|
164
|
+
else
|
165
|
+
{}
|
166
|
+
end
|
164
167
|
}
|
165
168
|
else
|
166
169
|
searchlogic_lambda(column_type, :skip_conversion => options[:skip_conversion]) { |*values|
|
@@ -172,7 +175,7 @@ module Searchlogic
|
|
172
175
|
}
|
173
176
|
end
|
174
177
|
end
|
175
|
-
|
178
|
+
|
176
179
|
def value_with_modifier(value, modifier)
|
177
180
|
case modifier
|
178
181
|
when :like
|
@@ -185,7 +188,7 @@ module Searchlogic
|
|
185
188
|
value
|
186
189
|
end
|
187
190
|
end
|
188
|
-
|
191
|
+
|
189
192
|
def create_alias_condition(column, condition, args)
|
190
193
|
primary_condition = primary_condition(condition)
|
191
194
|
alias_name = "#{column}_#{condition}"
|
@@ -193,7 +196,7 @@ module Searchlogic
|
|
193
196
|
send(primary_name, *args) # go back to method_missing and make sure we create the method
|
194
197
|
(class << self; self; end).class_eval { alias_method alias_name, primary_name }
|
195
198
|
end
|
196
|
-
|
199
|
+
|
197
200
|
# Returns the primary condition for the given alias. Ex:
|
198
201
|
#
|
199
202
|
# primary_condition(:gt) => :greater_than
|
@@ -44,6 +44,9 @@ module Searchlogic
|
|
44
44
|
url_options = {
|
45
45
|
options[:params_scope] => search.conditions.merge( { :order => new_scope } )
|
46
46
|
}.deep_merge(options[:params] || {})
|
47
|
+
|
48
|
+
options[:as] = raw(options[:as]) if defined?(RailsXss)
|
49
|
+
|
47
50
|
link_to options[:as], url_for(url_options), html_options
|
48
51
|
end
|
49
52
|
|
@@ -60,8 +63,8 @@ module Searchlogic
|
|
60
63
|
end
|
61
64
|
super
|
62
65
|
end
|
63
|
-
|
64
|
-
# Automatically adds an "order" hidden field in your form to preserve how the data
|
66
|
+
|
67
|
+
# Automatically adds an "order" hidden field in your form to preserve how the data
|
65
68
|
# is being ordered.
|
66
69
|
def fields_for(*args, &block)
|
67
70
|
if search_obj = args.find { |arg| arg.is_a?(Searchlogic::Search) }
|
data/lib/searchlogic/search.rb
CHANGED
data/searchlogic.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{searchlogic}
|
8
|
-
s.version = "2.4.
|
8
|
+
s.version = "2.4.21"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Johnson of Binary Logic"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-07-25}
|
13
13
|
s.description = %q{Searchlogic makes using ActiveRecord named scopes easier and less repetitive.}
|
14
14
|
s.email = %q{bjohnson@binarylogic.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -56,7 +56,7 @@ Gem::Specification.new do |s|
|
|
56
56
|
s.rdoc_options = ["--charset=UTF-8"]
|
57
57
|
s.require_paths = ["lib"]
|
58
58
|
s.rubyforge_project = %q{searchlogic}
|
59
|
-
s.rubygems_version = %q{1.3.
|
59
|
+
s.rubygems_version = %q{1.3.7}
|
60
60
|
s.summary = %q{Searchlogic makes using ActiveRecord named scopes easier and less repetitive.}
|
61
61
|
s.test_files = [
|
62
62
|
"spec/searchlogic/active_record/association_proxy_spec.rb",
|
@@ -77,7 +77,7 @@ Gem::Specification.new do |s|
|
|
77
77
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
78
78
|
s.specification_version = 3
|
79
79
|
|
80
|
-
if Gem::Version.new(Gem::
|
80
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
81
81
|
s.add_runtime_dependency(%q<activerecord>, [">= 2.0.0"])
|
82
82
|
else
|
83
83
|
s.add_dependency(%q<activerecord>, [">= 2.0.0"])
|
@@ -16,4 +16,8 @@ describe Searchlogic::NamedScopes::AliasScope do
|
|
16
16
|
search.username_has = "bjohnson"
|
17
17
|
search.username_has.should == "bjohnson"
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
|
+
it "should inherit alias scopes from superclasses" do
|
21
|
+
Class.new(User).alias_scope?("username_has").should be_true
|
22
|
+
end
|
23
|
+
end
|
@@ -115,7 +115,7 @@ describe Searchlogic::NamedScopes::Conditions do
|
|
115
115
|
it "should do nothing if no arguments are passed" do
|
116
116
|
User.username_equals_any.proxy_options.should == {}
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
it "should treat an array and multiple arguments the same" do
|
120
120
|
%w(bjohnson thunt dgainor).each { |username| User.create(:username => username) }
|
121
121
|
User.username_like_any("bjohnson", "thunt").should == User.username_like_any(["bjohnson", "thunt"])
|
@@ -102,6 +102,14 @@ describe Searchlogic::Search do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
+
context "#compact_conditions" do
|
106
|
+
it "should remove conditions with blank values" do
|
107
|
+
search = User.search
|
108
|
+
search.conditions = {"id_equals" => "", "name_equals" => "Ben"}
|
109
|
+
search.compact_conditions.should == {:name_equals => "Ben"}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
105
113
|
context "condition accessors" do
|
106
114
|
it "should allow setting exact columns individually" do
|
107
115
|
search = User.search
|
data/spec/spec_helper.rb
CHANGED
@@ -82,20 +82,20 @@ require 'searchlogic'
|
|
82
82
|
|
83
83
|
Spec::Runner.configure do |config|
|
84
84
|
config.before(:each) do
|
85
|
-
class Audit < ActiveRecord::Base
|
85
|
+
class ::Audit < ActiveRecord::Base
|
86
86
|
belongs_to :auditable, :polymorphic => true
|
87
87
|
end
|
88
88
|
|
89
|
-
class Company < ActiveRecord::Base
|
89
|
+
class ::Company < ActiveRecord::Base
|
90
90
|
has_many :orders, :through => :users
|
91
91
|
has_many :users, :dependent => :destroy
|
92
92
|
end
|
93
93
|
|
94
|
-
class UserGroup < ActiveRecord::Base
|
94
|
+
class ::UserGroup < ActiveRecord::Base
|
95
95
|
has_and_belongs_to_many :users
|
96
96
|
end
|
97
97
|
|
98
|
-
class User < ActiveRecord::Base
|
98
|
+
class ::User < ActiveRecord::Base
|
99
99
|
belongs_to :company, :counter_cache => true
|
100
100
|
has_many :orders, :dependent => :destroy
|
101
101
|
has_many :orders_big, :class_name => 'Order', :conditions => 'total > 100'
|
@@ -104,23 +104,23 @@ Spec::Runner.configure do |config|
|
|
104
104
|
self.skip_time_zone_conversion_for_attributes = [:whatever_at]
|
105
105
|
end
|
106
106
|
|
107
|
-
class Order < ActiveRecord::Base
|
107
|
+
class ::Order < ActiveRecord::Base
|
108
108
|
belongs_to :user
|
109
109
|
has_many :line_items, :dependent => :destroy
|
110
110
|
end
|
111
111
|
|
112
|
-
class Fee < ActiveRecord::Base
|
112
|
+
class ::Fee < ActiveRecord::Base
|
113
113
|
belongs_to :owner, :polymorphic => true
|
114
114
|
end
|
115
115
|
|
116
|
-
class LineItem < ActiveRecord::Base
|
116
|
+
class ::LineItem < ActiveRecord::Base
|
117
117
|
belongs_to :order
|
118
118
|
end
|
119
119
|
|
120
|
-
Company.destroy_all
|
121
|
-
User.destroy_all
|
122
|
-
Order.destroy_all
|
123
|
-
LineItem.destroy_all
|
120
|
+
::Company.destroy_all
|
121
|
+
::User.destroy_all
|
122
|
+
::Order.destroy_all
|
123
|
+
::LineItem.destroy_all
|
124
124
|
end
|
125
125
|
|
126
126
|
config.after(:each) do
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchlogic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 53
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 2
|
7
8
|
- 4
|
8
|
-
-
|
9
|
-
version: 2.4.
|
9
|
+
- 21
|
10
|
+
version: 2.4.21
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Ben Johnson of Binary Logic
|
@@ -14,16 +15,18 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-
|
18
|
+
date: 2010-07-25 00:00:00 -04:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: activerecord
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
27
30
|
segments:
|
28
31
|
- 2
|
29
32
|
- 0
|
@@ -85,23 +88,27 @@ rdoc_options:
|
|
85
88
|
require_paths:
|
86
89
|
- lib
|
87
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
88
92
|
requirements:
|
89
93
|
- - ">="
|
90
94
|
- !ruby/object:Gem::Version
|
95
|
+
hash: 3
|
91
96
|
segments:
|
92
97
|
- 0
|
93
98
|
version: "0"
|
94
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
95
101
|
requirements:
|
96
102
|
- - ">="
|
97
103
|
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
98
105
|
segments:
|
99
106
|
- 0
|
100
107
|
version: "0"
|
101
108
|
requirements: []
|
102
109
|
|
103
110
|
rubyforge_project: searchlogic
|
104
|
-
rubygems_version: 1.3.
|
111
|
+
rubygems_version: 1.3.7
|
105
112
|
signing_key:
|
106
113
|
specification_version: 3
|
107
114
|
summary: Searchlogic makes using ActiveRecord named scopes easier and less repetitive.
|