Re: [Dbix-class] Unknown column in 'group statement'

2009-08-05 Thread Peter Rabbitson
Anthony Gladdish wrote:
 Hi,
 
 Using:
 Perl 5.10.
 DBIC 0.08108.
 
 1. My result source tables with relationships are:
 
 Event.pm:
 __PACKAGE__-set_primary_key('id');
 __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
 __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
 __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );
 
 AssistingTrainer.pm:
 __PACKAGE__-set_primary_key('event','trainer');
 __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
 __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );
 
 Trainer.pm:
 __PACKAGE__-set_primary_key('id');
 
 2. My ResultSet::Event.pm methods:
 
 sub goEvents {
   my $self  = shift;
   my $where = {};
   $where-{status} = { '' = 2 };
   return $self-search($where);
 }
 
 sub events_during_lookback_period {
   my $self  = shift;  
   my $default_lookback_period = DateTime::Duration-new( years = 3 );
   my $lookback_period = shift || $default_lookback_period;
   my $earliest_date = DateTime-now() - $lookback_period; 
   return $self-goEvents()-search_rs(
   {
   -and = [
   start = { '', DateTime-now() },
   start = { '', $earliest_date },
   ],
   }
   );
 }
 
 sub distinct_assistants {
   my $self  = shift;
   my $assistants = [];
   my $rs = $self-search_rs(
   undef,
   {
   columns = [ qw/me.id/ ],
   distinct = 1,
   prefetch = [ { 'assistingtrainers' = 'trainers' } ],
   join = [ { 'assistingtrainers' = 'trainers' } ],
   },
   );
   while ( my $e = $rs-next() ) { 
   foreach my $at ( $e-assistingtrainers() ) {
   push( @$assistants, $at-trainers );
   }   
   }
   return $assistants;
 }
 
 3. Test case producing error:
 
 $trainers = 
 $schema-resultset('Event')-events_during_lookback_period($lookback_period)-distinct_assistants();
 
 The distinct_assistants() chained method is producing error:
 
 DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
 Unknown column 'assistingtrainers.event' in 'group statement' [for Statement 
 SELECT me.id, assistingtrainers.event, assistingtrainers.trainer, 
 trainers.id, trainers.name, trainers.email, trainers.phone, 
 trainers.initials, trainers.loginId, trainers.password FROM (SELECT me.id 
 FROM event me WHERE ( ( ( start  ? AND start  ? ) AND status  ? ) ) GROUP 
 BY me.id, assistingtrainers.event, assistingtrainers.trainer, trainers.id, 
 trainers.name, trainers.email, trainers.phone, trainers.initials, 
 trainers.loginId, trainers.password) me LEFT JOIN trainer_assist 
 assistingtrainers ON assistingtrainers.event = me.id LEFT JOIN trainer 
 trainers ON trainers.id = assistingtrainers.trainer WHERE ( ( ( start  ? AND 
 start  ? ) AND status  ? ) ) ORDER BY assistingtrainers.event with 
 ParamValues: 0='2009-07-23T15:10:02', 1='2006-07-23T15:10:02', 2=2, 
 3='2009-07-23T15:10:02', 4='2006-07-23T15:10:02', 5=2]
 
 Can anyone see if any schema updates/tweaks are required to make this work?
 Or, if I'm missing anything else or if I'm using incorrect syntax?
 Or confirm if this is a bug?
 

The above should now work _unmodified_ with the current trunk (i.e. using
distinct = 1). Please test and report your findings.

Cheers

___
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk


RE: [Dbix-class] Unknown column in 'group statement'

2009-08-05 Thread Anthony Gladdish
Hi,

-Original Message-
From: Peter Rabbitson [mailto:rabbit+d...@rabbit.us]
Sent: 05 August 2009 08:40
To: DBIx::Class user and developer list
Subject: Re: [Dbix-class] Unknown column in 'group statement'

