searchlogic 1.6.1 → 1.6.2

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/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,7 @@
1
+ == 1.6.2 released 2008-12-13
2
+
3
+ * Remove duplicate joins at a lower level for a cleaner and less brittle approach.
4
+
1
5
  == 1.6.1 released 2008-12-8
2
6
 
3
7
  * Group multi faceted conditions since we allow for the mix of "and" and "or"
@@ -104,6 +104,47 @@ module Searchlogic
104
104
  end
105
105
 
106
106
  private
107
+ def construct_finder_sql_with_included_associations_with_searchlogic(*args)
108
+ sql = construct_finder_sql_with_included_associations_without_searchlogic(*args)
109
+ remove_duplicate_joins(sql)
110
+ end
111
+
112
+ def construct_finder_sql_with_searchlogic(*args)
113
+ sql = construct_finder_sql_without_searchlogic(*args)
114
+ remove_duplicate_joins(sql)
115
+ end
116
+
117
+ def construct_calculation_sql_with_searchlogic(*args)
118
+ sql = construct_calculation_sql_without_searchlogic(*args)
119
+ remove_duplicate_joins(sql)
120
+ end
121
+
122
+ def remove_duplicate_joins(sql)
123
+ join_expr = /(LEFT OUTER JOIN|INNER JOIN)/i
124
+ sql_parts = sql.split(join_expr)
125
+ if !sql_parts.empty?
126
+ last_parts = sql_parts.pop.split(/ (?!ON|AS)([A-Z]+) /)
127
+ sql_parts += last_parts
128
+ is_join_statement = false
129
+ cleaned_parts = []
130
+ sql_parts.each do |part|
131
+ part = part.strip
132
+ if is_join_statement
133
+ if !cleaned_parts.include?(part)
134
+ cleaned_parts << part
135
+ else
136
+ cleaned_parts.pop
137
+ end
138
+ else
139
+ cleaned_parts << part
140
+ end
141
+ is_join_statement = part =~ join_expr
142
+ end
143
+ sql = cleaned_parts.join(" ")
144
+ end
145
+ sql
146
+ end
147
+
107
148
  def filter_options_with_searchlogic(options = {}, searching = true)
108
149
  return options unless Searchlogic::Search::Base.needed?(self, options)
109
150
  search = Searchlogic::Search::Base.create_virtual_class(self).new # call explicitly to avoid merging the scopes into the search
@@ -153,6 +194,9 @@ module ActiveRecord #:nodoc: all
153
194
  class Base
154
195
  class << self
155
196
  alias_method_chain :calculate, :searchlogic
197
+ alias_method_chain :construct_finder_sql, :searchlogic
198
+ alias_method_chain :construct_finder_sql_with_included_associations, :searchlogic
199
+ alias_method_chain :construct_calculation_sql, :searchlogic
156
200
  alias_method_chain :find, :searchlogic
157
201
  alias_method_chain :with_scope, :searchlogic
158
202
  alias_method :new_search, :build_search
@@ -165,54 +209,6 @@ module ActiveRecord #:nodoc: all
165
209
  def valid_calculations_options
166
210
  Calculations::CALCULATIONS_OPTIONS
167
211
  end
