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 > ...
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.
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