<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/searchlogic/conditions/any_or_all.rb</filename>
    </added>
    <added>
      <filename>lib/searchlogic/conditions/groups.rb</filename>
    </added>
    <added>
      <filename>lib/searchlogic/conditions/magic_methods.rb</filename>
    </added>
    <added>
      <filename>test/condition_tests/keywords_test.rb</filename>
    </added>
    <added>
      <filename>test/conditions_tests/any_or_all_test.rb</filename>
    </added>
    <added>
      <filename>test/conditions_tests/groups_test.rb</filename>
    </added>
    <added>
      <filename>test/conditions_tests/magic_methods_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,10 @@
+== 1.5.6 released 2008-11-17
+
+* The order conditions are set is now relevant and will be reflected in the SQL. Setting a condition first will make it first in the SQL, setting a condition last will make it last in the SQL.
+* The above allows for prefixing any condition with and_ or or_. Thus letting you create somewhat more complex queries, since the order matters.
+* Added ability to group conditions to mimic parenthesis in raw SQL.
+* Major clean up in the Searchlogic::Conditions name space: faster, smaller, cleaner, and modular.
+
 == 1.5.5 released 2008-11-17
 
 * Cleaned up class_name configuration for helpers, so that setting them to nil disables the class name</diff>
      <filename>CHANGELOG.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 = Searchlogic
 
-Searchlogic is object based ActiveRecord searching, ordering, and pagination all in one.
+Searchlogic is object based ActiveRecord searching, ordering, and pagination all in one. It's a simple, quick, all inclusive package for displaying data in your application.
 
 == Helpful links
 
@@ -178,17 +178,84 @@ Any of the options used in the above example can be used in these, but for the s
   search.per_page = 20
   search.all
   
+  search = User.new_search(:conditions =&gt; {:age_gt =&gt; 18}) do |s|
+    s.conditions.first_name_contains = &quot;Ben&quot;
+    s.per_page = 20
+  end
+  search.all
+  
 == Match ANY or ALL of the conditions
 
 As you saw above, the nice thing about Searchlogic is it's integration with forms. I designed the &quot;any&quot; option so that forms can set this as well, just like a condition.
 
-  @search = User.new_search(:conditions =&gt; {:age_gt =&gt; 18}) do |search|
-    search.conditions.first_name_contains = &quot;Ben&quot;
-    search.conditions.any = true # can set this to &quot;true&quot; or &quot;1&quot; or &quot;yes&quot;
-    search.all # will join all conditions with &quot;or&quot; instead of &quot;and&quot;
-  end
+  @search = User.new_search(:conditions =&gt; {:age_gt =&gt; 18})
+  @search.conditions.first_name_contains = &quot;Ben&quot;
+  @search.conditions.any = true # can set this to &quot;true&quot; or &quot;1&quot; or &quot;yes&quot;
+  @search.all # will join all conditions with &quot;or&quot; instead of &quot;and&quot;
   # ... all operations above are available
 
+What if you want to mix and match?
+
+  @search = User.new_search(:conditions =&gt; {:age_gt =&gt; 18})
+  @search.conditions.or_first_name_contains = &quot;Ben&quot;
+  @search.conditions.or_last_name_contains = &quot;Johnson&quot;
+  @search.conditions.and_id_gt = 5 # the and_ is optional, calling just id_gt is the same thing
+  @search.all # will join conditions in the orders they were set with their specified join condition
+  # =&gt; age &gt; 17 OR first_name like '%Ben%' OR lsat_name like '%Johnson%' AND id &gt; 5
+
+The order the conditions is set is relevant, as the SQL will be built in the same order.
+
+== Grouping conditions
+
+In more complex searching situations you might want to group conditions. Just like you use parenthesis in raw SQL. Searchlogic's &quot;group&quot; function is basically a way to implement parenthesis in your conditions. It's simple:
+
+Group off an object:
+
+  search = User.new_search
+  search.id_gt = 2
+  group1 = search.conditions.group
+  group.first_name_like = &quot;Ben&quot;
+  group2 = search.conditions.group
+  group.last_name_like = &quot;Johnson&quot;
+  group21 = group2.group
+  group21.email_ends_with = &quot;binarylogic.com&quot;
+  # =&gt; id &gt; 2 AND (first_name like '%Ben%') AND (last_name like '%Johnson%' AND (email like '%binarylogic.com'))
+  
+Group with a block:
+
+  search = User.new_search
+  search.id_gt = 2
+  search.conditions.group do |group|
+    group.first_name_like = &quot;Ben&quot;
+  end
+  search.conditions.group do |group|
+    group.last_name_like = &quot;Johnson&quot;
+    group.group do |sub_group|
+      sub_group.email_ends_with = &quot;binarylogic.com&quot;
+    end
+  end
+  # =&gt; id &gt; 2 AND (first_name like '%Ben%') AND (last_name like '%Johnson%' AND (email like '%binarylogic.com'))
+
+Group with a hash:
+
+  search = User.new_search(:conditions =&gt; {
+    :id_gt =&gt; 2,
+    :group =&gt; [
+      {:first_name_like =&gt; &quot;Ben&quot;},
+      {
+        :last_name_like =&gt; &quot;Johnson&quot;,
+        :group =&gt; {:email_ends_with =&gt; &quot;binarylogic.com&quot;}
+      }
+    ]
+  })
+  # =&gt; id &gt; 2 AND (first_name like '%Ben%') AND (last_name like '%Johnson%' AND (email like '%binarylogic.com'))
+
+I want to end this by saying Searchlog was never meant to replace SQL, name_scopes, etc. If you need to perform complex searching there is nothing wrong with resorting to a named scope or using the traditional search methods. In fact, search logic plays nice with named_scopes anyways, so you can combine the 2 if needed:
+
+  @search = User.my_awesome_scope.another_cool_scope.new_search
+
+The only reason I added this was to allow searchlogic to extend a little further into those advanced searches. If you need to scope conditions by using parenthesis, etc. you should resort to named_scopes or the traditional search method.
+
 == Scoped searching
 
   @current_user.orders.find(:all, :conditions =&gt; {:total_lte =&gt; 500})</diff>
      <filename>README.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,19 @@
 require 'rubygems'
-require 'echoe'
-
 require File.dirname(__FILE__) &lt;&lt; &quot;/lib/searchlogic/version&quot;
 
-Echoe.new 'searchlogic' do |p|
-  p.version = Searchlogic::Version::STRING
-  p.author = &quot;Ben Johnson of Binary Logic&quot;
-  p.email  = 'bjohnson@binarylogic.com'
-  p.project = 'searchlogic'
-  p.summary = &quot;Object based ActiveRecord searching, ordering, pagination, and more!&quot;
-  p.url = &quot;http://github.com/binarylogic/searchlogic&quot;
-  p.dependencies = %w(activerecord activesupport)
+begin
+  require 'echoe'
+
+  Echoe.new 'searchlogic' do |p|
+    p.version = Searchlogic::Version::STRING
+    p.author = &quot;Ben Johnson of Binary Logic&quot;
+    p.email  = 'bjohnson@binarylogic.com'
+    p.project = 'searchlogic'
+    p.summary = &quot;Object based ActiveRecord searching, ordering, pagination, and more!&quot;
+    p.url = &quot;http://github.com/binarylogic/searchlogic&quot;
+    p.dependencies = %w(activerecord activesupport)
+  end
+rescue LoadError =&gt; boom
+  puts &quot;You are missing a dependency required for meta-operations on this gem.&quot;
+  puts &quot;#{boom.to_s.capitalize}.&quot;
 end
\ No newline at end of file</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,9 @@ require &quot;searchlogic/search/base&quot;
 require &quot;searchlogic/search/protection&quot;
 
 # Conditions
+require &quot;searchlogic/conditions/any_or_all&quot;
+require &quot;searchlogic/conditions/groups&quot;
+require &quot;searchlogic/conditions/magic_methods&quot;
 require &quot;searchlogic/conditions/protection&quot;
 require &quot;searchlogic/conditions/base&quot;
 
@@ -76,6 +79,9 @@ module Searchlogic
   
   module Conditions
     class Base
+      include AnyOrAll
+      include Groups
+      include MagicMethods
       include Protection
     end
     </diff>
      <filename>lib/searchlogic.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ module Searchlogic
     class Base
       include Shared::Utilities
       
-      attr_accessor :column, :column_for_type_cast, :column_sql, :column_sql_format, :klass, :table_name
+      attr_accessor :any, :column, :column_for_type_cast, :column_sql, :column_sql_format, :klass, :object_name, :table_name
       class_inheritable_accessor :handle_array_value, :ignore_meaningless_value, :join_arrays_with_or, :value_type
       self.ignore_meaningless_value = true
     
@@ -61,6 +61,10 @@ module Searchlogic
         end
       end
       
+      def any? # :nodoc:
+        any == true
+      end
+      
       # Substitutes string vars with table and column name. Allows us to switch the column and table on the fly and have the condition update appropriately.
       # The table name could be variable depending on the condition. Take STI and more than one child model is used in the condition, the first gets the parent table name, the rest get aliases.
       def column_sql</diff>
      <filename>lib/searchlogic/condition/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,33 +8,9 @@ module Searchlogic
       include Shared::Utilities
       include Shared::VirtualClasses
       
-      attr_accessor :any, :relationship_name
+      attr_accessor :object_name
       
       class &lt;&lt; self
-        attr_accessor :added_klass_conditions, :added_column_equals_conditions, :added_associations
-        
-        def column_details # :nodoc:
-          return @column_details if @column_details
-          
-          @column_details = []
-          
-          klass.columns.each do |column|
-            column_detail = {:column =&gt; column}
-            column_detail[:aliases] = case column.type
-            when :datetime, :time, :timestamp
-              [column.name.gsub(/_at$/, &quot;&quot;)]
-            when :date
-              [column.name.gsub(/_at$/, &quot;&quot;)]
-            else
-              []
-            end
-            
-            @column_details &lt;&lt; column_detail
-          end
-          
-          @column_details
-        end
-        
         # Registers a condition as an available condition for a column or a class. MySQL supports a &quot;sounds like&quot; function. I want to use it, so let's add it.
         #
         # === Example
@@ -44,7 +20,7 @@ module Searchlogic
         #   class SoundsLike &lt; Searchlogic::Condition::Base
         #     # The name of the conditions. By default its the name of the class, if you want alternate or alias conditions just add them on.
         #     # If you don't want to add aliases you don't even need to define this method
-        #     def self.condition_names_for_column(column)
+        #     def self.condition_names_for_column
         #       super + [&quot;similar_to&quot;, &quot;sounds&quot;]
         #     end
         #
@@ -119,16 +95,6 @@ module Searchlogic
           @@modifiers ||= []
         end
         
-        # A list of all associations created, used for caching and performance
-        def association_names
-          @association_names ||= []
-        end
-        
-        # A list of all conditions available, users for caching and performance
-        def condition_names
-          @condition_names ||= []
-        end
-        
         def needed?(model_class, conditions) # :nodoc:
           return false if conditions.blank?
           
@@ -147,82 +113,49 @@ module Searchlogic
         end
       end
       
+      # Initializes a conditions object, accepts a hash of conditions as the single parameter
       def initialize(init_conditions = {})
-        add_associations!
-        add_column_equals_conditions!
         self.conditions = init_conditions
       end
       
-      # Determines if we should join the conditions with &quot;AND&quot; or &quot;OR&quot;.
-      #
-      # === Examples
-      #
-      #   search.conditions.any = true # will join all conditions with &quot;or&quot;, you can also set this to &quot;true&quot;, &quot;1&quot;, or &quot;yes&quot;
-      #   search.conditions.any = false # will join all conditions with &quot;and&quot;
-      def any=(value)
-        associations.each { |name, association| association.any = value }
-        @any = value
-      end
-      
-      def any # :nodoc:
-        any?
-      end
-      
-      # Convenience method for determining if we should join the conditions with &quot;AND&quot; or &quot;OR&quot;.
-      def any?
-        [&quot;true&quot;, &quot;1&quot;, &quot;yes&quot;].include? @any.to_s
-      end
-      
-      # Sets the conditions to be searched by &quot;or&quot;
-      def any!
-        any = true
-      end
-      
-      def all # :nodoc:
-        not any?
-      end
-      
-      # Sets the conditions to be searched by &quot;and&quot;
-      def all!
-        any = false
-      end
-      
       # A list of joins to use when searching, includes relationships
       def auto_joins
         j = []
-        associations.each do |name, association|
+        association_objects.each do |association|
           next if association.conditions.blank?
           association_joins = association.auto_joins
-          j &lt;&lt; (association_joins.blank? ? name : {name =&gt; association_joins})
+          j &lt;&lt; (association_joins.blank? ? association.object_name : {association.object_name =&gt; association_joins})
         end
         j.blank? ? nil : (j.size == 1 ? j.first : j)
       end
       
