Changeset 32492 for lang/perl/Data-Model

Show
Ignore:
Timestamp:
04/16/09 19:13:01 (4 years ago)
Author:
yappo
Message:

unique index query support for find_or_create

Location:
lang/perl/Data-Model/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Data-Model/trunk/lib/Data/Model/Mixin/FindOrCreate.pm

    r32455 r32492  
    22use strict; 
    33use warnings; 
     4 
     5use Carp (); 
    46 
    57sub register_method { 
     
    1113sub find_or_create { 
    1214    my($self, $model, $key, $columns) = @_; 
    13     my $row = $self->lookup( $model => $key ); 
    14     return $row if $row; 
     15    my $row; 
     16    if (ref($key) eq 'HASH') { 
     17        # use on unique index 
     18        my($index, $value) = %{ $key }; 
     19        Carp::corak('index name is required') unless $index; 
    1520 
    16     $self->set( $model => $key => $columns ); 
     21        my $schema = $self->get_schema($model); 
     22        Carp::croak("'$index' is not unique index") unless $schema->unique->{$index}; 
     23 
     24        ($row) = $self->get($model, { index => { $index => $value } }); 
     25        return $row if $row; 
     26        $self->set( $model => $columns ); 
     27    } else { 
     28        # primary key 
     29 
     30        $row = $self->lookup( $model => $key ); 
     31        return $row if $row; 
     32        $self->set( $model => $key => $columns ); 
     33    } 
     34 
    1735} 
    1836 
     
    4159  ); 
    4260 
     61  # using unique index, but not use normal index 
     62  $model->find_or_create( 
     63      tablename => { unique_idx => 'key' } => { 
     64          field1 => 'value', 
     65          field2 => 'value', 
     66      } 
     67  ); 
     68 
     69  $model->find_or_create( 
     70      tablename => { unique_idx => [qw/ key1 key2 /] } => { 
     71          field1 => 'value', 
     72          field2 => 'value', 
     73      } 
     74  ); 
     75 
    4376=cut 
    4477 
  • lang/perl/Data-Model/trunk/t/050_mixin/find_or_create.t

    r32455 r32492  
    11use t::Utils; 
    2 use Test::More tests => 53; 
     2use Test::More tests => 107; 
    33 
    44my $dsn = 'dbi:SQLite:dbname=' . temp_filename; 
     
    2525        columns qw/id1 id2 data/; 
    2626    }; 
     27 
     28    install_model test3 => schema { 
     29        unique single_unique => 'id'; 
     30        columns qw/id data/; 
     31    }; 
     32 
     33    install_model test4 => schema { 
     34        unique multi_unique => [qw/ id1 id2 /]; 
     35        columns qw/id1 id2 data/; 
     36    }; 
     37 
     38    install_model test5 => schema { 
     39        index single_index => 'id'; 
     40        columns qw/id data/; 
     41    }; 
    2742} 
    2843 
     
    3045setup_schema( $dsn => $model->as_sqls ); 
    3146 
     47# single primary key 
    3248do { 
    3349    my $set = $model->find_or_create( 
     
    87103}; 
    88104 
     105# multi primary key 
    89106do { 
    90107    my $set = $model->find_or_create( 
     
    150167}; 
    151168 
     169# single unique 
     170do { 
     171    my $set = $model->find_or_create( 
     172        test3 => { single_unique => 'key1' } => { 
     173            id   => 'key1', 
     174            data => 'data1', 
     175        } 
     176    ); 
     177    isa_ok($set, 'TestModel::test3'); 
     178    is($set->id, 'key1', 'id'); 
     179    is($set->data, 'data1', 'data'); 
     180 
     181    my $get = $model->find_or_create( 
     182        test3 => { single_unique => 'key1' } => { 
     183            id   => 'key1', 
     184            data => 'data1', 
     185        } 
     186    ); 
     187    isa_ok($get, 'TestModel::test3'); 
     188    is($get->id, 'key1', 'id'); 
     189    is($get->data, 'data1', 'data'); 
     190 
     191    my @rows = $model->get( 'test3' ); 
     192    is(scalar(@rows), 1, '1 record'); 
     193 
     194    isa_ok($rows[0], 'TestModel::test3'); 
     195    is($rows[0]->id, 'key1', 'id'); 
     196    is($rows[0]->data, 'data1', 'data'); 
     197 
     198 
     199    my $set2 = $model->find_or_create( 
     200        test3 => { single_unique => 'key2' } => { 
     201            id   => 'key2', 
     202            data => 'data2', 
     203        } 
     204    ); 
     205    isa_ok($set2, 'TestModel::test3'); 
     206    is($set2->id, 'key2', 'id'); 
     207    is($set2->data, 'data2', 'data'); 
     208 
     209    my $get2 = $model->find_or_create( 
     210        test3 => { single_unique => 'key2' } => { 
     211            id   => 'key2', 
     212            data => 'data2', 
     213        } 
     214    ); 
     215    isa_ok($get2, 'TestModel::test3'); 
     216    is($get2->id, 'key2', 'id'); 
     217    is($get2->data, 'data2', 'data'); 
     218 
     219    @rows = $model->get( 'test3' ); 
     220    is(scalar(@rows), 2, '2 record'); 
     221 
     222    isa_ok($rows[0], 'TestModel::test3'); 
     223    is($rows[0]->id, 'key1', 'id'); 
     224    is($rows[0]->data, 'data1', 'data'); 
     225 
     226    isa_ok($rows[1], 'TestModel::test3'); 
     227    is($rows[1]->id, 'key2', 'id'); 
     228    is($rows[1]->data, 'data2', 'data'); 
     229}; 
     230 
     231# multi primary key 
     232do { 
     233    my $set = $model->find_or_create( 
     234        test4 => { multi_unique => [qw/ key10 key20 /] } => { 
     235            id1  => 'key10', 
     236            id2  => 'key20', 
     237            data => 'data1', 
     238        } 
     239    ); 
     240    isa_ok($set, 'TestModel::test4'); 
     241    is($set->id1, 'key10', 'id1'); 
     242    is($set->id2, 'key20', 'id2'); 
     243    is($set->data, 'data1', 'data'); 
     244 
     245    my $get = $model->find_or_create( 
     246        test4 => { multi_unique => [qw/ key10 key20 /] } => { 
     247            id1  => 'key10', 
     248            id2  => 'key20', 
     249            data => 'data1', 
     250        } 
     251    ); 
     252    isa_ok($get, 'TestModel::test4'); 
     253    is($get->id1, 'key10', 'id1'); 
     254    is($get->id2, 'key20', 'id2'); 
     255    is($get->data, 'data1', 'data'); 
     256 
     257    my @rows = $model->get( 'test4' ); 
     258    is(scalar(@rows), 1, '1 record'); 
     259 
     260    isa_ok($rows[0], 'TestModel::test4'); 
     261    is($rows[0]->id1, 'key10', 'id1'); 
     262    is($rows[0]->id2, 'key20', 'id2'); 
     263    is($rows[0]->data, 'data1', 'data'); 
     264 
     265    my $set2 = $model->find_or_create( 
     266        test4 => { multi_unique => [qw/ key11 key21 /] } => { 
     267            id1  => 'key11', 
     268            id2  => 'key21', 
     269            data => 'data2', 
     270        } 
     271    ); 
     272    isa_ok($set2, 'TestModel::test4'); 
     273    is($set2->id1, 'key11', 'id1'); 
     274    is($set2->id2, 'key21', 'id2'); 
     275    is($set2->data, 'data2', 'data'); 
     276 
     277    my $get2 = $model->find_or_create( 
     278        test4 => { multi_unique => [qw/ key11 key21 /] } => { 
     279            id1  => 'key11', 
     280            id2  => 'key21', 
     281            data => 'data2', 
     282        } 
     283    ); 
     284    isa_ok($get2, 'TestModel::test4'); 
     285    is($get2->id1, 'key11', 'id1'); 
     286    is($get2->id2, 'key21', 'id2'); 
     287    is($get2->data, 'data2', 'data'); 
     288 
     289    @rows = $model->get( 'test4' ); 
     290    is(scalar(@rows), 2, '1 record'); 
     291 
     292    isa_ok($rows[0], 'TestModel::test4'); 
     293    is($rows[0]->id1, 'key10', 'id1'); 
     294    is($rows[0]->id2, 'key20', 'id2'); 
     295    is($rows[0]->data, 'data1', 'data'); 
     296 
     297    isa_ok($rows[1], 'TestModel::test4'); 
     298    is($rows[1]->id1, 'key11', 'id1'); 
     299    is($rows[1]->id2, 'key21', 'id2'); 
     300    is($rows[1]->data, 'data2', 'data'); 
     301}; 
     302 
     303# index is error 
     304do { 
     305    eval { 
     306        $model->find_or_create( 
     307            test5 => { single_index => 'key1' } => { 
     308                data => 'data1', 
     309            } 
     310        ); 
     311    }; 
     312    like($@, qr/'single_index' is not unique index/, 'not use normal index'); 
     313}; 
     314