Anthony Gladdish wrote:
 Hi,

 Using:
 Perl 5.10.
 DBIC 0.08108.

 1. My result source tables with relationships are:

 Event.pm:
 __PACKAGE__-set_primary_key('id');
 __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
 __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
 __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );

 AssistingTrainer.pm:
 __PACKAGE__-set_primary_key('event','trainer');
 __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
 __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );

 Trainer.pm:
 __PACKAGE__-set_primary_key('id');

 2. My ResultSet::Event.pm methods:

 sub goEvents {
  my $self  = shift;
  my $where = {};
  $where-{status} = { '' = 2 };
  return $self-search($where);
 }

 sub events_during_lookback_period {
  my $self  = shift;
  my $default_lookback_period = DateTime::Duration-new( years = 3 );
  my $lookback_period = shift || $default_lookback_period;
  my $earliest_date = DateTime-now() - $lookback_period;
  return $self-goEvents()-search_rs(
  {
  -and = [
  start = { '', DateTime-now() },
  start = { '', $earliest_date },
  ],
  }
  );
 }

 sub distinct_assistants {
  my $self  = shift;
  my $assistants = [];
  my $rs = $self-search_rs(
  undef,
  {
  columns = [ qw/me.id/ ],
  distinct = 1,
  prefetch = [ { 'assistingtrainers' = 'trainers' } ],
  join = [ { 'assistingtrainers' = 'trainers' } ],
  },
  );
  while ( my $e = $rs-next() ) {
  foreach my $at ( $e-assistingtrainers() ) {
  push( @$assistants, $at-trainers );
  }
  }
  return $assistants;
 }

 3. Test case producing error:

 $trainers = $schema-resultset('Event')-
events_during_lookback_period($lookback_period)-distinct_assistants();

 The distinct_assistants() chained method is producing error:

 DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed:
Unknown column 'assistingtrainers.event' in 'group statement' [for Statement
SELECT me.id, assistingtrainers.event, assistingtrainers.trainer, trainers.id,
trainers.name, trainers.email, trainers.phone, trainers.initials,
trainers.loginId, trainers.password FROM (SELECT me.id FROM event me WHERE
( ( ( start  ? AND start  ? ) AND status  ? ) ) GROUP BY me.id,
assistingtrainers.event, assistingtrainers.trainer, trainers.id, trainers.name,
trainers.email, trainers.phone, trainers.initials, trainers.loginId,
trainers.password) me LEFT JOIN trainer_assist assistingtrainers ON
assistingtrainers.event = me.id LEFT JOIN trainer trainers ON trainers.id =
assistingtrainers.trainer WHERE ( ( ( start  ? AND start  ? ) AND status
 ? ) ) ORDER BY assistingtrainers.event with ParamValues: 0='2009-07-
23T15:10:02', 1='2006-07-23T15:10:02', 2=2, 3='2009-07-23T15:10:02', 4='2006-
07-23T15:10:02', 5=2]

 Can anyone see if any schema updates/tweaks are required to make this work?
 Or, if I'm missing anything else or if I'm using incorrect syntax?
 Or confirm if this is a bug?


The above should now work _unmodified_ with the current trunk (i.e. using
distinct = 1). Please test and report your findings.


This fixes the error (thanks), but I'm now getting an error from a similar 
ResultSet::Event.pm distinct method and test case to my original problem:

sub distinct_leaders {
my $self  = shift;
my $leaders = [];
my $rs = $self-search_rs(
undef,
{
columns = [ qw/me.leader/ ],
distinct = 1,
prefetch = 'leader',
join = 'leader',   
}
);
while ( my $e = $rs-next() ) { 
push( @$leaders, $e-leader() );
}
return $leaders;
}

... produces error:

DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
Unknown column 'start' in 'where clause' [for Statement SELECT me.leader, 
leader.id, leader.name, leader.email, leader.phone, leader.initials, 
leader.loginId, leader.password FROM (SELECT me.leader FROM event me  JOIN 
trainer leader ON leader.id = me.leader WHERE ( ( ( start  ? AND start  ? ) 
AND status  ? ) ) GROUP BY me.leader) me  JOIN trainer leader ON leader.id = 
me.leader WHERE ( ( ( start  ? AND start  ? ) AND status  ? ) ) with 
ParamValues: 0='2009-08-05T11:57:45', 1='2006-08-05T11:57:45', 2=2, 
3='2009-08-05T11:57:45', 4='2006-08-05T11:57:45', 5=2]

... using similar test case:

$trainers

Re: [Dbix-class] Unknown column in 'group statement'

2009-08-05 Thread Peter Rabbitson
Anthony Gladdish wrote:
 Hi,
 
 -Original Message-
 From: Peter Rabbitson [mailto:rabbit+d...@rabbit.us]
 Sent: 05 August 2009 08:40
 To: DBIx::Class user and developer list
 Subject: Re: [Dbix-class] Unknown column in 'group statement'

 Anthony Gladdish wrote:
 Hi,

 Using:
 Perl 5.10.
 DBIC 0.08108.

 1. My result source tables with relationships are:

 Event.pm:
 __PACKAGE__-set_primary_key('id');
 __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
 __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
 __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );

 AssistingTrainer.pm:
 __PACKAGE__-set_primary_key('event','trainer');
 __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
 __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );

 Trainer.pm:
 __PACKAGE__-set_primary_key('id');

 2. My ResultSet::Event.pm methods:

 sub goEvents {
 my $self  = shift;
 my $where = {};
 $where-{status} = { '' = 2 };
 return $self-search($where);
 }

 sub events_during_lookback_period {
 my $self  = shift;
 my $default_lookback_period = DateTime::Duration-new( years = 3 );
 my $lookback_period = shift || $default_lookback_period;
 my $earliest_date = DateTime-now() - $lookback_period;
 return $self-goEvents()-search_rs(
 {
 -and = [
 start = { '', DateTime-now() },
 start = { '', $earliest_date },
 ],
 }
 );
 }

 sub distinct_assistants {
 my $self  = shift;
 my $assistants = [];
 my $rs = $self-search_rs(
 undef,
 {
 columns = [ qw/me.id/ ],
 distinct = 1,
 prefetch = [ { 'assistingtrainers' = 'trainers' } ],
 join = [ { 'assistingtrainers' = 'trainers' } ],
 },
 );
 while ( my $e = $rs-next() ) {
 foreach my $at ( $e-assistingtrainers() ) {
 push( @$assistants, $at-trainers );
 }
 }
 return $assistants;
 }

 3. Test case producing error:

 $trainers = $schema-resultset('Event')-
 events_during_lookback_period($lookback_period)-distinct_assistants();

 The distinct_assistants() chained method is producing error:

 DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute 
 failed:
 Unknown column 'assistingtrainers.event' in 'group statement' [for Statement
 SELECT me.id, assistingtrainers.event, assistingtrainers.trainer, 
 trainers.id,
 trainers.name, trainers.email, trainers.phone, trainers.initials,
 trainers.loginId, trainers.password FROM (SELECT me.id FROM event me WHERE
 ( ( ( start  ? AND start  ? ) AND status  ? ) ) GROUP BY me.id,
 assistingtrainers.event, assistingtrainers.trainer, trainers.id, 
 trainers.name,
 trainers.email, trainers.phone, trainers.initials, trainers.loginId,
 trainers.password) me LEFT JOIN trainer_assist assistingtrainers ON
 assistingtrainers.event = me.id LEFT JOIN trainer trainers ON trainers.id =
 assistingtrainers.trainer WHERE ( ( ( start  ? AND start  ? ) AND status
  ? ) ) ORDER BY assistingtrainers.event with ParamValues: 0='2009-07-
 23T15:10:02', 1='2006-07-23T15:10:02', 2=2, 3='2009-07-23T15:10:02', 4='2006-
 07-23T15:10:02', 5=2]
 Can anyone see if any schema updates/tweaks are required to make this work?
 Or, if I'm missing anything else or if I'm using incorrect syntax?
 Or confirm if this is a bug?

 The above should now work _unmodified_ with the current trunk (i.e. using
 distinct = 1). Please test and report your findings.

 
 This fixes the error (thanks), but I'm now getting an error from a similar 
 ResultSet::Event.pm distinct method and test case to my original problem:
 
 sub distinct_leaders {
   my $self  = shift;
   my $leaders = [];
   my $rs = $self-search_rs(
   undef,
   {
   columns = [ qw/me.leader/ ],
   distinct = 1,
   prefetch = 'leader',
   join = 'leader',   
   }
   );
   while ( my $e = $rs-next() ) { 
   push( @$leaders, $e-leader() );
   }
   return $leaders;
 }
 
 ... produces error:
 
 DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
 Unknown column 'start' in 'where clause' [for Statement SELECT me.leader, 
 leader.id, leader.name, leader.email, leader.phone, leader.initials, 
 leader.loginId, leader.password FROM (SELECT me.leader FROM event me  JOIN 
 trainer leader ON leader.id = me.leader WHERE ( ( ( start  ? AND start  ? ) 
 AND status  ? ) ) GROUP BY me.leader) me  JOIN trainer leader ON leader.id = 
 me.leader WHERE ( ( ( start  ? AND start  ? ) AND status  ? ) ) with 
 ParamValues: 0='2009-08-05T11:57:45', 1='2006-08-05T11:57:45', 2=2, 
 3='2009-08-05T11:57:45', 4='2006-08-05T11:57:45', 5=2]
 
 ... using

RE: [Dbix-class] Unknown column in 'group statement'

2009-07-24 Thread Anthony Gladdish
Hi Peter,

-Original Message-
From: Peter Rabbitson [mailto:rabbit+d...@rabbit.us]
Sent: 23 July 2009 22:45
To: DBIx::Class user and developer list
Subject: Re: [Dbix-class] Unknown column in 'group statement'

On Thu, Jul 23, 2009 at 04:19:01PM +0100, Anthony Gladdish wrote:
 Hi,

 Using:
 Perl 5.10.
 DBIC 0.08108.

 1. My result source tables with relationships are:

 Event.pm:
 __PACKAGE__-set_primary_key('id');
 __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
 __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
 __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );

 AssistingTrainer.pm:
 __PACKAGE__-set_primary_key('event','trainer');
 __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
 __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );

 Trainer.pm:
 __PACKAGE__-set_primary_key('id');

 2. My ResultSet::Event.pm methods:

 sub goEvents {
  my $self  = shift;
  my $where = {};
  $where-{status} = { '' = 2 };
  return $self-search($where);
 }

 sub events_during_lookback_period {
  my $self  = shift;
  my $default_lookback_period = DateTime::Duration-new( years = 3 );
  my $lookback_period = shift || $default_lookback_period;
  my $earliest_date = DateTime-now() - $lookback_period;
  return $self-goEvents()-search_rs(
  {
  -and = [
  start = { '', DateTime-now() },
  start = { '', $earliest_date },
  ],
  }
  );
 }

 sub distinct_assistants {
  my $self  = shift;
  my $assistants = [];
  my $rs = $self-search_rs(
  undef,
  {
  columns = [ qw/me.id/ ],
  distinct = 1,
  prefetch = [ { 'assistingtrainers' = 'trainers' } ],
  join = [ { 'assistingtrainers' = 'trainers' } ],
  },
  );
  while ( my $e = $rs-next() ) {
  foreach my $at ( $e-assistingtrainers() ) {
  push( @$assistants, $at-trainers );
  }
  }
  return $assistants;
 }


