The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Search::Xapian::Query;

use 5.006;
use strict;
use warnings;
use Carp;

require Exporter;
require DynaLoader;

our @ISA = qw(Exporter DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our @EXPORT_OK = ( );

our @EXPORT = qw( );

# Preloaded methods go here.

use overload '""' => sub { $_[0]->get_description() }, # FIXME: perhaps unwise?
             'fallback' => 1;

sub new {
  my $class = shift;
  my $query;
  my $invalid_args;

  if( scalar(@_) == 1 ) {
    $query = new1(@_);
  }
  else {
    my $op = shift;
    if( $op !~ /^[-+]?\d+$/ ) {
      Carp::carp( "new()'s first argument must be an OP when called with more than one argument" );
      $invalid_args++;
    }
    else {
      if( !_all_equal( map { ref } @_ ) ) {
        Carp::carp( "all of new()'s arguments after the first must be of identical type (either all search terms (scalars) or $class objects)");
        $invalid_args++;
      }
      else {
        # remaining arguments are scalars
        if( !ref($_[0]) ) {
          scalar(@_) == 1 ?
            $query = new2sv($op, @_) :
              $query = newXsv($op, @_);
        }
        # remaining arguments objects
        elsif( ref($_[0]) eq $class ) {
          scalar(@_) == 1 ?
            $query = new2obj($op, @_) :
              $query = newXobj($op, @_);
        }
        else {
          Carp::carp( "all of new()'s arguments after the first must be search terms (scalars), or $class objects" );
          $invalid_args++;
        }
      }
    }
  }
  if( $invalid_args ) {
    Carp::carp( "USAGE: $class->new('term'), $class->new(OP, \@terms) or $class->new(OP, \@queries)" );
    exit;
  }
  bless $query, $class;
  return $query;
}

sub new_term {
  my $class = shift;
  my $query;

  if (@_ < 1 or @_ > 3) {
    Carp::carp( "new_term takes 1, 2 or 3 arguments only" );
  }
  my ($term, $wqf, $pos) = @_;
  $wqf = 1 unless defined $wqf;
  $pos = 0 unless defined $pos;

  $query = new1weight($term, $wqf, $pos);

  bless $query, $class;
  return $query;
}

sub _all_equal {
  my $first = shift;
  while(@_) {
    return 0 if $first ne shift;
  }
  return 1;
}

sub get_terms {
    my $self = shift;
    my @terms;
    my $q=$self->get_terms_begin;
    while ($q ne $self->get_terms_end) {
        push @terms,$q->get_termname;
        $q++;
    }
    return @terms;
}

1;