Skip to content

Commit

Permalink
convert to Moo
Browse files Browse the repository at this point in the history
  • Loading branch information
Peter Karman committed Apr 7, 2014
1 parent 78b3c3c commit 70668c1
Show file tree
Hide file tree
Showing 10 changed files with 228 additions and 180 deletions.
3 changes: 2 additions & 1 deletion Makefile.PL
Expand Up @@ -23,7 +23,8 @@ WriteMakefile(
PREREQ_PM => {
'Test::More' => 0,
'Data::Dump' => 0,
'Rose::ObjectX::CAF' => 0.03,
'Moo' => '0.03',
'namespace::sweep' => 0,
'Data::Transformer' => 0,
'Scalar::Util' => 0,
'Module::Pluggable' => 0,
Expand Down
17 changes: 12 additions & 5 deletions lib/Search/Query/Clause.pm
@@ -1,17 +1,21 @@
package Search::Query::Clause;
use strict;
use warnings;
use Moo;
use Carp;
use base qw( Rose::ObjectX::CAF );
use Scalar::Util qw( blessed );
use overload
'""' => sub { $_[0]->stringify; },
'bool' => sub {1},
fallback => 1;

use namespace::sweep;

our $VERSION = '0.25';

__PACKAGE__->mk_accessors(qw( field op value quote proximity ));
has 'field' => ( is => 'rw' );
has 'op' => ( is => 'rw' );
has 'value' => ( is => 'rw' );
has 'quote' => ( is => 'rw' );
has 'proximity' => ( is => 'rw' );

=head1 NAME
Expand Down Expand Up @@ -118,7 +122,10 @@ sub stringify {
}
}
else {
return sprintf( "%s%s%s", ($self->field||''), ($self->op||''), $self->value, );
return sprintf( "%s%s%s",
( $self->field || '' ),
( $self->op || '' ),
$self->value, );
}

}
Expand Down
67 changes: 52 additions & 15 deletions lib/Search/Query/Dialect.pm
@@ -1,18 +1,27 @@
package Search::Query::Dialect;
use strict;
use warnings;
use Moo;
use Carp;
use Data::Dump qw( dump );
use overload
'""' => sub { $_[0]->stringify; },
'bool' => sub {1},
fallback => 1;

use base qw( Rose::ObjectX::CAF );
use Data::Transformer;
use Scalar::Util qw( blessed );

__PACKAGE__->mk_accessors(qw( default_field parser debug ));
use namespace::sweep;

has default_field => ( is => 'rw' );
has parser => ( is => 'ro' );
has debug => (
is => 'rw',
isa => sub {
if ( defined( $_[0] ) and $_[0] =~ m/\D/ ) {
confess "$_[0] should be an int";
}
},
default => ( $ENV{PERL_DEBUG} || 0 ),
);

our $VERSION = '0.25';

Expand Down Expand Up @@ -59,6 +68,17 @@ Get/set flag.
Standard attribute accessor. Default value is undef.
=head2 init
B<DEPRECATED>. Use BUILD() instead.
=cut

sub init {
my $self = shift;
confess "Use BUILD() instead of init()";
}

=head2 stringify
All subclasses must override this method. The default behavior is to croak.
Expand Down Expand Up @@ -287,28 +307,45 @@ Default is 'Search::Query::Field'.
=cut

sub field_class {
return 'Search::Query::Field';
}
sub field_class {'Search::Query::Field'}

