weird issue with deltas

33 views
Skip to first unread message

elanderholm

unread,
Jun 6, 2012, 10:52:46 PM6/6/12
to Thinking Sphinx
I'm going to do my best to describe what is going on here with all the
detail I can muster! :)

First the gist. When I do object.update_attribute...index_delta does
not run. More then that if I do Class.index_delta(self) it can't find
index_delta. It does not respond_to? it.

If I do object.update_attributes it works fine. It runs the
index_delta after_commit.

I even went as far as to create my own after commit that looked
something like

after_commit do
Class.index_delta(self)
end

and i get a no_method error for the Class if I do update_attribute.
If i do update_attributes it actually ends up rotating the indexes
twice. Once from the thinking_sphinx code and once from my
after_commit.

I'm using
Rails 3.2
gem 'thinking-sphinx', '~> 2.0.12'
Sphinx 0.9.9-release (r2117)

Thanks
Erik

Pat Allan

unread,
Jun 7, 2012, 4:48:02 AM6/7/12
to thinkin...@googlegroups.com
Hi Erik

Can you show us your index definition? Also, does it work if you run update_attributes, as opposed to update_attribute (plural, not singular)?

--
Pat

> --
> You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group.
> To post to this group, send email to thinkin...@googlegroups.com.
> To unsubscribe from this group, send email to thinking-sphi...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.
>



elanderholm

unread,
Jun 7, 2012, 11:45:03 AM6/7/12
to Thinking Sphinx
Hi Pat-

It does run the delta if i do update_attributes.

## Sphinx
define_index do
indexes :name, :as => :name, :sortable => true
indexes makes.name, :as => :makes_name
indexes zip_code.zip_code, :as => :zip_code
indexes zip_code.city_name, :as => :city
indexes zip_code.state_name, :as => :state_name
indexes zip_code.state_abbr, :as => :state_abbr

indexes :created_at, :sortable => true

has zip_code(:id), :as => :zip_code_id
has 'RADIANS(zip_codes.latitude)', :as => :latitude, :type
=> :float
has 'RADIANS(zip_codes.longitude)', :as => :longitude, :type
=> :float
has makes(:id), :as => :makes_id
has disabled, :as => :disabled, :type
=> :boolean
has number_of_offers_made, :as => :offer_count, :type
=> :integer
has total_time_of_last_x_offers, :as => :time_to_offer, :type
=> :integer

set_property :latitude_attr => "latitude"
set_property :longitude_attr => "longitude"
set_property :delta => true
end

Though it seems like sometimes it does work with just
update_attribute. It's almost like it works or it doesn't for all the
objects. But, if it starts working then it works fine until I open a
new console. I guess what I'm trying to say is it's not consistent.
It's not like update_attribute never works by itself. Also, once I
run an update_attributes then update_attribute works.

Also, is this the proper behavior.
If I use update_attributes to change the name for example, it changes
the delta from false to true. It's false after running rake ts:index
for instance. Then the rotate runs and the delta stays true? Is that
correct? When it doesn't work the delta stays false and never toggles
to true.

thanks.
Erik

Pat Allan

unread,
Jun 7, 2012, 2:27:53 PM6/7/12
to thinkin...@googlegroups.com
Hmm, I thought update_attribute didn't fire callbacks - but it turns out it does. Not sure if it's always been that way or it's a relatively new change, but good to know, I guess. Albeit it removes a reason for this inconsistency, so I'm unsure why it's only happening sometimes.

As for the process for deltas generally, in relation to the delta column:
* When a record is added/edited, it has delta set to true.
* The delta remains set to true until the next full index, at which point it's set to false and remains set to false, unless the record is later changed again.

Hope this helps, although it doesn't answer why update_attribute is only firing off the delta indexing only sometimes. Have you got a set of commands that reliably run without the delta indexing happening?

--
Pat

elanderholm

unread,
Jun 8, 2012, 5:49:07 PM6/8/12
to thinkin...@googlegroups.com
Pat-  

  Third times a charm I hope....stupid google groups.

  It looks like you are hooking in the thinking_sphinx callback with the before_validation hook.

starts at line 169 of of active_record.rb in lib/thinking_sphinx

  It looks like this:
        if sphinx_index_blocks.empty?
          before_validation :define_indexes
          before_destroy    :define_indexes
        end


The issue is the index stuff is never hooked in on an update_attribute since it never calls the validations.  update_attribute calls save(false) while update_attributes calls save with no false.

 Anyway to hook in the index stuff without using before_validation?

Thanks.
Erik

>>> To post to this group, send email to thinking-sphinx@googlegroups.com.
>>> To unsubscribe from this group, send email to thinking-sphinx+unsubscribe@googlegroups.com.


>>> For more options, visit this group athttp://groups.google.com/group/thinking-sphinx?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group.

> To post to this group, send email to thinking-sphinx@googlegroups.com.
> To unsubscribe from this group, send email to thinking-sphinx+unsubscribe@googlegroups.com.

Pat Allan

unread,
Jun 14, 2012, 6:17:28 PM6/14/12
to thinkin...@googlegroups.com
Hi Erik

Did you get my email in response to one of yours that didn't seem to make it through to the list? From what I can see, I replied directly to you on the 8th June (about 10 minutes before your latest email).

Cheers

--
Pat

> >>> To post to this group, send email to thinkin...@googlegroups.com.
> >>> To unsubscribe from this group, send email to thinking-sphi...@googlegroups.com.


> >>> For more options, visit this group athttp://groups.google.com/group/thinking-sphinx?hl=en.
> >
> > --
> > You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group.

> > To post to this group, send email to thinkin...@googlegroups.com.
> > To unsubscribe from this group, send email to thinking-sphi...@googlegroups.com.


> > For more options, visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.
> >
>
>
>
>
>
>
>
>

> --
> You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group.

> To view this discussion on the web visit https://groups.google.com/d/msg/thinking-sphinx/-/Fkj5sjrAPiAJ.
> To post to this group, send email to thinkin...@googlegroups.com.
> To unsubscribe from this group, send email to thinking-sphi...@googlegroups.com.

Reply all
Reply to author
Forward
0 new messages