On Sun, 3 Dec 2006, John Siracusa wrote:

> This will do what you want:
>
>     $events =
>       WatchLAN::Activity::Manager->get_some_table(
>         distinct => 1,
>         select   => [ 'some_val ' ],
>         query    => [ event_time => { gt => ... } ]);
>
> but keep in mind that it'll return objects that have no data in them other
> than the value of the "some_val" column.

Gotcha, thanks.

By the way, this might be a stretch, but what I would really want is a
query like

    SELECT MAX(event_time), some_val
    FROM some_table
    WHERE event_time > "2006-12-03 08:39:00"
    GROUP BY some_val;

that would give me only the *newest* some_val. Is there a way to
tell that to the manager?

-- Mike

Mike Schilli
[EMAIL PROTECTED]

> On 12/3/06 2:02 PM, [EMAIL PROTECTED] wrote:
> > I'd like to perform a query like
> >
> >     SELECT DISTINCT some_val from some_table
> >     WHERE event_time > ...
> >
> > to get all distinct values of some_val after a given time. Using
> >
> >     my $events = WatchLAN::Activity::Manager->get_some_table(
> >         query      => [ event_time => { gt => ... },
> >                       ],
> >         distinct   => 1,
> >     );
> >
> > yields
> >
> >     SELECT DISTINCT id, event_time, some_val from some_table
> >     WHERE event_time > ...
>

> Really, this is not an appropriate of use of get_objects() since the
> returned objects are not linked with their corresponding rows in the
> database.  Were you to try to save() one, for example, it'll blow up:
>
>     $events->[0]->save; # fatal error!
>
> because each object *thinks* its a representations of a uniquely identified,
> existing row in the database.  Instead, in this case, each object is just a
> trivial container for a distinct value of some_val--which many actual rows
> in the table may have.
>
> A more appropriate solution would use a "get_results()" Manager method that
> does not return RDBO-derived objects, but rather just returns data.  Such a
> Manager method does not exist yet, but it's on my TODO list.  In the
> meantime you can be a bit more "pure" by making your own wrapper method that
> pulls the some_val values out of the objects and returns them "bare."
> Something like this:
>
>   package WatchLAN::Activity::Manager;
>   ...
>   sub get_distinct_values
>   {
>     my($class) = shift;
>
>     my %args   = (@_ == 1) ? (column => $_[0]) : @_;
>
>     my $column = delete $args{'column'};
>     my $method = Item->meta->column($column)->accessor_method_name;
>
>     my $items  = $class->get_items(distinct => 1, select => $column, %args);
>     my @vals   = map { $_->$method() } @$items;
>
>     return wantarray ? @vals : [EMAIL PROTECTED];
>   }
>
> Then you can do this:
>
>   @all_vals = WatchLAN::Activity::Manager->get_distinct_values('some_val');
>
>   @certain_vals =
>     WatchLAN::Activity::Manager->get_distinct_values(
>       column => 'some_val',
>       query  => [ event_time => { gt => ... } ]);
>
> and so on.  Generalizing get_distinct_values() to work for any Manager class
> is left as an exercise for the reader (hint: "object_class" param)
>
> -John
>
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Rose-db-object mailing list
> Rose-db-object@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rose-db-object
>


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to