[Dbix-class] @bind confusion

Peter Rabbitson rabbit+dbic at rabbit.us
Tue Aug 3 12:34:57 GMT 2010


Wolfgang Kinkeldei wrote:
> Hi Peter,
> 
> If you need the full schema files, I could provide a tarball for you.

No need for these.

> This is the search taken from my project. The points marked like (1), (2), (3) contain places where changes make the query work or fail.
> 
> <snipped a lot of stuff>
> 
> my $nr_uploads =
>     $schema->resultset('Subelement')
>     ...
>       ->count_rs
>       ->as_query;
> 
> my $nr_uploads_done =
>     $schema->resultset('File')
>       ->search(
>           {
>             ...
>           },
>           {
>               alias => 'file',
>               join => {subelement => ['step', 'element']},
>               select => 'count(*)',
>               as => 'nr_uploads_done',
>           })
>       ->as_query;
> 
> 
> my $concept_rs =
>     $schema->resultset('Concept')
>       ->search(
>           {
>             ...
>           },
>           {
>               'select' => [
>                 ...
>                 $nr_uploads,
>                 $nr_uploads_done,
>               ],
>               ...
>           });
>           
> my @concepts = $concept_rs->all;
> 

 From this you have the supposedly working:

> SELECT me.concept_id,
>        me.name,
>        me.job_no,
>        step.name,
>        Folder_name(me.name || '_' || me.job_no, me.concept_id),
>        (SELECT COUNT(*)
>         FROM   subelement subelement
>                JOIN step step
>                  ON step.step_id = subelement.step_id
>                JOIN element element
>                  ON element.element_id = subelement.element_id
>         WHERE  (( element.concept_id = me.concept_id
>                   AND step.flags ~ ? ))
>        ),
>        (SELECT COUNT(*)
>         FROM   FILE FILE
>                LEFT JOIN subelement subelement
>                  ON subelement.subelement_id = FILE.subelement_id
>                LEFT JOIN element element
>                  ON element.element_id = subelement.element_id
>         WHERE  (( element.concept_id = me.concept_id
>                   AND FILE.origin = 'satellite'
>                   AND FILE.path ~ '/A001' ))
>         )
> FROM concept me ...

Which is *just as bogus* as your original query. The insides of each $count_rs
are not correlated to anything outside of the parenthesis that enclose the first
SELECT statement. As I noted previously - you might as well be selecting random
hardcoded values - there will be no change in the result.

->count_rs->as_query was not designed to be used in a select => [] list, because
it is *completely useless* there (as it provides a standalone number, *insulated from
any higher-up queries*). All it can be used for is in WHERE clauses to compare counts
of something to either a column value or a function result or something.

Of course I may be missing something - feel free to correct me if this is the case.

Cheers



More information about the DBIx-Class mailing list