File Coverage

blib/lib/MongoDB/Op/_Distinct.pm
Criterion Covered Total %
statement 24 36 66.6
branch 0 6 0.0
condition 0 5 0.0
subroutine 8 9 88.8
pod 0 1 0.0
total 32 57 56.1


line stmt bran cond sub pod time code
1             # Copyright 2015 - present MongoDB, Inc.
2             #
3             # Licensed under the Apache License, Version 2.0 (the "License");
4             # you may not use this file except in compliance with the License.
5             # You may obtain a copy of the License at
6             #
7             # http://www.apache.org/licenses/LICENSE-2.0
8             #
9             # Unless required by applicable law or agreed to in writing, software
10             # distributed under the License is distributed on an "AS IS" BASIS,
11             # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12             # See the License for the specific language governing permissions and
13             # limitations under the License.
14              
15 59     59   367 use strict;
  59         124  
  59         1609  
16 59     59   272 use warnings;
  59         117  
  59         2057  
17             package MongoDB::Op::_Distinct;
18              
19             # Encapsulate distinct operation; return MongoDB::QueryResult
20              
21 59     59   285 use version;
  59         110  
  59         351  
22             our $VERSION = 'v2.2.2';
23              
24 59     59   4398 use Moo;
  59         123  
  59         303  
25              
26 59     59   17208 use MongoDB::Op::_Command;
  59         145  
  59         1567  
27 59         511 use MongoDB::_Types qw(
28             Document
29 59     59   374 );
  59         146  
30 59         362 use Types::Standard qw(
31             InstanceOf
32             HashRef
33             Str
34 59     59   54727 );
  59         138  
35              
36 59     59   47646 use namespace::clean;
  59         130  
  59         397  
37              
38             has client => (
39             is => 'ro',
40             required => 1,
41             isa => InstanceOf ['MongoDB::MongoClient'],
42             );
43              
44             has fieldname=> (
45             is => 'ro',
46             required => 1,
47             isa => Str,
48             );
49              
50             has filter => (
51             is => 'ro',
52             required => 1,
53             isa => Document,
54             );
55              
56             has options => (
57             is => 'ro',
58             required => 1,
59             isa => HashRef,
60             );
61              
62             with $_ for qw(
63             MongoDB::Role::_PrivateConstructor
64             MongoDB::Role::_CollectionOp
65             MongoDB::Role::_ReadOp
66             MongoDB::Role::_CommandCursorOp
67             );
68              
69             sub execute {
70 0     0 0   my ( $self, $link, $topology ) = @_;
71              
72 0           my $options = $self->options;
73              
74 0 0 0       if ( defined $options->{collation} and !$link->supports_collation ) {
75 0           MongoDB::UsageError->throw(
76             "MongoDB host '" . $link->address . "' doesn't support collation" );
77             }
78              
79             my $filter =
80             ref( $self->filter ) eq 'ARRAY'
81 0 0         ? { @{ $self->filter } }
  0            
82             : $self->filter;
83              
84             my @command = (
85             distinct => $self->coll_name,
86             key => $self->fieldname,
87             query => $filter,
88             ($link->supports_read_concern ?
89 0 0         @{ $self->read_concern->as_args( $self->session) } : ()),
  0            
90             %$options
91             );
92              
93 0           my $op = MongoDB::Op::_Command->_new(
94             db_name => $self->db_name,
95             query => Tie::IxHash->new(@command),
96             query_flags => {},
97             read_preference => $self->read_preference,
98             bson_codec => $self->bson_codec,
99             session => $self->session,
100             monitoring_callback => $self->monitoring_callback,
101             );
102              
103 0           my $res = $op->execute( $link, $topology );
104              
105             $res->output->{cursor} = {
106             ns => '',
107             id => 0,
108 0   0       firstBatch => ( delete $res->output->{values} ) || [],
109             };
110              
111 0           return $self->_build_result_from_cursor($res);
112             }
113              
114             1;