-
Notifications
You must be signed in to change notification settings - Fork 0
/
0500-schema.t.exp
110 lines (90 loc) · 4.13 KB
/
0500-schema.t.exp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
{
package My::User;
use Moose;
use namespace::autoclean;
use Set::Object;
use DateTime;
has 'id' => (isa => 'Int', is => 'rw');
has 'name' => (isa => 'Str', is => 'rw');
has 'login' => (isa => 'Str', is => 'rw');
has 'password_hash' => (isa => 'Str', is => 'rw');
has 'last_login' => (isa => 'DateTime', is => 'rw');
has 'addresses' => (isa => 'Set::Object', is => 'rw');
1;
__PACKAGE__->meta->make_immutable;
package My::Address;
use Moose;
use namespace::autoclean;
has 'id' => (isa => 'Int', is => 'rw');
has 'user' => (isa => 'My::User', is => 'rw', weak_ref => 1);
has 'street_address' => (isa => 'Str', is => 'rw');
has 'city' => (isa => 'Str', is => 'rw');
has 'zip' => (isa => 'Int', is => 'rw');
has 'country_code' => (isa => 'Str', is => 'rw');
1;
__PACKAGE__->meta->make_immutable;
}
package main;
use strict;
use SQL::Expr;
my $user_table = SQL::Expr::Schema::Table->new(
-name => 'user',
-columns => [
SQL::Expr::Schema::Column->new( -name => 'uid', -type => 'Int' ),
SQL::Expr::Schema::Column->new( -name => 'name', -type => 'VarChar' ),
SQL::Expr::Schema::Column->new( -name => 'login', -type => 'VarChar' ),
SQL::Expr::Schema::Column->new( -name => 'c_password_hash', -type => 'VarChar' ),
SQL::Expr::Schema::Column->new( -name => 'last_login', -type => 'Date' ),
],
);
my $address_table = SQL::Expr::Schema::Table->new(
-name => 'address',
-columns => [
SQL::Expr::Schema::Column->new( -name => 'uid', -type => 'Int' ),
SQL::Expr::Schema::Column->new( -name => 'user_id', -type => 'Int' ),
SQL::Expr::Schema::Column->new( -name => 'street_address', -type => 'VarChar' ),
SQL::Expr::Schema::Column->new( -name => 'city', -type => 'VarChar' ),
SQL::Expr::Schema::Column->new( -name => 'zip', -type => 'Int' ),
SQL::Expr::Schema::Column->new( -name => 'country_code', -type => 'VarChar' ),
],
);
my $user_mapping = Ormish::Mapping->new(
for_class => 'My::User',
table => $user_table,
oid => Ormish::Mapping::OID::Auto->new( attribute => 'id' ),
attributes => {
id => $user_table->c->uid,
name => $user_table->c->name,
login => $user_table->c->login,
password_hash => $user_table->c->c_password_hash,
last_login => $user_table->c->last_login,
addresses => Ormish::Mapping::Relation::OneToMany(
to_class => 'My::Address',
join => [ $user_table->c->id == $address_table->c->user_id ],
),
},
);
my $address_mapping = Ormish::Mapping->new(
for_class => 'My::Address',
table => $address_table,
oid => Ormish::Mapping::OID::Auto->new( attribute => 'id' ),
attributes => {
id => $address_table->c->uid,
user => Ormish::Mapping::Relation::ManyToOne(
to_class => 'My::User',
join => [ $user_table->c->id == $address_table->c->user_id ],
),
street_address => $address_table->c->street_address,
city => $address_table->c->city,
zip => $address_table->c->zip,
country_code => $address_table->c->country_code,
},
);
$ds->register_mappings([ $user_mapping ]);
my @users =
$ds->new_query->from('My::User|u')->join('My::Address|a')->where('{u.login} = ?', $login)->add_eager_join('addresses')->select_objects->list;
my $q = Ormish::Query::Search->new( from => 'My::User', include_related => [ 'addresses' ] );
my $q = Ormish::Query::RawSQL->new( statement => 'SELECT * ', bind => [ ] );
my $result = $ds->execute_query( $q );
$ds->query('My::User', 'My::Address')->select_objects()
__END__