168
-
169
- private
170
- # This is copied over from 2 different versions of ActiveRecord. I have to do this in order to preserve the "auto joins"
171
- # as symbols. Keeping them as symbols allows ActiveRecord to merge them properly. The problem is when they conflict with includes.
172
- # Includes add joins also, and they add them before joins do. So if they already added them skip them. Now you can do queries like:
173
- #
174
- # User.all(:joins => {:orders => :line_items}, :include => :orders)
175
- #
176
- # Where as before, the only way to get the above query to work would be to include line_items also, which is not neccessarily what you want.
177
- def add_joins!(sql, options_or_joins, scope = :auto) # :nodoc:
178
- code_type = (respond_to?(:array_of_strings?, true) && :array_of_strings) || (respond_to?(:merge_joins, true) && :merge_joins)
179
-
180
- case code_type
181
- when :array_of_strings, :merge_joins
182
- joins = options_or_joins
183
- scope = scope(:find) if :auto == scope
184
- merged_joins = scope && scope[:joins] && joins ? merge_joins(scope[:joins], joins) : (joins || scope && scope[:joins])
185
- case merged_joins
186
- when Symbol, Hash, Array
187
- if code_type == :array_of_strings && array_of_strings?(merged_joins)
188
- merged_joins.each { |merged_join| sql << " #{merged_join} " unless sql.include?(merged_join) }
189
- else
190
- join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, merged_joins, nil)
191
- join_dependency.join_associations.each do |assoc|
192
- join_sql = assoc.association_join
193
- sql << " #{join_sql} " unless sql.include?(join_sql)
194
- end
195
- end
196
- when String
197
- sql << " #{merged_joins} " if merged_joins && !sql.include?(merged_joins)
198
- end
199
- else
200
- options = options_or_joins
201
- scope = scope(:find) if :auto == scope
202
- [(scope && scope[:joins]), options[:joins]].each do |join|
203
- case join
204
- when Symbol, Hash, Array
205
- join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, join, nil)
206
- join_dependency.join_associations.each do |assoc|
207
- join_sql = assoc.association_join
208
- sql << " #{join_sql} " unless sql.include?(join_sql)
209
- end
210
- else
211
- sql << " #{join} " if join && !sql.include?(join)
212
- end
213
- end
214
- end
215
- end
216
212
  end
217
213
  end
218
214
  end
@@ -67,7 +67,7 @@ module Searchlogic
67
67
 
68
68
  MAJOR = 1
69
69
  MINOR = 6
70
- TINY = 1
70
+ TINY = 2
71
71
 
72
72
  # The current version as a Version instance
73
73
  CURRENT = new(MAJOR, MINOR, TINY)
data/searchlogic.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{searchlogic}
5
- s.version = "1.6.1"
5
+ s.version = "1.6.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Ben Johnson of Binary Logic"]
9
- s.date = %q{2008-12-11}
9
+ s.date = %q{2008-12-13}
10
10
  s.description = %q{Object based ActiveRecord searching, ordering, pagination, and more!}
11
11
  s.email = %q{bjohnson@binarylogic.com}
