No worries about the delay. All work and no play is no good. :-) As usual
your suggestion was right on the spot. Thank you!
Cheers,
Roger
kl. 20:22:58 UTC+2 tirsdag 28. august 2012 skrev Pat Allan følgende:
>
> Sorry for not getting back to you sooner Roger. My inbox has been
> suffering some serious neglect over the last month. I blame the Edinburgh
> Fringe.
>
> One thing that may be worth trying is being a little more explicit with
> your association references:
>
> indexes doctors_practices.practices.name, :as => :practice_name
> indexes doctors_practices.counties.name, :as => :counties
>
> This should hopefully avoid the doubling up on joins. Also, I'd suggest
> there's not much point making these columns sortable, given they're
> aggregated values.
>
> If that doesn't help, let me know - although the SQL joins are something
> managed by Rails, so there's limitations in how much they can be modified.
>
> Cheers
>
> --
> Pat
>
> On 25/08/2012, at 8:10 AM, Roger Kind Kristiansen wrote:
>
> > Sorry to drag this up again, but I still haven't managed to find a
> solution. Is my explanation still unclear, or is there no easy way around
> this?
> >
> > Cheers,
> > Roger
> >
> >
> > kl. 21:50:17 UTC+2 tirsdag 31. juli 2012 skrev Roger Kind Kristiansen
> følgende:
> > Sure!
> >
> > I've narrowed down the problem slightly by eliminating all parts of my
> index which are unnecessary. I'll start with the parts of the datamodel I
> suppose are relevant:
> >
> > Doctor
> > has_many :doctors_practices, :inverse_of => :doctor
> > has_many :practices, :through => :doctors_practices
> > has_many :counties, :through => :doctors_practices
> >
> > * I've got an explicit doctors_practices relation to be able to access
> various fields on the relation.
> > * The doctors_practices table contain the county id for convenience, to
> minimize the number of joins necessary to get to the counties a doctor has
> practices in.
> >
> > Perhaps this design is just stupid and I should just be stopped right
> here. But if not, here goes...
> >
> > If I set up the index in Doctor like this:
> >
> > indexes [lastname, firstname], :as => :name, :sortable => true
> > indexes practices.name, :as => :practice_name, :sortable
> => true
> >
> > And rebuild the index, the SQL of my doctor_core_0 index is something
> like this:
> >
> > CAST(COALESCE("doctors"."lastname"::varchar, '') as varchar) || ' ' ||
> CAST(COALESCE("doctors"."firstname"::varchar, '') as varchar) AS "name",
> > array_to_string(array_agg(COALESCE("practices"."name", '0')), ' ') AS
> "practice_name",
> > FROM "doctors"
> > LEFT OUTER JOIN "doctors_practices" ON "doctors_practices"."doctor_id" =
> "doctors"."id"
> > LEFT OUTER JOIN "practices" ON "practices"."id" =
> "doctors_practices"."practice_id"
> > GROUP BY "doctors"."id",
> > "doctors"."lastname",
> > "doctors"."firstname",
> > "doctors"."id",
> > "doctors"."lastname",
> > "doctors"."firstname"
> >
> >
> > Which works just fine. If a doctor is connected to one practice, a
> single practice name is returned. If connected to multiple practices, each
> practice name is displayed only once.
> >
> > But once I include an index on another relation through my join table,
> for example county, so my index looks something like:
> >
> > indexes [lastname, firstname], :as => :name, :sortable => true
> > indexes practices.name, :as => :practice_name, :sortable
> => true
> > indexes counties.name, :as => :county_name, :sortable
> => true
> >
> > Then the resulting joins in the doctor_core_0 index start playing tricks
> on me. SQL is as follows:
> >
> > SELECT
> > CAST(COALESCE("doctors"."lastname"::varchar, '') as varchar) || ' ' ||
> CAST(COALESCE("doctors"."firstname"::varchar, '') as varchar) AS "name",
> > array_to_string(array_agg(COALESCE("practices"."name", '0')), ' ') AS
> "practice_name"
> > array_to_string(array_agg(COALESCE("counties"."name", '0')), ' ') AS
> "county_name"
> > FROM "doctors"
> > LEFT OUTER JOIN "doctors_practices" ON "doctors_practices"."doctor_id" =
> "doctors"."id"
> > LEFT OUTER JOIN "practices" ON "practices"."id" =
> "doctors_practices"."practice_id"
> > LEFT OUTER JOIN "doctors_practices" "doctors_practices_doctors_join" ON
> "doctors_practices_doctors_join"."doctor_id" = "doctors"."id"
> > LEFT OUTER JOIN "counties" ON "counties"."id" =
> "doctors_practices_doctors_join"."county_id"
> > GROUP BY "doctors"."id",
> > "doctors"."lastname",
> > "doctors"."firstname",
> > "doctors"."id",
> > "doctors"."lastname",
> > "doctors"."firstname"
> >
> > Now, if doctors are connected to multiple practices, all practice names
> and county names are repeated twice. See?
> >
> > Not being very proficient in neither thinking sphinx or rails I'm having
> trouble seeing how to fix this. Perhaps you see a sensible solution? Or
> perhaps I need to rethink my design.. or both. :-)
> >
> > Cheers,
> > Roger
> >
> >
> >
> > kl. 22:52:28 UTC+2 mandag 30. juli 2012 skrev Pat Allan følgende:
> > Hi Roger
> > Not sure exactly what you're referring to - can you provide the SQL
> statement and point out what you think could be more efficient?
> >
> > Cheers
> >
> > --
> > Pat
> >
> > On 29/07/2012, at 5:06 PM, Roger Kind Kristiansen wrote:
> >
> > > Hi again,
> > >
> > > I just noticed that the SQL generated to my sphinx config returns a
> bit more than I expected. I'll not dig to deep into my data model or
> concrete indices first, as I assume this is yet another silly newbie
> mistake which is easy to pinpoint.
> > >
> > > I've got one model which has a few associations (most are through a
> join table, but not all). I've set up some indices and some attributes
> making use of these associations. Now when I manually run the SQL generated
> by TS, I notice the same values from the associated models are repeated
> multiple times in each column. Is this expected behaviour, or is there some
> obvious thing I'm missing which TS doesn't do for me automatically, like
> some explicit grouping or unique constraints or something?
> > >
> > > This hasn't caused me any trouble up until now, but now I'm trying to
> sort by counting the number of entries in one of the associated models and
> the numbers get all screwy. As far as I can understand it's related to the
> mentioned duplication.
> > >
> > > Cheers,
> > > Roger
> > >
> > > --
> > > 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/-/C_gW49zbm6kJ.
> > > To post to this group, send email to
> > > [email protected]<javascript:>
> .
> > > To unsubscribe from this group, send email to
> [email protected] <javascript:>.
> > > 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/-/9_XhUmvM8NQJ.
> > To post to this group, send email to
> > [email protected]<javascript:>
> .
> > To unsubscribe from this group, send email to
> [email protected] <javascript:>.
> > 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/-/SC_h0tYZnJ0J.
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.