+      # Provides a much more informative and easier to understand inspection of the object
       def inspect
         &quot;#&lt;#{klass}Conditions#{conditions.blank? ? &quot;&quot; : &quot; #{conditions.inspect}&quot;}&gt;&quot;
       end
       
       # Sanitizes the conditions down into conditions that ActiveRecord::Base.find can understand.
       def sanitize
-        return @conditions if @conditions
-        merge_conditions(*(objects.collect { |name, object| object.sanitize } &lt;&lt; {:any =&gt; any}))
+        return @conditions if @conditions # return the conditions if the user set them with a string, aka sql conditions
+        joined_conditions = nil
+        objects.each { |object| joined_conditions = merge_conditions(joined_conditions, object.class == self.class ? scope_condition(object.sanitize) : object.sanitize, :any =&gt; object.any?, :scope =&gt; false) }
+        joined_conditions
       end
       
       # Allows you to set the conditions via a hash.
       def conditions=(value)
         case value
         when Hash
-          assert_valid_conditions(value)
           remove_conditions_from_protected_assignement(value).each do |condition, condition_value|
+            next if [:conditions].include?(condition.to_sym) # protect sensitive methods
             
             # delete all blanks from mass assignments, forms submit blanks, blanks are meaningless
             # equals condition thinks everything is meaningful, and arrays can be pased
             new_condition_value = nil
             case condition_value
             when Array
-              new_condition_value = []
-              condition_value.each { |v| new_condition_value &lt;&lt; v unless v == &quot;&quot; }
-              next if new_condition_value.size == 0
+              new_condition_value = condition_value.reject { |v| v == &quot;&quot; }
+              next if new_condition_value.empty?
               new_condition_value = new_condition_value.first if new_condition_value.size == 1
             else
               next if condition_value == &quot;&quot;