12
12
  s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/searchlogic/active_record/associations.rb", "lib/searchlogic/active_record/base.rb", "lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb", "lib/searchlogic/condition/base.rb", "lib/searchlogic/condition/begins_with.rb", "lib/searchlogic/condition/blank.rb", "lib/searchlogic/condition/child_of.rb", "lib/searchlogic/condition/descendant_of.rb", "lib/searchlogic/condition/ends_with.rb", "lib/searchlogic/condition/equals.rb", "lib/searchlogic/condition/greater_than.rb", "lib/searchlogic/condition/greater_than_or_equal_to.rb", "lib/searchlogic/condition/inclusive_descendant_of.rb", "lib/searchlogic/condition/keywords.rb", "lib/searchlogic/condition/less_than.rb", "lib/searchlogic/condition/less_than_or_equal_to.rb", "lib/searchlogic/condition/like.rb", "lib/searchlogic/condition/nested_set.rb", "lib/searchlogic/condition/nil.rb", "lib/searchlogic/condition/not_begin_with.rb", "lib/searchlogic/condition/not_blank.rb", "lib/searchlogic/condition/not_end_with.rb", "lib/searchlogic/condition/not_equal.rb", "lib/searchlogic/condition/not_have_keywords.rb", "lib/searchlogic/condition/not_like.rb", "lib/searchlogic/condition/not_nil.rb", "lib/searchlogic/condition/sibling_of.rb", "lib/searchlogic/conditions/any_or_all.rb", "lib/searchlogic/conditions/base.rb", "lib/searchlogic/conditions/groups.rb", "lib/searchlogic/conditions/magic_methods.rb", "lib/searchlogic/conditions/multiparameter_attributes.rb", "lib/searchlogic/conditions/protection.rb", "lib/searchlogic/config/helpers.rb", "lib/searchlogic/config/search.rb", "lib/searchlogic/config.rb", "lib/searchlogic/core_ext/hash.rb", "lib/searchlogic/core_ext/object.rb", "lib/searchlogic/helpers/control_types/link.rb", "lib/searchlogic/helpers/control_types/links.rb", "lib/searchlogic/helpers/control_types/remote_link.rb", "lib/searchlogic/helpers/control_types/remote_links.rb", "lib/searchlogic/helpers/control_types/remote_select.rb", "lib/searchlogic/helpers/control_types/select.rb", "lib/searchlogic/helpers/form.rb", "lib/searchlogic/helpers/utilities.rb", "lib/searchlogic/modifiers/absolute.rb", "lib/searchlogic/modifiers/acos.rb", "lib/searchlogic/modifiers/asin.rb", "lib/searchlogic/modifiers/atan.rb", "lib/searchlogic/modifiers/avg.rb", "lib/searchlogic/modifiers/base.rb", "lib/searchlogic/modifiers/ceil.rb", "lib/searchlogic/modifiers/char_length.rb", "lib/searchlogic/modifiers/cos.rb", "lib/searchlogic/modifiers/cot.rb", "lib/searchlogic/modifiers/count.rb", "lib/searchlogic/modifiers/day_of_month.rb", "lib/searchlogic/modifiers/day_of_week.rb", "lib/searchlogic/modifiers/day_of_year.rb", "lib/searchlogic/modifiers/degrees.rb", "lib/searchlogic/modifiers/exp.rb", "lib/searchlogic/modifiers/floor.rb", "lib/searchlogic/modifiers/hex.rb", "lib/searchlogic/modifiers/hour.rb", "lib/searchlogic/modifiers/log.rb", "lib/searchlogic/modifiers/log10.rb", "lib/searchlogic/modifiers/log2.rb", "lib/searchlogic/modifiers/lower.rb", "lib/searchlogic/modifiers/ltrim.rb", "lib/searchlogic/modifiers/md5.rb", "lib/searchlogic/modifiers/microseconds.rb", "lib/searchlogic/modifiers/milliseconds.rb", "lib/searchlogic/modifiers/minute.rb", "lib/searchlogic/modifiers/month.rb", "lib/searchlogic/modifiers/octal.rb", "lib/searchlogic/modifiers/radians.rb", "lib/searchlogic/modifiers/round.rb", "lib/searchlogic/modifiers/rtrim.rb", "lib/searchlogic/modifiers/second.rb", "lib/searchlogic/modifiers/sign.rb", "lib/searchlogic/modifiers/sin.rb", "lib/searchlogic/modifiers/square_root.rb", "lib/searchlogic/modifiers/sum.rb", "lib/searchlogic/modifiers/tan.rb", "lib/searchlogic/modifiers/trim.rb", "lib/searchlogic/modifiers/upper.rb", "lib/searchlogic/modifiers/week.rb", "lib/searchlogic/modifiers/year.rb", "lib/searchlogic/search/base.rb", "lib/searchlogic/search/conditions.rb", "lib/searchlogic/search/ordering.rb", "lib/searchlogic/search/pagination.rb", "lib/searchlogic/search/protection.rb", "lib/searchlogic/search/searching.rb", "lib/searchlogic/shared/utilities.rb", "lib/searchlogic/shared/virtual_classes.rb", "lib/searchlogic/version.rb", "lib/searchlogic.rb", "README.rdoc", "TODO.rdoc"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: searchlogic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Johnson of Binary Logic
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-11 00:00:00 -05:00
12
+ date: 2008-12-13 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency