File: store5.t

package info (click to toggle)
libdbix-dbstag-perl 0.12-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 1,420 kB
  • sloc: perl: 6,152; sql: 588; xml: 221; lisp: 59; makefile: 20
file content (117 lines) | stat: -rw-r--r-- 2,505 bytes parent folder | download | duplicates (3)
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
111
112
113
114
115
116
117
use lib 't';

BEGIN {
    # to handle systems with no installed Test module
    # we include the t dir (where a copy of Test.pm is located)
    # as a fallback
    eval { require Test; };
    use Test;    
    use DBStagTest;
    plan tests => 4;
}
use DBIx::DBStag;
use DBI;
use Data::Stag;
use FileHandle;
use strict;

drop qw( person2address person address );

my $ddl = <<EOM
CREATE TABLE address (
  address_id serial NOT NULL PRIMARY KEY,
  addressline varchar(255),
  city VARCHAR(255)
);
CREATE TABLE person (
  person_id serial NOT NULL PRIMARY KEY,
  fname     varchar(255) NOT NULL,
  lname     varchar(255) NOT NULL,
  job       varchar(255),
  UNIQUE (fname, lname)
);
CREATE TABLE person2address (
  address_id   integer NOT NULL REFERENCES address(address_id),
  person_id    integer NOT NULL REFERENCES  person(person_id)
);
EOM
;

my $data = <<EOM
(set
 (dbstag_metadata
  (link
   (table "person2address")
   (to "person")
   (from "address")))
 (person
  (fname "sherlock")
  (lname "holmes")
  (job "detective"))
 (person
  (fname "immanuel")
  (lname "kant")
  (job "philosopher"))
 (person
  (fname "charles")
  (lname "darwin")
  (job "naturalist"))
 (person
  (fname "winston")
  (lname "churchill")
  (job "prime minister"))
 (person
  (fname "clement")
  (lname "attlee")
  (job "prime minister"))
 (person
  (fname "buck")
  (lname "rogers")
  (job "space pilot"))
 (address 
  (addressline "1 A street")
  (city "london"))
 (address 
  (addressline "221B Baker Street")
  (city "london")
  (person
   (fname "sherlock")
   (lname "holmes"))
  (person
   (fname "dr")
   (lname "watson")))
 (address
  (addressline "10 Downing Street")
  (city "london")
  (person
   (fname "winston")
   (lname "churchill"))
  (person
   (fname "clement")
   (lname "attlee")))
 )
EOM
;

my $dbh = connect_to_cleandb();

# this time we are storing mapping data in dbstag_metadata in data

$dbh->do($ddl);
my $set = Data::Stag->from('sxprstr', $data);
my @nodes  = $set->kids;
$dbh->is_caching_on('person',1);
foreach (@nodes) {
    $dbh->storenode($_);
}
my $aset =
  $dbh->selectall_stag("SELECT address.*, person.* FROM address NATURAL JOIN person2address NATURAL JOIN person WHERE addressline = '10 Downing Street'");
print $aset->xml;
my @addresses = $aset->get_address;
ok(@addresses==1);
my $address = shift @addresses;
my @persons = $address->get_person;
ok(@persons==2);
ok(grep {$_->get_lname eq "attlee"} @persons);
ok(grep {$_->get_lname eq "churchill"} @persons);
$dbh->disconnect;