This is a design lapse - we married distinct with group_by too early
in the code and what you are seeing is the fallout (i.e. distinct
applies to all columns not just the ones you are trying to select).
I will have to discuss this with the rest of the developers before
we solve it, but for the time being simply change

distinct = 1

to

group_by = [ qw/me.id/ ]

The prefetch will keep working as expected.

Cheers

This works, but only if I omit columns = too, i.e.:

{
group_by = [ qw/me.id/ ],
prefetch = [ { 'assistingtrainers' = 'trainers' } ],
join = [ { 'assistingtrainers' = 'trainers' } ],
},

I'm assuming this is ok, although I would have thought columns and group_by 
would be needed together (correct me if I'm wrong), and doing this:

{
columns = [ qw/me.id/ ],
group_by = [ qw/me.id/ ],
prefetch = [ { 'assistingtrainers' = 'trainers' } ],
join = [ { 'assistingtrainers' = 'trainers' } ],
},


... produces error:

DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
Unknown column 'start' in 'where clause' [for Statement SELECT me.id, 
assistingtrainers.event, assistingtrainers.trainer, trainers.id, trainers.name, 
trainers.email, trainers.phone, trainers.initials, trainers.loginId, 
trainers.password FROM (SELECT me.id FROM event me WHERE ( ( ( start  ? AND 
start  ? ) AND status  ? ) ) GROUP BY me.id) me LEFT JOIN trainer_assist 
assistingtrainers ON assistingtrainers.event = me.id LEFT JOIN trainer trainers 
ON trainers.id = assistingtrainers.trainer WHERE ( ( ( start  ? AND start  ? 
) AND status  ? ) ) ORDER BY assistingtrainers.event with ParamValues: 
0='2009-07-24T09:46:14', 1='2006-07-24T09:46:14', 2=2, 3='2009-07-24T09:46:14', 
4='2006-07-24T09:46:14', 5=2]

Thanks for your help,

Anthony

___
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk


Re: [Dbix-class] Unknown column in 'group statement'

2009-07-24 Thread Peter Rabbitson
On Fri, Jul 24, 2009 at 11:00:50AM +0100, Anthony Gladdish wrote:
 Hi Peter,
 
 -Original Message-
 From: Peter Rabbitson [mailto:rabbit+d...@rabbit.us]
 Sent: 23 July 2009 22:45
 To: DBIx::Class user and developer list
 Subject: Re: [Dbix-class] Unknown column in 'group statement'
 
 On Thu, Jul 23, 2009 at 04:19:01PM +0100, Anthony Gladdish wrote:
  Hi,
 
  Using:
  Perl 5.10.
  DBIC 0.08108.
 
  1. My result source tables with relationships are:
 
  Event.pm:
  __PACKAGE__-set_primary_key('id');
  __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
  __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' 
  );
  __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' 
  );
 
  AssistingTrainer.pm:
  __PACKAGE__-set_primary_key('event','trainer');
  __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
  __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );
 
  Trainer.pm:
  __PACKAGE__-set_primary_key('id');
 
  2. My ResultSet::Event.pm methods:
 
  sub goEvents {
 my $self  = shift;
 my $where = {};
 $where-{status} = { '' = 2 };
 return $self-search($where);
  }
 
  sub events_during_lookback_period {
 my $self  = shift;
 my $default_lookback_period = DateTime::Duration-new( years = 3 );
 my $lookback_period = shift || $default_lookback_period;
 my $earliest_date = DateTime-now() - $lookback_period;
 return $self-goEvents()-search_rs(
 {
 -and = [
 start = { '', DateTime-now() },
 start = { '', $earliest_date },
 ],
 }
 );
  }
 
  sub distinct_assistants {
 my $self  = shift;
 my $assistants = [];
 my $rs = $self-search_rs(
 undef,
 {
 columns = [ qw/me.id/ ],
 distinct = 1,
 prefetch = [ { 'assistingtrainers' = 'trainers' } ],
 join = [ { 'assistingtrainers' = 'trainers' } ],
 },
 );
 while ( my $e = $rs-next() ) {
 foreach my $at ( $e-assistingtrainers() ) {
 push( @$assistants, $at-trainers );
 }
 }
 return $assistants;
  }
 
 
 This is a design lapse - we married distinct with group_by too early
 in the code and what you are seeing is the fallout (i.e. distinct
 applies to all columns not just the ones you are trying to select).
 I will have to discuss this with the rest of the developers before
 we solve it, but for the time being simply change
 
 distinct = 1
 
 to
 
 group_by = [ qw/me.id/ ]
 
 The prefetch will keep working as expected.
 
 Cheers
 
 This works, but only if I omit columns = too, i.e.:
 
   {
   group_by = [ qw/me.id/ ],
   prefetch = [ { 'assistingtrainers' = 'trainers' } ],
   join = [ { 'assistingtrainers' = 'trainers' } ],
   },
 
 I'm assuming this is ok, although I would have thought columns and 
 group_by would be needed together (correct me if I'm wrong), and doing this:
 
   {
   columns = [ qw/me.id/ ],
   group_by = [ qw/me.id/ ],
   prefetch = [ { 'assistingtrainers' = 'trainers' } ],
   join = [ { 'assistingtrainers' = 'trainers' } ],
   },
 
 
 ... produces error:
 
 DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
 Unknown column 'start' in 'where clause' [for Statement SELECT me.id, 
 assistingtrainers.event, assistingtrainers.trainer, trainers.id, 
 trainers.name, trainers.email, trainers.phone, trainers.initials, 
 trainers.loginId, trainers.password FROM (SELECT me.id FROM event me WHERE ( 
 ( ( start  ? AND start  ? ) AND status  ? ) ) GROUP BY me.id) me LEFT JOIN 
 trainer_assist assistingtrainers ON assistingtrainers.event = me.id LEFT JOIN 
 trainer trainers ON trainers.id = assistingtrainers.trainer WHERE ( ( ( start 
  ? AND start  ? ) AND status  ? ) ) ORDER BY assistingtrainers.event with 
 ParamValues: 0='2009-07-24T09:46:14', 1='2006-07-24T09:46:14', 2=2, 
 3='2009-07-24T09:46:14', 4='2006-07-24T09:46:14', 5=2]
 

This unfortunately is a limitation which can not be worked around easily.
The problem is simple - there is no usable introspection of the WHERE
condition, thus there is no sane way to tell *what* the WHERE limits
on. In your case WHERE is necessary only on the inner query, as it works
on me.* columns only. However since I have no reliable way of determining
this, I err on the safe side, and include the WHERE in the inner and
outer query[1]. The right way to solve this is to bug ash to finish
SQLA2 :) However in the meantime you can trick this with distinct as
such:

{
select = [ { distinct = 'me.id' } ],
as = [qw/id/],
prefetch = [ { 'assistingtrainers' = 'trainers' } ],
join = [ { 'assistingtrainers' = 'trainers' } ],
},

HTH

[1] The reason the double WHERE

[Dbix-class] Unknown column in 'group statement'

2009-07-23 Thread Anthony Gladdish
Hi,

Using:
Perl 5.10.
DBIC 0.08108.

1. My result source tables with relationships are:

Event.pm:
__PACKAGE__-set_primary_key('id');
__PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
__PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
__PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );

AssistingTrainer.pm:
__PACKAGE__-set_primary_key('event','trainer');
__PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
__PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );

Trainer.pm:
__PACKAGE__-set_primary_key('id');

2. My ResultSet::Event.pm methods:

sub goEvents {
my $self  = shift;
my $where = {};
$where-{status} = { '' = 2 };
return $self-search($where);
}

sub events_during_lookback_period {
my $self  = shift;  
my $default_lookback_period = DateTime::Duration-new( years = 3 );
my $lookback_period = shift || $default_lookback_period;
my $earliest_date = DateTime-now() - $lookback_period; 
return $self-goEvents()-search_rs(
{
-and = [
start = { '', DateTime-now() },
start = { '', $earliest_date },
],
}
);
}

