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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object