ArangoDB
view release on metacpan or search on metacpan
lib/ArangoDB/Statement.pm view on Meta::CPAN
package ArangoDB::Statement;
use strict;
use warnings;
use utf8;
use 5.008001;
use Carp qw(croak);
use JSON ();
use Scalar::Util qw(weaken);
use ArangoDB::Cursor;
use ArangoDB::BindVars;
use ArangoDB::Constants qw(:api);
use overload
q{""} => sub { $_[0]->{query} },
fallback => 1;
sub new {
my ( $class, $conn, $query ) = @_;
my $self = bless {
connection => $conn,
query => $query,
bind_vars => ArangoDB::BindVars->new(),
}, $class;
weaken( $self->{connection} );
return $self;
}
sub execute {
my ( $self, $options ) = @_;
my $data = $self->_build_data($options);
my $res = eval { $self->{connection}->http_post( API_CURSOR, $data ) };
if ($@) {
$self->_server_error_handler( $@, 'Failed to execute query' );
}
return ArangoDB::Cursor->new( $self->{connection}, $res );
}
sub parse {
my $self = shift;
my $res = eval { $self->{connection}->http_post( API_QUERY, { query => $self->{query} } ) };
if ($@) {
$self->_server_error_handler( $@, 'Failed to parse query' );
}
return $res->{bindVars};
}
sub explain {
my $self = shift;
my $data = { query => $self->{query}, bindVars => $self->{bind_vars}->get_all(), };
my $res = eval { $self->{connection}->http_post( API_EXPLAIN, $data ) };
if ($@) {
$self->_server_error_handler( $@, 'Failed to explain query' );
}
return $res->{plan};
}
sub bind_vars {
my $self = shift;
if ( @_ == 0 ) {
return $self->{bind_vars}->get_all();
}
else {
my $name = shift;
return $self->{bind_vars}->get($name);
}
}
sub bind {
my ($self) = shift;
if ( @_ == 1 ) {
$self->{bind_vars}->set( $_[0] );
}
else {
my ( $key, $value ) = @_;
$self->{bind_vars}->set( $key => $value );
}
return $self;
}
sub _build_data {
my ( $self, $options ) = @_;
my $data = {
query => $self->{query},
count => $options->{do_count} ? JSON::true : JSON::false,
( run in 0.579 second using v1.01-cache-2.11-cpan-39bf76dae61 )