sub distinct_assistants {
my $self  = shift;
my $assistants = [];
my $rs = $self-search_rs(
undef,
{
columns = [ qw/me.id/ ],
distinct = 1,
prefetch = [ { 'assistingtrainers' = 'trainers' } ],
join = [ { 'assistingtrainers' = 'trainers' } ],
},
);
while ( my $e = $rs-next() ) { 
foreach my $at ( $e-assistingtrainers() ) {
push( @$assistants, $at-trainers );
}   
}
return $assistants;
}

3. Test case producing error:

$trainers = 
$schema-resultset('Event')-events_during_lookback_period($lookback_period)-distinct_assistants();

The distinct_assistants() chained method is producing error:

DBIx::Class::ResultSet::next(): DBI Exception: DBD::mysql::st execute failed: 
Unknown column 'assistingtrainers.event' in 'group statement' [for Statement 
SELECT me.id, assistingtrainers.event, assistingtrainers.trainer, trainers.id, 
trainers.name, trainers.email, trainers.phone, trainers.initials, 
trainers.loginId, trainers.password FROM (SELECT me.id FROM event me WHERE ( ( 
( start  ? AND start  ? ) AND status  ? ) ) GROUP BY me.id, 
assistingtrainers.event, assistingtrainers.trainer, trainers.id, trainers.name, 
trainers.email, trainers.phone, trainers.initials, trainers.loginId, 
trainers.password) me LEFT JOIN trainer_assist assistingtrainers ON 
assistingtrainers.event = me.id LEFT JOIN trainer trainers ON trainers.id = 
assistingtrainers.trainer WHERE ( ( ( start  ? AND start  ? ) AND status  ? 
) ) ORDER BY assistingtrainers.event with ParamValues: 
0='2009-07-23T15:10:02', 1='2006-07-23T15:10:02', 2=2, 3='2009-07-23T15:10:02', 
4='2006-07-23T15:10:02', 5=2]

