Skip to content

Commit fe1b623

Browse files
committed
Add parent object to hold query objects
This allows query objects to fetch the parent object, and then fetch other query objects via it. This makes it much easier for query methods to call other query objects, which is needed for convert some of the model queries.
1 parent 4e208b1 commit fe1b623

File tree

3 files changed

+134
-2
lines changed

3 files changed

+134
-2
lines changed

lib/MetaCPAN/Query.pm

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package MetaCPAN::Query;
2+
use Moose;
3+
4+
use Module::Runtime qw( require_module );
5+
use Module::Pluggable::Object ();
6+
use MooseX::Types::ElasticSearch qw( ES );
7+
8+
has es => (
9+
is => 'ro',
10+
required => 1,
11+
isa => ES,
12+
coerce => 1,
13+
);
14+
15+
my @plugins = Module::Pluggable::Object->new(
16+
search_path => [__PACKAGE__],
17+
max_depth => 3,
18+
require => 0,
19+
)->plugins;
20+
21+
for my $class (@plugins) {
22+
require_module($class);
23+
my $name = $class->can('name') && $class->name
24+
or next;
25+
26+
my $in = "_in_$name";
27+
my $gen = "_gen_$name";
28+
29+
has $in => (
30+
is => 'ro',
31+
init_arg => $name,
32+
weak_ref => 1,
33+
);
34+
35+
has $gen => (
36+
is => 'ro',
37+
init_arg => undef,
38+
lazy => 1,
39+
default => sub {
40+
my $self = shift;
41+
require_module($class);
42+
$class->new(
43+
es => $self->es,
44+
query => $self,
45+
);
46+
},
47+
);
48+
49+
no strict 'refs';
50+
*$name = sub { $_[0]->$in // $_[0]->$gen };
51+
}
52+
53+
1;

lib/MetaCPAN/Query/Role/Common.pm

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,46 @@
11
package MetaCPAN::Query::Role::Common;
2-
32
use Moose::Role;
43

5-
has es => ( is => 'ro', );
4+
use MetaCPAN::Query ();
5+
use MooseX::Types::ElasticSearch qw( ES );
6+
7+
has es => (
8+
is => 'ro',
9+
required => 1,
10+
isa => ES,
11+
coerce => 1,
12+
);
13+
14+
sub name {
15+
my $self = shift;
16+
my $class = ref $self || $self;
17+
18+
$class =~ /^MetaCPAN::Query::([^:]+)$/
19+
or return undef;
20+
return lc $1;
21+
}
22+
23+
has _in_query => (
24+
is => 'ro',
25+
init_arg => 'query',
26+
weak_ref => 1,
27+
);
28+
29+
has _gen_query => (
30+
is => 'ro',
31+
lazy => 1,
32+
init_arg => undef,
33+
default => sub {
34+
my $self = shift;
35+
my $name = $self->name;
36+
37+
MetaCPAN::Query->new(
38+
es => $self->es,
39+
( $name ? ( $name => $self ) : () ),
40+
);
41+
},
42+
);
43+
44+
sub query { $_[0]->_in_query // $_[0]->_gen_query }
645

746
1;

t/query.t

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use strict;
2+
use warnings;
3+
4+
use lib 't/lib';
5+
6+
use MetaCPAN::Query;
7+
use MetaCPAN::Server::Test ();
8+
use Test::More;
9+
use Scalar::Util qw(weaken);
10+
11+
my $es = MetaCPAN::Server::Test::model->es;
12+
13+
{
14+
my $query = MetaCPAN::Query->new( es => $es );
15+
my $release = $query->release;
16+
17+
isa_ok $release, 'MetaCPAN::Query::Release';
18+
is $release->query, $query, 'got same parent object';
19+
20+
weaken $release;
21+
weaken $query;
22+
is $query, undef, 'parent object properly released';
23+
is $release, undef, 'release object properly released';
24+
25+
}
26+
27+
{
28+
my $release = MetaCPAN::Query::Release->new( es => $es );
29+
my $query = $release->query;
30+
31+
isa_ok $query, 'MetaCPAN::Query';
32+
is $query->release, $release, 'got same child object';
33+
34+
weaken $release;
35+
weaken $query;
36+
is $query, undef, 'parent object properly released';
37+
is $release, undef, 'release object properly released';
38+
}
39+
40+
done_testing;

0 commit comments

Comments
 (0)