sub _get_default_field {
my $self = shift;
my $field = $self->default_field || $self->parser->default_field;
=head2 get_default_field
Returns the default field for this Dialect.
=cut

sub get_default_field {
my $self = shift;
my $field = $self->default_field;
$field = $self->parser->default_field unless defined $field;
if ( !defined $field ) {
croak "must define a default_field";
confess "must define a default_field";
}
return ref $field ? $field : [$field];
}

sub _get_field {
=head2 get_field( I<field_name> )
Returns a Field object instance for I<field_name>. The object
will be an instance of B<field_class>.
This is a shorthand wrapper around the method of the same
name in the internal B<parser> object.
=cut

sub get_field {
my $self = shift;
my $name = shift or croak "field name required";
my $field = $self->parser->get_field($name);
if ( !$field ) {
if ( $self->parser->croak_on_error ) {
croak "invalid field name: $name";
confess "invalid field name: $name";
}
$field = $self->field_class->new( name => $name );
my $field_class = $self->field_class;
carp "field_class=$field_class";
$field = $field_class->new( name => $name );
}
return $field;
}
Expand Down
60 changes: 30 additions & 30 deletions lib/Search/Query/Dialect/SQL.pm
@@ -1,22 +1,19 @@
package Search::Query::Dialect::SQL;
use strict;
use warnings;
use base qw( Search::Query::Dialect );
use Moo;
extends 'Search::Query::Dialect';
use Carp;
use Data::Dump qw( dump );
use Search::Query::Field::SQL;

__PACKAGE__->mk_accessors(
qw(
wildcard
quote_fields
fuzzify
fuzzify2
like
quote_char
fuzzy_space
)
);
use namespace::sweep;

has 'wildcard' => ( is => 'rw', default => sub {'%'} );
has 'quote_fields' => ( is => 'rw', default => sub {''} );
has 'fuzzify' => ( is => 'rw' );
has 'fuzzify2' => ( is => 'rw' );
has 'like' => ( is => 'rw', default => sub {'ILIKE'}, );
has 'quote_char' => ( is => 'rw', default => sub {q/'/}, );
has 'fuzzy_space' => ( is => 'rw', default => sub {' '}, );

our $VERSION = '0.25';

Expand Down Expand Up @@ -44,9 +41,9 @@ methods are documented here.
=cut

=head2 init
=head2 BUILD
Overrides the base method. Can accept the following params, which
Called by new(). The new() constructor can accept the following params, which
are also standard attribute accessors:
=over
Expand Down Expand Up @@ -88,13 +85,10 @@ The string to use to pad fuzzified terms. Default is a single space C< >.
=cut

sub init {
sub BUILD {
my $self = shift;
$self->SUPER::init(@_);

#carp dump $self;
$self->{wildcard} ||= '%';
$self->{quote_fields} = '' unless exists $self->{quote_fields};
if ( !defined $self->parser->fields ) {
croak "You must set fields in the Search::Query::Parser";
}
Expand All @@ -103,9 +97,6 @@ sub init {
if ( $self->{default_field} and !ref( $self->{default_field} ) ) {
$self->{default_field} = [ $self->{default_field} ];
}
$self->{like} ||= 'ILIKE';
$self->{quote_char} = q/'/ unless exists $self->{quote_char};
$self->{fuzzy_space} = ' ' unless exists $self->{fuzzy_space};
return $self;
}

Expand Down Expand Up @@ -200,7 +191,7 @@ sub stringify_clause {
my @fields
= $clause->{field}
? ( $clause->{field} )
: ( @{ $self->_get_default_field } );
: ( @{ $self->get_default_field } );

# what value
my $value = $self->_doctor_value($clause);
Expand All @@ -219,7 +210,7 @@ sub stringify_clause {

my @buf;
NAME: for my $name (@fields) {
my $field = $self->_get_field($name);
my $field = $self->get_field($name);
$value =~ s/\%//g if $field->is_int;
my $this_op;

Expand Down Expand Up @@ -325,16 +316,25 @@ NAME: for my $name (@fields) {
. ( scalar(@buf) > 1 ? ')' : '' );
}

sub _get_field {
=head2 get_field
Overrides default to set fuzzy_op and fuzzy_not_op.
=cut

around get_field => sub {
my $orig = shift;
my $self = shift;
my $field = $self->SUPER::_get_field(@_);
my $field = $orig->( $self, @_ );

# fix up the operator based on our like() setting
$field->fuzzy_op( $self->like ) if !$field->is_int;
$field->fuzzy_not_op( 'NOT ' . $self->like ) if !$field->is_int;
if ( !$field->is_int and $self->like ) {
$field->fuzzy_op( $self->like );
$field->fuzzy_not_op( 'NOT ' . $self->like );
}

return $field;
}
};

=head2 field_class
Expand Down
53 changes: 29 additions & 24 deletions lib/Search/Query/Dialect/SWISH.pm
@@ -1,19 +1,16 @@
package Search::Query::Dialect::SWISH;
use strict;
use warnings;
use base qw( Search::Query::Dialect );
use Moo;
extends 'Search::Query::Dialect';
use Carp;
use Data::Dump qw( dump );
use Search::Query::Field::SWISH;
use Try::Tiny;

our $VERSION = '0.25';

__PACKAGE__->mk_accessors(
qw(
wildcard
fuzzify
)
);
has 'wildcard' => ( is => 'rw', default => '*' );
has 'fuzzify' => ( is => 'rw' );
has '+default_field' => ( is => 'rw', default => 'swishdefault' );

=head1 NAME
Expand All @@ -39,9 +36,10 @@ methods are documented here.
=cut

=head2 init
=head2 BUILD
Sets SWISH-appropriate defaults.
Overrides base method and sets SWISH-appropriate defaults.
Can take the following params, also available as standard attribute
methods.
Expand All @@ -55,32 +53,39 @@ Default is '*'.
If true, a wildcard is automatically appended to each query term.
=item default_field
Default is 'swishdefault'.
=back
=cut

sub init {
sub BUILD {
my $self = shift;

$self->SUPER::init(@_);

#carp dump $self;
$self->{wildcard} = '*';

$self->{default_field} ||= $self->parser->default_field
|| 'swishdefault';

my $swishdefault_field;
eval { $swishdefault_field = $self->parser->get_field('swishdefault'); };
# make sure we have our default field defined amongst all parser fields.
my $swishdefault_field = try {
$self->parser->get_field('swishdefault');
}
catch {
carp "swishdefault not amongst parser fields: $_";
};
if ( !$swishdefault_field ) {
$self->parser->{fields}->{swishdefault}
= Search::Query::Field::SWISH->new( name => 'swishdefault' );
$self->parser->set_field( 'swishdefault',
Search::Query::Field::SWISH->new( name => 'swishdefault' ) );
}

#carp "swishdefault_field=" . dump($swishdefault_field);

if ( $self->{default_field} and !ref( $self->{default_field} ) ) {
$self->{default_field} = [ $self->{default_field} ];
}

#carp dump $self;

return $self;
}

Expand Down Expand Up @@ -162,7 +167,7 @@ sub stringify_clause {
my @fields
= $clause->{field}
? ( $clause->{field} )
: ( @{ $self->_get_default_field } );
: ( @{ $self->get_default_field } );

# what value
my $value
Expand Down Expand Up @@ -196,7 +201,7 @@ sub stringify_clause {

my @buf;
NAME: for my $name (@fields) {
my $field = $self->_get_field($name);
my $field = $self->get_field($name);

if ( defined $field->callback ) {
push( @buf, $field->callback->( $field, $op, $value ) );
Expand Down

0 comments on commit 70668c1

Please sign in to comment.