Can anyone see if any schema updates/tweaks are required to make this work?
Or, if I'm missing anything else or if I'm using incorrect syntax?
Or confirm if this is a bug?

Thanks in advance,
Anthony


___
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk


Re: [Dbix-class] Unknown column in 'group statement'

2009-07-23 Thread Peter Rabbitson
On Thu, Jul 23, 2009 at 04:19:01PM +0100, Anthony Gladdish wrote:
 Hi,
 
 Using:
 Perl 5.10.
 DBIC 0.08108.
 
 1. My result source tables with relationships are:
 
 Event.pm:
 __PACKAGE__-set_primary_key('id');
 __PACKAGE__-belongs_to( 'leader' = 'Trainer' ) ;
 __PACKAGE__-has_many( 'assistingtrainers' = 'AssistingTrainer', 'event' );
 __PACKAGE__-many_to_many('assistants' = 'assistingtrainers', 'trainers' );
 
 AssistingTrainer.pm:
 __PACKAGE__-set_primary_key('event','trainer');
 __PACKAGE__-belongs_to( 'events' = 'Event', 'event' );
 __PACKAGE__-belongs_to( 'trainers' = 'Trainer', 'trainer' );
 
 Trainer.pm:
 __PACKAGE__-set_primary_key('id');
 
 2. My ResultSet::Event.pm methods:
 
 sub goEvents {
   my $self  = shift;
   my $where = {};
   $where-{status} = { '' = 2 };
   return $self-search($where);
 }
 
 sub events_during_lookback_period {
   my $self  = shift;  
   my $default_lookback_period = DateTime::Duration-new( years = 3 );
   my $lookback_period = shift || $default_lookback_period;
   my $earliest_date = DateTime-now() - $lookback_period; 
   return $self-goEvents()-search_rs(
   {
   -and = [
   start = { '', DateTime-now() },
   start = { '', $earliest_date },
   ],
   }
   );
 }
 
 sub distinct_assistants {
   my $self  = shift;
   my $assistants = [];
   my $rs = $self-search_rs(
   undef,
   {
   columns = [ qw/me.id/ ],
   distinct = 1,
   prefetch = [ { 'assistingtrainers' = 'trainers' } ],
   join = [ { 'assistingtrainers' = 'trainers' } ],
   },
   );
   while ( my $e = $rs-next() ) { 
   foreach my $at ( $e-assistingtrainers() ) {
   push( @$assistants, $at-trainers );
   }   
   }
   return $assistants;
 }
 

This is a design lapse - we married distinct with group_by too early
in the code and what you are seeing is the fallout (i.e. distinct
applies to all columns not just the ones you are trying to select).
I will have to discuss this with the rest of the developers before
we solve it, but for the time being simply change

distinct = 1

to

group_by = [ qw/me.id/ ]

The prefetch will keep working as expected.

Cheers

___
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk