Hi Rajesh

Sphinx isn't quite as flexible as SQL - and Thinking Sphinx doesn't  
imitate ActiveRecord quite to the extent you're trying in  
the :conditions option.

For fields, you can use boolean logic provided you're using :boolean  
or :extended match modes:

Event.search "something", :match_mode => :extended

For attributes though, the only way to get OR comparisons happening is  
multiple values in a single attribute (ie: matching records that have  
any of specified values in each records' collection of values). Mixing  
ANDs and ORs is even harder - the only real solution is to craft a  
custom attribute to filter by.

So, if it needs to match either of these criteria:
- events.is_private = 0
- events.created_by = ?

Then maybe a possible attribute is (assuming you're using MySQL):

   has "IF(is_private = 0, 0, created_by)", :as => :owner, :type  
=> :integer

And you could filter using the following:

   Event.search "something", :with => {:owner => [0, @user.id]}

Also, to get the date range working, you'll need to add the starts_at  
column as an attribute:

   has starts_at, :type => :datetime

   Event.search "something", :with => {
     :owner     => [0, @user.id],
     :starts_at => 1.week.ago.to_i..Time.now.to_i
   }

I realise your query is more complex than this, but I'm going to leave  
you with the fun job of figuring out an appropriate SQL snippet that  
is usable for a custom attribute. Keep in mind, Sphinx stores unsigned  
integers, so -1 is out as a separate indicator. You can return  
multiple integer values in a single attribute, but they must be  
separated by commas, and the explicit type will be :multi, not :integer.

The other thing to note is that you can't filter by attributes when  
they're strings - because Sphinx stores them as integers, and it's  
extremely difficult to determine what those integers are reliably.  
I've assumed the status you want to filter by is 'active' - if you  
want multiple statuses in your custom attribute, it should be  
possible, but obviously the code is going to get more complex.

I realise this is a lot to think about, but hopefully it helps.

Cheers

-- 
Pat

On 12/03/2009, at 12:07 AM, rajesh wrote:

>
>
> I need to filter search results on the bases of 'OR' condition.I have
> indexed Event model like :
>
> Event--has many--EventUsers
>
> define_index do
>    indexes event.summary
>    has is_private, created_by
>    has event_users(:id), :as => :event_ids
>    has event_users.user_id, :as => :event_user_id
>    has event_users.status, :as => :event_user_status
> end
>
> Now, I need to search somthing like
>
> Event.search "something"
>
> with following conditions
>  :conditions => ['(events.starts_at >= ? and events.starts_at <= ?)
> AND ((events.is_private = 0 OR (events_users.user_id = ? AND
> events_users.status = ?)) or (events.created_by = ?))"]
>
> I tried it with :condtions => {} and :with => {} but both generates
> the query with 'AND'.
>
> what is the way to implement above conditions?
>
>
> >


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

Reply via email to