Or, you could add a middleware that modifies the indices and classes options of 
a search, inserted at the top of the stack:
https://gist.github.com/4471233

(Keep in mind that's untested, so may need some tweaking).

On 07/01/2013, at 10:43 AM, Pat Allan wrote:

> Hi Tiago
> 
> You could take the middleware approach if you really want to, but your 
> reliance on Thread.current makes me a little nervous. I would just add an 
> :indices option to your searches with the appropriate index names. It's worth 
> noting that _core will be appended on the each of each index name (and _delta 
> for delta indices, if you're using them), so they become <CLASS NAME>_<TENANT 
> ID>_core.
> 
> If you're always using the same indices logic, then I would wrap that in a 
> re-usable method (or if more complex, class), which has a standard search 
> within.
> 
> Cheers
> 
> -- 
> Pat
> 
> On 07/01/2013, at 2:27 AM, Tiago wrote:
> 
>> Hi Pat,
>> 
>> I'm updating here to sphinx v3, I didn't know about it!
>> 
>> Using set_property :sql_query_pre, worked, I did a loop wrapping the index 
>> definition, and it created all indexes, with the correct sql_query_pre for 
>> each one, I named each index as "<CLASS NAME>_<TENANT ID>".
>> My doubt now is how to query a specific index of a model.
>> 
>> Would this be the case of using the middlewares? I was looking through the 
>> source, and it seems that creating one like this could work:
>> 
>> class ThinkingSphinx::Middlewares::SphinxQLWithTenants < 
>> ThinkingSphinx::Middlewares::SphinxQL
>>  def indices
>>    return super unless Thread.current[:tenant]
>>    @indices ||= ThinkingSphinx::IndexSet.new(classes, 
>> options[:indices]).select { |index| index.name =~ 
>> /_#{Thread.current[:tenant].id}$/ }
>>  end
>> end
>> 
>> My question is, how do I load them? =p
>> Or is there another way of doing this, like using scopes?
>> 
>> Thank you!
>> 
>> On Saturday, January 5, 2013 11:25:36 PM UTC-2, Pat Allan wrote:
>> Hi Tiago
>> With Thinking Sphinx v3, you can do the following within an index definition:
>> 
>>  set_property :sql_query_pre => ['CUSTOM SQL']
>> 
>> Keep in mind it must be an array of strings, even if there's only one 
>> string. If you put a loop around the index definition, then you could have 
>> this working easily enough without any need for patches.
>> 
>> And if you've not given TS v3 a go yet, make sure you read these first:
>> https://groups.google.com/d/msg/thinking-sphinx/QM0BlS3gg3k/s61pfCBBTUoJ
>> https://github.com/pat/thinking-sphinx/blob/edge/README.textile
>> 
>> Cheers
>> 
>> -- 
>> Pat
>> 
>> On 06/01/2013, at 1:21 AM, Tiago wrote:
>> 
>>> Did you have any success on this?
>>> 
>>> I'm trying to build a gem to help this process, but I've a doubt.
>>> Is there already a way to define a sql_query_pre per index basis?
>>> 
>>> I'm trying to create a new 'schema' method in the index definition, so I 
>>> could use like:
>>> 
>>> define_index do
>>>  schema "tenantX"
>>>  ...
>>> end
>>> 
>>> And this 'shema' would append the new schema search path to the 
>>> sql_query_pre.
>>> This way would be possible to define an index for each tenant/schema.
>>> 
>>> On Thursday, December 6, 2012 3:17:42 PM UTC-2, Tair Assimov wrote:
>>> Oh, I almost forgot about this discussion and did not have notifications 
>>> enabled. Pat, thanks for your hints. I will try the second option 
>>> suggested. If I manage to find an elegant solution, I will submit a pull 
>>> request. I think this is quite common use case when dealing with postgresql 
>>> schemas.
>>> 
>>> Cheers.
>>> 
>>> On Monday, October 29, 2012 2:08:47 PM UTC+2, Pat Allan wrote:
>>> Hi Tair
>>> You could specify an index per tenant:
>>> 
>>>  Tenant.each do |tenant|
>>>    define_index "#{class.name}_#{tenant.id}" do
>>>      # ...
>>>    end
>>>  end
>>> 
>>> While this provides a index and source per model per tenant, it doesn't 
>>> take care of the sql_query_pre value. You could manually add that yourself 
>>> and then use the ts:reindex task (which doesn't overwrite the 
>>> configuration), but that's not particularly elegant.
>>> 
>>> Another option - mind you, this isn't elegant either, but could keep things 
>>> far easier over time - is to override the generate method in 
>>> ThinkingSphinx::Configuration. Keep the existing implementation, but also 
>>> traverse through each source in the configuration tree and add the 
>>> additional sql_query_pre statement in. Here's the current method for 
>>> reference:
>>> https://github.com/pat/thinking-sphinx/blob/master/lib/thinking_sphinx/configuration.rb#L156
>>> 
>>> Have a look at the enforce_common_attribute_type method, which could be 
>>> used as a starting point:
>>> https://github.com/pat/thinking-sphinx/blob/master/lib/thinking_sphinx/configuration.rb#L329
>>> 
>>> Hope this helps!
>>> 
>>> -- 
>>> Pat
>>> 
>>> On 28/10/2012, at 1:09 AM, Tair Assimov wrote:
>>> 
>>>> Hi all. I bumped into the same problem when creating multi-tenant Rails 
>>>> application with PostgreSQL schemas. I tried what Pat suggested and added:
>>>> 
>>>> sql_query_pre = SET search_path TO 2,public
>>>> 
>>>> Where, 2 is the ID of my tenant. However, when I ran rake ts:in, Thinking 
>>>> Sphinx has rewritten configuration file and indexed my default (public) 
>>>> schema instead.
>>>> 
>>>> Anyway, I do not think its the correct approach to update the 
>>>> Rails.env.sphinx.conf, since there are many tenants and you need some kind 
>>>> of rotation to index each tenants data. I think the easier is to create a 
>>>> custom script/Rake task/whatever, which will loop through all your tenants 
>>>> and somehow add the schema selection to the configuration file, and then 
>>>> finally use indexer directly:
>>>> 
>>>> indexer --all --rotate -c PATH_TO_CONF
>>>> 
>>>> However, in this case one tenants data will overwrite others, unless we 
>>>> also set the location of the index, which needs more tweaking on the Rails 
>>>> side to use the correct one. 
>>>> 
>>>> Pat, what is the best approach to tackle this problem? I think ideally I 
>>>> would want Sphinx to index all my schemas. Or in the worst case to have 
>>>> per-tenant sphinx configuration files with own index store and schema 
>>>> selection. Is there any way Thinking Sphinx can assist? Is there anything 
>>>> similar on the roadmap? Or am I missing something completely?
>>>> 
>>>> Thanks all!
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Saturday, January 22, 2011 2:02:41 PM UTC+2, Pat Allan wrote:
>>>> Hi Praveen
>>>> Can you select a schema via a SQL statement? If so, you could add a line 
>>>> in your sources something like the following:
>>>>  sql_query_pre = SQL STATEMENT TO CHOOSE A SCHEMA
>>>> 
>>>> You will find existing sql_query_pre lines in your sources - you don't 
>>>> need to replace these, Sphinx will accept as many as you put in. 
>>>> Unfortunately, there's no way to automatically set this via Thinking 
>>>> Sphinx at the moment, though.
>>>> 
>>>> -- 
>>>> Pat
>>>> 
>>>> On 21/01/2011, at 6:16 PM, praveen wrote:
>>>> 
>>>>> Thanks Pat.
>>>>> 
>>>>> We can create schemas in a postgresql database to group our tables in
>>>>> that database. By default postgresql has a schema "public" which is
>>>>> set by default and contains all the tables created in the database.
>>>>> 
>>>>> So , for my multitenant application , i try to create different
>>>>> schamas in a database for different tenants created. So when a user
>>>>> requests for a tenant , the application set the schema to the
>>>>> particular tenant. so the data for the tenant is pulled from the
>>>>> tables in that particular schema. So when i use sphinx to indes my
>>>>> database tables, the indexer indexes only the public schema and i have
>>>>> no options to specify which schema to be indexed or the sphinx itself
>>>>> does not have the feature to select all the schemas available and
>>>>> index them , which i can filter in my application to show search
>>>>> results depending on from which tenant is the the search requested.
>>>>> 
>>>>> Can you tell if there is any option to atleast specify the schema
>>>>> along with the host, usr,pass,db details in the config file??
>>>>> 
>>>>> On Jan 21, 4:53 am, Pat Allan <[email protected]> wrote:
>>>>>> Hi Praveen
>>>>>> 
>>>>>> When you talk about different schemas, do you mean different databases, 
>>>>>> each one for a different tenant? If so, there's no simple way to do this 
>>>>>> with Thinking Sphinx. You may need to create your own script to modify 
>>>>>> the generated configuration file, or run separate searchd instances for 
>>>>>> each tenant and change the port and/or address depending on the tenant.
>>>>>> 
>>>>>> Or do you mean something else when you say schema? I'm not sure.
>>>>>> 
>>>>>> Cheers
>>>>>> 
>>>>>> --
>>>>>> Pat
>>>>>> 
>>>>>> On 20/01/2011, at 7:28 PM, praveen wrote:
>>>>>> 
>>>>>>> Hi Everyone,
>>>>>> 
>>>>>>> I would like to know , how can i use thinking sphinx/sphinx to index
>>>>>>> all the schemas in a postgres database.
>>>>>> 
>>>>>>> I am using Postgresql Database for my Multitenant application, where i
>>>>>>> differentiate each tenant by Postgresql shema , which means , I
>>>>>>> connect to the particular schema , when the user requests for the
>>>>>>> particular tenant.
>>>>>> 
>>>>>>> To explain in detail, I have one rails application which will connect
>>>>>>> to different schema in my postgresql database according to the tenant
>>>>>>> id requested, to behave as a multitenant application.
>>>>>> 
>>>>>>> Since i have only one application , and i have to use the same
>>>>>>> thinking sphinx plugin for indexing, i am not able configure to index
>>>>>>> tables from all the schemas i have in my postgresql database.
>>>>>> 
>>>>>>> Please help. Thanks in advance.
>>>>>> 
>>>>>>> --
>>>>>>> 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 
>>>>>>> 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 [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.
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> 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/-/zIVsCnFwZNQJ.
>>>> 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.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> 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/-/mRB-fvyrTzIJ.
>>> 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.
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> -- 
>> 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/-/AHbV2s5Y-J8J.
>> 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.
> 
> 
> 
> -- 
> 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.
> 


-- 
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