The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DBIx::SQLEngine::Criteria::HashGroup;
use DBIx::SQLEngine::Criteria;
@ISA = 'DBIx::SQLEngine::Criteria';
use strict;

use DBIx::SQLEngine::Criteria::And;
use DBIx::SQLEngine::Criteria::Or;
use DBIx::SQLEngine::Criteria::StringComparison;
# 2004-02-24 Switched to StringComparison based on suggestion from Michael Kroll
# use DBIx::SQLEngine::Criteria::StringEquality;

use Class::MakeMethods (
  'Composite::Hash:new' => [ 'new', {modifier => 'with_values'} ],
);

sub normalized {
  my $hashref = shift;
  
  DBIx::SQLEngine::Criteria::And->new(
    map {
      my ($key, $value) = ($_, $hashref->{$_});
      ( ref( $value ) eq 'ARRAY' ) 
	? DBIx::SQLEngine::Criteria::Or->new( 
	    map {
              DBIx::SQLEngine::Criteria::StringComparison->new( $key, $_ ) 
	    } @$value
	  )
	: DBIx::SQLEngine::Criteria::StringComparison->new($key, $value)
    } sort keys %$hashref 
  )
}

sub sql_where {
  (shift)->normalized->sql_where( @_ ) 
}

1;

__END__

########################################################################

=head1 NAME

DBIx::SQLEngine::Criteria::HashGroup - A group of string criteria

=head1 SYNOPSIS

  my $crit = DBIx::SQLEngine::Criteria::HashGroup->new( 
    customer => 'Acme Inc.', status => [ 'open', 'pending' ]
  );


=head1 DESCRIPTION

DBIx::SQLEngine::Criteria::HashGroup objects provide a convenient way to bundle several criteria together in a Perl hash structure. 

Each key-value pair is converted to a StringComparison Criteria, except if the value is an array reference, which produces an Or group of StringComparisons that will match any one of the provided values.

=head2 Evaluation

=over 4

=item sql_where () $sql_where_expression

  $criteria->sql_where() : $sql, @params

Generates SQL criteria expression. 

=item normalized()

Called by sql_where to convert the hash structure into simpler criteria objects.

=back


=head1 SEE ALSO

See L<DBIx::SQLEngine::Criteria> and L<DBIx::SQLEngine::Criteria::Comparison>
for more information on using these objects.

See L<DBIx::SQLEngine> for the overall interface and developer documentation.

See L<DBIx::SQLEngine::Docs::ReadMe> for general information about
this distribution, including installation and license information.

=cut