File Coverage

blib/lib/ArangoDB/Statement.pm
Criterion Covered Total %
statement 33 80 41.2
branch 0 18 0.0
condition 0 8 0.0
subroutine 11 20 55.0
pod 6 6 100.0
total 50 132 37.8


line stmt bran cond sub pod time code
1             package ArangoDB::Statement;
2 8     8   52 use strict;
  8         20  
  8         773  
3 8     8   46 use warnings;
  8         17  
  8         254  
4 8     8   47 use utf8;
  8         16  
  8         86  
5 8     8   340 use 5.008001;
  8         46  
  8         383  
6 8     8   46 use Carp qw(croak);
  8         15  
  8         614  
7 8     8   47 use JSON ();
  8         26  
  8         212  
8 8     8   43 use Scalar::Util qw(weaken);
  8         23  
  8         542  
9 8     8   6877 use ArangoDB::Cursor;
  8         18  
  8         286  
10 8     8   4940 use ArangoDB::BindVars;
  8         102  
  8         307  
11 8     8   49 use ArangoDB::Constants qw(:api);
  8         17  
  8         2675  
12              
13             use overload
14 0     0     q{""} => sub { $_[0]->{query} },
15 8     8   49 fallback => 1;
  8         18  
  8         92  
16              
17             sub new {
18 0     0 1   my ( $class, $conn, $query ) = @_;
19 0           my $self = bless {
20             connection => $conn,
21             query => $query,
22             bind_vars => ArangoDB::BindVars->new(),
23             }, $class;
24 0           weaken( $self->{connection} );
25 0           return $self;
26             }
27              
28             sub execute {
29 0     0 1   my ( $self, $options ) = @_;
30 0           my $data = $self->_build_data($options);
31 0           my $res = eval { $self->{connection}->http_post( API_CURSOR, $data ) };
  0            
32 0 0         if ($@) {
33 0           $self->_server_error_handler( $@, 'Failed to execute query' );
34             }
35 0           return ArangoDB::Cursor->new( $self->{connection}, $res );
36             }
37              
38             sub parse {
39 0     0 1   my $self = shift;
40 0           my $res = eval { $self->{connection}->http_post( API_QUERY, { query => $self->{query} } ) };
  0            
41 0 0         if ($@) {
42 0           $self->_server_error_handler( $@, 'Failed to parse query' );
43             }
44 0           return $res->{bindVars};
45             }
46              
47             sub explain {
48 0     0 1   my $self = shift;
49 0           my $data = { query => $self->{query}, bindVars => $self->{bind_vars}->get_all(), };
50 0           my $res = eval { $self->{connection}->http_post( API_EXPLAIN, $data ) };
  0            
51 0 0         if ($@) {
52 0           $self->_server_error_handler( $@, 'Failed to explain query' );
53             }
54 0           return $res->{plan};
55             }
56              
57             sub bind_vars {
58 0     0 1   my $self = shift;
59 0 0         if ( @_ == 0 ) {
60 0           return $self->{bind_vars}->get_all();
61             }
62             else {
63 0           my $name = shift;
64 0           return $self->{bind_vars}->get($name);
65             }
66             }
67              
68             sub bind {
69 0     0 1   my ($self) = shift;
70 0 0         if ( @_ == 1 ) {
71 0           $self->{bind_vars}->set( $_[0] );
72             }
73             else {
74 0           my ( $key, $value ) = @_;
75 0           $self->{bind_vars}->set( $key => $value );
76             }
77 0           return $self;
78             }
79              
80             sub _build_data {
81 0     0     my ( $self, $options ) = @_;
82 0 0         my $data = {
83             query => $self->{query},
84             count => $options->{do_count} ? JSON::true : JSON::false,
85             };
86              
87 0 0         if ( $self->{bind_vars}->count > 0 ) {
88 0           $data->{bindVars} = $self->{bind_vars}->get_all();
89             }
90              
91 0 0 0       if ( exists $options->{batch_size} && $options->{batch_size} > 0 ) {
92 0           $data->{batchSize} = $options->{batch_size};
93             }
94              
95 0           return $data;
96             }
97              
98             sub _server_error_handler {
99 0     0     my ( $self, $error, $message ) = @_;
100 0 0 0       if ( ref($error) && $error->isa('ArangoDB::ServerException') ) {
101 0   0       $message .= ':' . ( $error->detail->{errorMessage} || q{} );
102             }
103 0           croak $message;
104             }
105              
106             1;
107             __END__