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 )