@@ -232,7 +165,7 @@ module Searchlogic
             send(&quot;#{condition}=&quot;, new_condition_value)
           end
         else
-          reset_objects!
+          reset!
           @conditions = value
         end
       end
@@ -240,249 +173,40 @@ module Searchlogic
       # All of the active conditions (conditions that have been set)
       def conditions
         return @conditions if @conditions
-        return if objects.blank?
         
         conditions_hash = {}
-        objects.each do |name, object|
-          if object.class &lt; Searchlogic::Conditions::Base
-            relationship_conditions = object.conditions
-            next if relationship_conditions.blank?
-            conditions_hash[name] = relationship_conditions
-          else
-            next if object.value_is_meaningless?
-            conditions_hash[name] = object.value
-          end
-        end
-        conditions_hash
-      end
-      
-      private
-        def add_associations!
-          return true if self.class.added_associations
-          
-          klass.reflect_on_all_associations.each do |association|
-            self.class.association_names &lt;&lt; association.name.to_s
-            
-            self.class.class_eval &lt;&lt;-&quot;end_eval&quot;, __FILE__, __LINE__
-              def #{association.name}
-                if objects[:#{association.name}].nil?
-                  objects[:#{association.name}] = Searchlogic::Conditions::Base.create_virtual_class(#{association.class_name}).new
-                  objects[:#{association.name}].relationship_name = &quot;#{association.name}&quot;
-                  objects[:#{association.name}].protect = protect
-                end
-                objects[:#{association.name}]
-              end
-            
-              def #{association.name}=(conditions); @conditions = nil; #{association.name}.conditions = conditions; end
-              def reset_#{association.name}!; objects.delete(:#{association.name}); end
-            end_eval
-          end
-          
-          self.class.added_associations = true
-        end
         
-        def add_column_equals_conditions!
-          return true if self.class.added_column_equals_conditions
-          klass.column_names.each { |name| setup_condition(name) }
-          self.class.added_column_equals_conditions = true
+        association_objects.each do |association_object|
+          relationship_conditions = association_object.conditions
+          next if relationship_conditions.blank?
+          conditions_hash[association_object.object_name] = relationship_conditions
         end
         
-        def extract_column_and_condition_from_method_name(name)
-          name_parts = name.gsub(&quot;=&quot;, &quot;&quot;).split(&quot;_&quot;)
-          
-          condition_parts = []
-          column = nil
-          while column.nil? &amp;&amp; name_parts.size &gt; 0
-            possible_column_name = name_parts.join(&quot;_&quot;)
-            
-            self.class.column_details.each do |column_detail|
-              if column_detail[:column].name == possible_column_name || column_detail[:aliases].include?(possible_column_name)
-                column = column_detail
-                break
-              end
-            end
-            
-            condition_parts &lt;&lt; name_parts.pop if !column
-          end
-          
-          return if column.nil?
-          
-          condition_name = condition_parts.reverse.join(&quot;_&quot;)
-          condition = nil
-          
-          # Find the real condition
-          self.class.conditions.each do |condition_klass|
-            if condition_klass.condition_names_for_column.include?(condition_name)
-              condition = condition_klass
-              break
-            end
-          end
-                                         
-          [column, condition]
+        condition_objects.each do |condition_object|
+          next if condition_object.value_is_meaningless?
+          conditions_hash[condition_object.object_name] = condition_object.value
         end
         
-        def breakdown_method_name(name)
-          column_detail, condition_klass = extract_column_and_condition_from_method_name(name)
-          if !column_detail.nil? &amp;&amp; !condition_klass.nil?
-            # There were no modifiers
-            return [[], column_detail, condition_klass]
-          else
-            # There might be modifiers
-            name_parts = name.split(&quot;_of_&quot;)
-            column_detail, condition_klass = extract_column_and_condition_from_method_name(name_parts.pop)
-            if !column_detail.nil? &amp;&amp; !condition_klass.nil?
-              # There were modifiers, lets get their real names
-              modifier_klasses = []
-              name_parts.each do |modifier_name|
-                size_before = modifier_klasses.size
-                self.class.modifiers.each do |modifier_klass|
-                  if modifier_klass.modifier_names.include?(modifier_name)
-                    modifier_klasses &lt;&lt; modifier_klass
-                    break
-                  end
-                end
-                return if modifier_klasses.size == size_before # there was an invalid modifer, return nil for everything and let it act as a nomethoderror
-              end
-              
-              return [modifier_klasses, column_detail, condition_klass]
-            end
-          end
-          
-          nil
-        end
-        
-        def build_method_name(modifier_klasses, column_name, condition_name)
-          modifier_name_parts = []
-          modifier_klasses.each { |modifier_klass| modifier_name_parts &lt;&lt; modifier_klass.modifier_names.first }
-          method_name_parts = []
-          method_name_parts &lt;&lt; modifier_name_parts.join(&quot;_of_&quot;) + &quot;_of&quot; unless modifier_name_parts.blank?
-          method_name_parts &lt;&lt; column_name
-          method_name_parts &lt;&lt; condition_name unless condition_name.blank?
-          method_name_parts.join(&quot;_&quot;).underscore
-        end
-        
-        def method_missing(name, *args, &amp;block)
-          if setup_condition(name)
-            send(name, *args, &amp;block)
-          else
-            super
-          end
-        end
-        
-        def setup_condition(name)
-          modifier_klasses, column_detail, condition_klass = breakdown_method_name(name.to_s)
-          if !column_detail.nil? &amp;&amp; !condition_klass.nil?
-            method_name = build_method_name(modifier_klasses, column_detail[:column].name, condition_klass.condition_names_for_column.first)
-            
-            if !added_condition?(method_name)
-              column_type = column_sql = nil
-              if !modifier_klasses.blank?
-                # Find the column type
-                column_type = modifier_klasses.first.return_type
-              
-                # Build the column sql
-                column_sql = &quot;{table}.{column}&quot;
-                modifier_klasses.each do |modifier_klass|
-                  next unless klass.connection.respond_to?(modifier_klass.adapter_method_name)
-                  column_sql = klass.connection.send(modifier_klass.adapter_method_name, column_sql)
-                end
-              end
-            
-              add_condition!(condition_klass, method_name, :column =&gt; column_detail[:column], :column_type =&gt; column_type, :column_sql_format =&gt; column_sql)
-            
-              ([column_detail[:column].name] + column_detail[:aliases]).each do |column_name|
-                condition_klass.condition_names_for_column.each do |condition_name|
-                  alias_method_name = build_method_name(modifier_klasses, column_name, condition_name)
-                  add_condition_alias!(alias_method_name, method_name) unless added_condition?(alias_method_name)
-                end
-              end
-            end
-            
-            alias_method_name = name.to_s.gsub(&quot;=&quot;, &quot;&quot;)
-            add_condition_alias!(alias_method_name, method_name) unless added_condition?(alias_method_name)
-            
-            return true
-          end
-          
-          false
-        end
-        
-        def add_condition!(condition, name, options = {})
-          self.class.condition_names &lt;&lt; name
-          options[:column] = options[:column].name
-          
-          self.class.class_eval &lt;&lt;-&quot;end_eval&quot;, __FILE__, __LINE__
-            def #{name}_object
-              if objects[:#{name}].nil?
-                options = {}
-                objects[:#{name}] = #{condition.name}.new(klass, #{options.inspect})
-              end
-              objects[:#{name}]
-            end
-
-            def #{name}; #{name}_object.value; end
-            
-            def #{name}=(value)
-              @conditions = nil
-              
-              #{name}_object.value = value
-              reset_#{name}! if #{name}_object.value_is_meaningless?
-              value
-            end
-            
-            def reset_#{name}!; objects.delete(:#{name}); end
-          end_eval
-        end
-        
-        def added_condition?(name)
-          respond_to?(&quot;#{name}_object&quot;) &amp;&amp; respond_to?(name) &amp;&amp; respond_to?(&quot;#{name}=&quot;) &amp;&amp; respond_to?(&quot;reset_#{name}!&quot;)
-        end
-        
-        def add_condition_alias!(alias_name, name)
-          self.class.condition_names &lt;&lt; alias_name
-          
-          self.class.class_eval do
-            alias_method &quot;#{alias_name}_object&quot;, &quot;#{name}_object&quot;
-            alias_method alias_name, name
-            alias_method &quot;#{alias_name}=&quot;, &quot;#{name}=&quot;
-            alias_method &quot;reset_#{alias_name}!&quot;, &quot;reset_#{name}!&quot;
-          end
-        end
-        
-        def assert_valid_conditions(conditions)
-          conditions.each do |condition, value|
-            next if (self.class.condition_names + self.class.association_names + [&quot;any&quot;]).include?(condition.to_s)
-            
-            go_to_next = false
-            self.class.column_details.each do |column_detail|
-              if column_detail[:column].name == condition.to_s || column_detail[:aliases].include?(condition.to_s)
-                go_to_next = true
-                break
-              end
-            end
-            next if go_to_next
-            
-            next unless respond_to?(condition)
-            
-            raise(ArgumentError, &quot;The #{condition} condition is not a valid condition&quot;)
-          end
+        conditions_hash
+      end
+      
+      # Resets all of the conditions, including conditions set on associations
+      def reset!
+        objects.each { |object| eval(&quot;@#{object.object_name} = nil&quot;) }
+        objects.clear
+      end
+      
+      private
+        def association_objects
+          objects.select { |object| object.class &lt; Base &amp;&amp; object.class != self.class }
         end
         
-        def associations
-          associations = {}
-          objects.each do |name, object|
-            associations[name] = object if object.class &lt; ::Searchlogic::Conditions::Base
-          end
-          associations
+        def condition_objects
+          objects.select { |object| object.class &lt; Condition::Base }
         end
         
         def objects
-          @objects ||= {}
-        end
-        
-        def reset_objects!
-          objects.each { |name, object| eval(&quot;@#{name} = nil&quot;) }
-          objects.clear
+          @objects ||= []
         end
         
         def remove_conditions_from_protected_assignement(conditions)</diff>
      <filename>lib/searchlogic/conditions/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@ module Searchlogic
       end
       
       def protect=(value)
-        associations.each { |name, obj| obj.protect = value }
+        association_objects.each { |obj| obj.protect = value }
         @protect = value
       end
       </diff>
      <filename>lib/searchlogic/conditions/protection.rb</filename>
    </modified>
    <modified>
      <diff>@@ -70,7 +70,7 @@ module Searchlogic
             when String, Symbol
               args.unshift(search_object).unshift(first)
             else
-              name = search_object.is_a?(Conditions::Base) ? (search_object.relationship_name || :conditions) : :search
+              name = search_object.is_a?(Conditions::Base) ? (search_object.object_name || :conditions) : :search
               args.unshift(search_object).unshift(name)
             end
             </diff>
      <filename>lib/searchlogic/helpers/form.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@ module Searchlogic
           conditions.delete_if { |condition| condition.blank? }
           return if conditions.blank?
           return conditions.first if conditions.size == 1
+          options[:scope] = true unless options.key?(:scope)
         
           conditions_strs = []
           conditions_subs = []
@@ -20,14 +21,20 @@ module Searchlogic
         
           return if conditions_strs.blank?
         
-          join = options[:any] ? &quot;OR&quot; : &quot;AND&quot;
-          conditions_str = &quot;(#{conditions_strs.join(&quot;) #{join} (&quot;)})&quot;
+          join = options[:any] ? &quot; OR &quot; : &quot; AND &quot;
+          conditions_str = options[:scope] ? &quot;(#{conditions_strs.join(&quot;)#{join}(&quot;)})&quot; : conditions_strs.join(join)
         
           return conditions_str if conditions_subs.blank?
         
           [conditions_str, *conditions_subs]
         end
         
+        def scope_condition(condition)
+          arr_condition = condition.is_a?(Array) ? condition : [condition]
+          arr_condition[0] = &quot;(#{arr_condition[0]})&quot;
+          arr_condition.size == 1 ? arr_condition.first : arr_condition
+        end
+        
         def merge_joins(*joins)
           joins.delete_if { |join| join.blank? }
           return if joins.blank?</diff>
      <filename>lib/searchlogic/shared/utilities.rb</filename>
    </modified>
    <modified>
      <diff>@@ -67,7 +67,7 @@ module Searchlogic
 
     MAJOR = 1
     MINOR = 5
-    TINY  = 5
+    TINY  = 6
 
     # The current version as a Version instance
     CURRENT = new(MAJOR, MINOR, TINY)</diff>
      <filename>lib/searchlogic/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ module ActiveRecordTests
       binary_logic = accounts(:binary_logic)
       neco = accounts(:neco)
       binary_fun = accounts(:binary_fun)
-
+      
       assert_equal [binary_logic, binary_fun, neco], Account.all
       assert_equal binary_logic, Account.first
       
@@ -19,7 +19,7 @@ module ActiveRecordTests
       assert_equal [binary_logic, binary_fun, neco], Account.find(:all, {})
       assert_equal [binary_logic, binary_fun, neco], Account.find(:all, :select =&gt; &quot;id, name&quot;)
     end
-  
+    
     def test_standard_calculations
       binary_logic = accounts(:binary_logic)
       neco = accounts(:neco)
@@ -35,12 +35,12 @@ module ActiveRecordTests
       assert_equal neco.id, Account.maximum(&quot;id&quot;)
       assert_equal binary_logic.id, Account.minimum(&quot;id&quot;)
     end
-  
+    
     def test_valid_ar_options
       assert_equal [:conditions, :include, :joins, :limit, :offset, :order, :select, :readonly, :group, :from, :lock], ActiveRecord::Base.valid_find_options
       assert_equal [:conditions, :joins, :order, :select, :group, :having, :distinct, :limit, :offset, :include, :from], ActiveRecord::Base.valid_calculations_options
     end
-  
+    
     def test_build_search
       search = Account.new_search(:conditions =&gt; {:name_keywords =&gt; &quot;awesome&quot;}, :page =&gt; 2, :per_page =&gt; 15)
       assert_kind_of Searchlogic::Search::Base, search
@@ -50,7 +50,7 @@ module ActiveRecordTests
       assert_equal 2, search.page
       assert_equal 15, search.per_page
     end
-  
+    
     def test_searchlogic_searching
       binary_logic = accounts(:binary_logic)
       neco = accounts(:neco)
@@ -60,27 +60,27 @@ module ActiveRecordTests
       assert_equal [binary_logic], Account.all(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;, :users =&gt; {:first_name_starts_with =&gt; &quot;Ben&quot;}})
       assert_equal [], Account.all(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;, :users =&gt; {:first_name_starts_with =&gt; &quot;Ben&quot;, :last_name =&gt; &quot;Mills&quot;}})
       assert_equal [binary_logic, neco], Account.all(:conditions =&gt; {:users =&gt; {:id_gt =&gt; 0}}, :include =&gt; :users)
-    
+      
       read_only_accounts = Account.all(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;}, :readonly =&gt; true)
       assert read_only_accounts.first.readonly?
-    
+      
       assert_equal [binary_logic, binary_fun], Account.all(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;}, :page =&gt; 2)
       assert_equal [], Account.all(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;}, :page =&gt; 2, :per_page =&gt; 20)
-    
+      
       assert_equal [binary_logic], Account.scope1.all(:conditions =&gt; {:users =&gt; {:first_name_starts_with =&gt; &quot;Ben&quot;}})
     end
-  
+    
     def test_searchlogic_counting
       assert_equal 2, Account.count(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;})
       assert_equal 1, Account.count(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;, :users =&gt; {:first_name_contains =&gt; &quot;Ben&quot;}})
       assert_equal 1, Account.count(:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;, :users =&gt; {:first_name_contains =&gt; &quot;Ben&quot;}}, :limit =&gt; 10, :offset =&gt; 10, :order_by =&gt; &quot;id&quot;, :group =&gt; &quot;id&quot;)
     end
-  
+    
     def test_scoping
       assert_equal({:conditions =&gt; {:name =&gt; &quot;Binary&quot;}, :limit =&gt; 10, :readonly =&gt; true}, Account.send(:with_scope, :find =&gt; {:conditions =&gt; {:name =&gt; &quot;Binary&quot;}, :limit =&gt; 10, :readonly =&gt; true}) { Account.send(:scope, :find) })
       assert_equal({:conditions =&gt; [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?&quot;, &quot;%Binary%&quot;], :limit =&gt; 10, :offset =&gt; 20}, Account.send(:with_scope, :find =&gt; {:conditions =&gt; {:name_contains =&gt; &quot;Binary&quot;}, :per_page =&gt; 10, :page =&gt; 3}) { Account.send(:scope, :find) })
     end
-  
+    
     def test_accessible_conditions
       Account.conditions_accessible :name_contains
       assert_equal Set.new([&quot;name_contains&quot;]), Account.accessible_conditions
@@ -90,7 +90,7 @@ module ActiveRecordTests
       assert_equal Set.new([&quot;id_gt&quot;, &quot;name_contains&quot;]), Account.accessible_conditions
       Account.send(:write_inheritable_attribute, :conditions_accessible, nil)
     end
-  
+    
     def test_protected_conditions
       Account.conditions_protected :name_contains
       assert_equal Set.new([&quot;name_contains&quot;]), Account.protected_conditions
@@ -100,7 +100,7 @@ module ActiveRecordTests
       assert_equal Set.new([&quot;id_gt&quot;, &quot;name_contains&quot;]), Account.protected_conditions
       Account.send(:write_inheritable_attribute, :conditions_protected, nil)
     end
-  
+    
     def test_includes
       assert_nothing_raised { Account.all(:conditions =&gt; {:users =&gt; {:first_name_like =&gt; &quot;Ben&quot;}}, :include =&gt; :users) }
     end</diff>
      <filename>test/active_record_tests/base_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,23 +2,22 @@ require File.dirname(__FILE__) + '/../test_helper.rb'
 
 module ConditionsTests
   class BaseTest &lt; ActiveSupport::TestCase
-    def test_register_conditions
+    def test_register_condition
       Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Keywords)
       assert [Searchlogic::Condition::Keywords], Searchlogic::Conditions::Base.conditions
-    
+      
       Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Like)
       assert [Searchlogic::Condition::Keywords, Searchlogic::Condition::Like], Searchlogic::Conditions::Base.conditions
     end
-  
-    def test_association_names
-      [&quot;dogs&quot;, &quot;children&quot;, &quot;user_groups&quot;, &quot;orders&quot;, &quot;account&quot;, &quot;parent&quot;, &quot;cats&quot;].each do |name|
-        assert Searchlogic::Cache::UserConditions.association_names.include? name
-      end
-      [&quot;admin&quot;, &quot;orders&quot;, &quot;users&quot;].each do |name|
-        Searchlogic::Cache::AccountConditions.association_names.include? name
-      end
+    
+    def test_register_modifier
+      Searchlogic::Conditions::Base.register_modifier(Searchlogic::Modifiers::Absolute)
+      assert [Searchlogic::Modifiers::Absolute], Searchlogic::Conditions::Base.modifiers
+      
+      Searchlogic::Conditions::Base.register_modifier(Searchlogic::Modifiers::Cos)
+      assert [Searchlogic::Modifiers::Absolute, Searchlogic::Modifiers::Cos], Searchlogic::Conditions::Base.modifiers
     end
-  
+    
     def test_needed
       assert (not Searchlogic::Conditions::Base.needed?(User, {}))
       assert (not Searchlogic::Conditions::Base.needed?(User, {:first_name =&gt; &quot;Ben&quot;}))
@@ -32,24 +31,6 @@ module ConditionsTests
       assert_equal conditions.name_contains, &quot;Binary&quot;
     end
   
-    def test_any
-      conditions = Searchlogic::Cache::AccountConditions.new
-      assert (not conditions.any?)
-      conditions = Searchlogic::Cache::AccountConditions.new(:any =&gt; true)
-      assert conditions.any?
-      conditions.any = &quot;false&quot;
-      assert (not conditions.any?)
-      conditions = Searchlogic::Cache::AccountConditions.new
-      conditions.name_contains = &quot;Binary&quot;
-      assert_equal_sql [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?&quot;, &quot;%Binary%&quot;], conditions.sanitize
-      conditions.id = 1
-      assert_equal_sql [&quot;(\&quot;accounts\&quot;.\&quot;id\&quot; = ?) AND (\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?)&quot;, 1, &quot;%Binary%&quot;], conditions.sanitize
-      conditions.any = true
-      assert_equal_sql [&quot;(\&quot;accounts\&quot;.\&quot;id\&quot; = ?) OR (\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?)&quot;, 1, &quot;%Binary%&quot;], conditions.sanitize
-      conditions.any = false
-      assert_equal_sql [&quot;(\&quot;accounts\&quot;.\&quot;id\&quot; = ?) AND (\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?)&quot;, 1, &quot;%Binary%&quot;], conditions.sanitize
-    end
-  
     def test_auto_joins
       conditions = Searchlogic::Cache::AccountConditions.new
       assert_equal conditions.auto_joins, nil
@@ -75,18 +56,29 @@ module ConditionsTests
       conditions.id_gt = 5
       now = Time.now
       conditions.created_after = now
-      assert_equal_sql [&quot;(\&quot;accounts\&quot;.\&quot;created_at\&quot; &gt; ?) AND (\&quot;accounts\&quot;.\&quot;id\&quot; &gt; ?) AND (\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?)&quot;, now, 5, &quot;%Binary%&quot;], conditions.sanitize
+      assert_equal [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ? AND \&quot;accounts\&quot;.\&quot;id\&quot; &gt; ? AND \&quot;accounts\&quot;.\&quot;created_at\&quot; &gt; ?&quot;, &quot;%Binary%&quot;, 5, now], conditions.sanitize
     
       # test out associations
       conditions.users.first_name_like = &quot;Ben&quot;
       conditions.users.id_gt = 10
       conditions.users.orders.total_lt = 500
-      assert_equal_sql [&quot;(\&quot;accounts\&quot;.\&quot;created_at\&quot; &gt; ?) AND (\&quot;accounts\&quot;.\&quot;id\&quot; &gt; ?) AND (\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?) AND ((\&quot;users\&quot;.\&quot;first_name\&quot; LIKE ?) AND (\&quot;users\&quot;.\&quot;id\&quot; &gt; ?) AND (\&quot;orders\&quot;.\&quot;total\&quot; &lt; ?))&quot;, now, 5, &quot;%Binary%&quot;, &quot;%Ben%&quot;, 10, 500], conditions.sanitize
+      assert_equal [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ? AND \&quot;accounts\&quot;.\&quot;id\&quot; &gt; ? AND \&quot;accounts\&quot;.\&quot;created_at\&quot; &gt; ? AND \&quot;users\&quot;.\&quot;first_name\&quot; LIKE ? AND \&quot;users\&quot;.\&quot;id\&quot; &gt; ? AND \&quot;orders\&quot;.\&quot;total\&quot; &lt; ?&quot;, &quot;%Binary%&quot;, 5, now, &quot;%Ben%&quot;, 10, 500], conditions.sanitize
     
       # test that raw sql is returned
       conditions.conditions = &quot;awesome&quot;
       assert_equal &quot;awesome&quot;, conditions.sanitize
     end
+    
+    def test_sanitize_with_and_or_any
+      conditions = Searchlogic::Cache::AccountConditions.new
+      conditions.name_contains = &quot;Binary&quot;
+      conditions.or_id_gt = 5
+      assert conditions.id_gt_object.any?
+      assert_equal [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ? OR \&quot;accounts\&quot;.\&quot;id\&quot; &gt; ?&quot;, &quot;%Binary%&quot;, 5], conditions.sanitize
+      now = Time.now
+      conditions.created_at_after = now
+      assert_equal [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ? OR \&quot;accounts\&quot;.\&quot;id\&quot; &gt; ? AND \&quot;accounts\&quot;.\&quot;created_at\&quot; &gt; ?&quot;, &quot;%Binary%&quot;, 5, now], conditions.sanitize
+    end
   
     def test_conditions
       conditions = Searchlogic::Cache::AccountConditions.new
@@ -94,52 +86,40 @@ module ConditionsTests
       v = {:name_like =&gt; &quot;Binary&quot;, :created_at_greater_than =&gt; now}
       conditions.conditions = v
       assert_equal v, conditions.conditions
-    
+      
       sql = &quot;id in (1,2,3,4)&quot;
       conditions.conditions = sql
       assert_equal sql, conditions.conditions
-      assert_equal({}, conditions.send(:objects))
-    
+      assert_equal [], conditions.send(:objects)
+      
       v2 = {:id_less_than =&gt; 5, :name_begins_with =&gt; &quot;Beginning of string&quot;}
       conditions.conditions = v2
       assert_equal v2, conditions.conditions
-    
+      
       v = {:name_like =&gt; &quot;Binary&quot;, :created_at_greater_than =&gt; now}
       conditions.conditions = v
       assert_equal v2.merge(v), conditions.conditions
-    
+      
       sql2 = &quot;id &gt; 5 and name = 'Test'&quot;
       conditions.conditions = sql2
       assert_equal sql2, conditions.conditions
-      assert_equal({}, conditions.send(:objects))
-    
+      assert_equal [], conditions.send(:objects)
+      
       conditions.name_contains = &quot;awesome&quot;
       assert_equal({:name_like =&gt; &quot;awesome&quot;}, conditions.conditions)
-    
+      
       now = Time.now
       conditions.conditions = {:id_gt =&gt; &quot;&quot;, :id =&gt; &quot;&quot;, :name =&gt; [&quot;&quot;, &quot;&quot;, &quot;&quot;], :created_at =&gt; [&quot;&quot;, now], :name_starts_with =&gt; &quot;Ben&quot;}
       assert_equal({:name_like =&gt; &quot;awesome&quot;, :name_begins_with =&gt; &quot;Ben&quot;, :created_at_equals =&gt; now}, conditions.conditions)
     end
-  
-    # Other general usage tests, need to clean these up
-  
-    def test_setting_conditions
-      [Account, User, Order].each do |klass|
-        conditions = &quot;Searchlogic::Cache::#{klass}Conditions&quot;.constantize.new
-        conditions.class.condition_names.each do |condition_name|
-          conditions.send(&quot;#{condition_name}=&quot;, 1)
-          assert_equal 1, conditions.send(condition_name)
-        end
-      end
-    end
-  
-    def test_accessible_protected_conditions
+    
+    def test_conditions_with_protected_assignments
       Account.conditions_accessible &lt;&lt; :name_contains
       conditions = Searchlogic::Cache::AccountConditions.new
       conditions.conditions = {:created_after =&gt; Time.now, :name_contains =&gt; &quot;Binary&quot;}
       assert({:name_contains =&gt; &quot;Binary&quot;}, conditions.conditions)
       Account.send(:write_inheritable_attribute, :conditions_accessible, nil)
-    
+      
       Account.conditions_protected &lt;&lt; :name_contains
       conditions = Searchlogic::Cache::AccountConditions.new
       now = Time.now
@@ -147,14 +127,14 @@ module ConditionsTests
       assert({:created_after =&gt; now}, conditions.conditions)
       Account.send(:write_inheritable_attribute, :conditions_protected, nil)
     end
-  
-    def test_assert_valid_values
+    
+    def test_conditions_unknown
       conditions = Searchlogic::Cache::UserConditions.new
       assert_raise(NoMethodError) { conditions.conditions = {:unknown =&gt; &quot;blah&quot;} }
       assert_nothing_raised { conditions.conditions = {:first_name =&gt; &quot;blah&quot;} }
       assert_nothing_raised { conditions.conditions = {:first_name_contains =&gt; &quot;blah&quot;} }
     end
-  
+    
     def test_setting_associations
       conditions = Searchlogic::Cache::AccountConditions.new(:users =&gt; {:first_name_like =&gt; &quot;Ben&quot;})
       assert_equal conditions.users.first_name_like, &quot;Ben&quot;
@@ -162,30 +142,7 @@ module ConditionsTests
       conditions.users.last_name_begins_with = &quot;Ben&quot;
       assert_equal conditions.users.last_name_begins_with, &quot;Ben&quot;
     end
-  
-    def test_virtual_columns
-      conditions = Searchlogic::Cache::AccountConditions.new
-      conditions.hour_of_created_gt = 2
-      assert_equal_sql [&quot;strftime('%H', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &gt; ?&quot;, 2], conditions.sanitize
-      conditions.dow_of_created_at_most = 5
-      assert_equal_sql [&quot;(strftime('%w', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &lt;= ?) AND (strftime('%H', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &gt; ?)&quot;, 5, 2], conditions.sanitize
-      conditions.month_of_created_at_nil = true
-      assert_equal_sql [&quot;(strftime('%w', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &lt;= ?) AND (strftime('%H', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &gt; ?) AND (strftime('%m', \&quot;accounts\&quot;.\&quot;created_at\&quot;) IS NULL)&quot;, 5, 2], conditions.sanitize
-      conditions.min_of_hour_of_month_of_created_at_nil = true
-      assert_equal_sql [&quot;(strftime('%w', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &lt;= ?) AND (strftime('%H', \&quot;accounts\&quot;.\&quot;created_at\&quot;) &gt; ?) AND (strftime('%m', strftime('%H', strftime('%M', \&quot;accounts\&quot;.\&quot;created_at\&quot;))) IS NULL) AND (strftime('%m', \&quot;accounts\&quot;.\&quot;created_at\&quot;) IS NULL)&quot;, 5, 2], conditions.sanitize
-    end
-  
-    def test_objects
-      conditions = Searchlogic::Cache::AccountConditions.new
-      assert_equal({}, conditions.send(:objects))
     
-      conditions.name_contains = &quot;Binary&quot;
-      assert_equal 1, conditions.send(:objects).size
-    
-      conditions.users.first_name_contains = &quot;Ben&quot;
-      assert_equal 2, conditions.send(:objects).size
-    end
-  
     def test_reset
       conditions = Searchlogic::Cache::AccountConditions.new
     
@@ -194,13 +151,13 @@ module ConditionsTests
     
       conditions.reset_name_like!
       conditions.reset_name_contains! # should set up aliases for reset
-      assert_equal({}, conditions.send(:objects))
+      assert_equal [], conditions.send(:objects)
     
       conditions.users.first_name_like = &quot;Ben&quot;
       assert_equal 1, conditions.send(:objects).size
     
       conditions.reset_users!
-      assert_equal({}, conditions.send(:objects))
+      assert_equal [], conditions.send(:objects)
     
       conditions.name_begins_with =&quot;Binary&quot;
       conditions.users.orders.total_gt = 200
@@ -210,12 +167,12 @@ module ConditionsTests
       assert_equal 1, conditions.send(:objects).size
     
       conditions.reset_users!
-      assert_equal({}, conditions.send(:objects))
-    end
-  
-    def test_method_conflicts
-      conditions = Searchlogic::Cache::AccountConditions.new
-      assert_nil conditions.id
+      assert_equal [], conditions.send(:objects)
+      
+      conditions.name_begins_with =&quot;Binary&quot;
+      assert_equal 1, conditions.send(:objects).size
+      conditions.reset!
+      assert_equal [], conditions.send(:objects)
     end
   end
 end
\ No newline at end of file</diff>
      <filename>test/conditions_tests/base_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -142,7 +142,7 @@ module SearchTests
       search.conditions.users.id_greater_than = 2
       search.page = 3
       search.readonly = true
-      assert_equal_find_options({:joins =&gt; :users, :offset =&gt; 4, :readonly =&gt; true, :conditions =&gt; [&quot;(\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ?) AND (\&quot;users\&quot;.\&quot;id\&quot; &gt; ?)&quot;, &quot;%Binary%&quot;, 2], :limit =&gt; 2 }, search.sanitize)
+      assert_equal({:joins =&gt; :users, :offset =&gt; 4, :readonly =&gt; true, :conditions =&gt; [&quot;\&quot;accounts\&quot;.\&quot;name\&quot; LIKE ? AND \&quot;users\&quot;.\&quot;id\&quot; &gt; ?&quot;, &quot;%Binary%&quot;, 2], :limit =&gt; 2 }, search.sanitize)
     end
 
     def test_scope
@@ -151,7 +151,7 @@ module SearchTests
       conditions = search.conditions
       assert_equal &quot;some sql&quot;, search.conditions.conditions
       search.conditions = nil
-      assert_nil search.conditions.conditions
+      assert_equal({}, search.conditions.conditions)
       search.conditions = &quot;some sql&quot;
       assert_equal &quot;some sql&quot;, search.conditions.conditions
       search.conditions = &quot;some sql&quot;
@@ -217,7 +217,7 @@ module SearchTests
     
       search = Account.new_search(:conditions =&gt; {:users =&gt; {:orders =&gt; {:id_gt =&gt; bens_order.id}}})
       assert_equal 1, search.count
-    
+
       search = Order.new_search(:conditions =&gt; {:user =&gt; {:account =&gt; {:id_gt =&gt; binary_logic.id}}})
       assert_equal 1, search.count
     
@@ -233,5 +233,9 @@ module SearchTests
     def test_sti
     
     end
+    
+    def test_include_in_relationships
+      
+    end
   end
 end
\ No newline at end of file</diff>
      <filename>test/search_tests/base_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -49,6 +49,13 @@ ActiveRecord::Schema.define(:version =&gt; 1) do
     t.binary    :receipt
   end
   
+  create_table :line_items do |t|
+    t.datetime  :created_at      
+    t.datetime  :updated_at
+    t.integer   :order_id
+    t.string      :name
+  end
+  
   create_table :animals do |t|
     t.datetime  :created_at      
     t.datetime  :updated_at
@@ -81,6 +88,11 @@ end
 
 class Order &lt; ActiveRecord::Base
   belongs_to :user
+  has_many :line_items
+end
+
+class LineItem &lt; ActiveRecord::Base
+  belongs_to :order
 end
 
 # STI
@@ -99,32 +111,4 @@ class Test::Unit::TestCase
   self.use_instantiated_fixtures  = false
   self.pre_loaded_fixtures = true
   fixtures :all
-  
-  private
-    def assert_equal_find_options(find_options, result)
-      find_options_conditions = find_options.delete(:conditions)
-      result_conditions = result.delete(:conditions)
-      
-      assert_equal find_options, result
-      if find_options_conditions.blank? || result_conditions.blank?
-        assert_equal find_options_conditions, result_conditions
-      else
-        assert_equal_sql find_options_conditions, result_conditions
-      end
-    end
-    
-    def assert_equal_sql(sql, result)
-      sql_parts = breakdown_sql(sql)
-      result_parts = breakdown_sql(sql)
-      
-      assert_equal sql_parts.size, result_parts.size
-      sql_parts.each { |part| assert result_parts.include?(part) }
-    end
-    
-    def breakdown_sql(sql)
-      sanitized_sql = ActiveRecord::Base.send(:sanitize_sql, sql)
-      sanitized_sql.gsub!(/(\(|\))/, &quot;&quot;)
-      sql_parts = sanitized_sql.split(/or/i)
-      sql_parts.collect { |part| part.split(/ and /i) }.flatten
-    end
 end
\ No newline at end of file</diff>
      <filename>test/test_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>test/condition_tests/keyswords_test.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>678c4445018e8ecc00ce35a0610a4490f20fdc8c</id>
    </parent>
  </parents>
  <author>
    <name>binarylogic</name>
    <email>bjohnson@binarylogic.com</email>
  </author>
  <url>http://github.com/binarylogic/searchlogic/commit/585e1459eaf69c71d0896a4c7b47529ad47b9960</url>
  <id>585e1459eaf69c71d0896a4c7b47529ad47b9960</id>
  <committed-date>2008-11-29T15:14:31-08:00</committed-date>
  <authored-date>2008-11-29T15:14:31-08:00</authored-date>
  <message>Release v1.5.6 (see changelog)</message>
  <tree>463ed6f40da2e2523cb44f3848b669871bf81dac</tree>
  <committer>
    <name>binarylogic</name>
    <email>bjohnson@binarylogic.com</email>
  </committer>
</commit>
