line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Bio::ConnectDots::ConnectorSet; |
2
|
2
|
|
|
2
|
|
2395
|
use vars qw(@ISA @AUTO_ATTRIBUTES @OTHER_ATTRIBUTES %SYNONYMS); |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
305
|
|
3
|
2
|
|
|
2
|
|
157
|
use strict; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
74
|
|
4
|
2
|
|
|
2
|
|
5875
|
use Bio::ConnectDots::Util; |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
543
|
|
5
|
2
|
|
|
2
|
|
17
|
use Bio::ConnectDots::Connector; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
43
|
|
6
|
2
|
|
|
2
|
|
2078
|
use Bio::ConnectDots::DB::ConnectorSet; |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
168
|
|
7
|
2
|
|
|
2
|
|
15
|
use Class::AutoClass; |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
5873
|
|
8
|
|
|
|
|
|
|
@ISA = qw(Class::AutoClass); # AutoClass must be first!! |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
@AUTO_ATTRIBUTES=qw(name file cs_version ftp ftp_files saved_file db db_id |
11
|
|
|
|
|
|
|
label2dotset label2labelid dots_hash input_fh |
12
|
|
|
|
|
|
|
_current _instances label_annotations source_version source_date download_date comment); |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
@OTHER_ATTRIBUTES=qw(dotsets labels); |
15
|
|
|
|
|
|
|
%SYNONYMS=(); |
16
|
|
|
|
|
|
|
Class::AutoClass::declare(__PACKAGE__); |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
sub _init_self { |
19
|
3
|
|
|
3
|
|
2726
|
my($self,$class,$args)=@_; |
20
|
3
|
50
|
|
|
|
13
|
return unless $class eq __PACKAGE__; # to prevent subclasses from re-running this |
21
|
3
|
50
|
|
|
|
88
|
return if $self->db_id; # already fetched |
22
|
3
|
|
|
|
|
41
|
my $module=$args->module; |
23
|
3
|
50
|
|
|
|
106
|
if ($module) { # dynamically load subclass |
24
|
0
|
|
|
|
|
0
|
my $module_file="Bio/ConnectDots/ConnectorSet/$module.pm"; |
25
|
0
|
|
|
|
|
0
|
require $module_file; |
26
|
0
|
|
|
|
|
0
|
bless $self,ref($self)."::$module"; |
27
|
|
|
|
|
|
|
} |
28
|
3
|
50
|
|
|
|
79
|
return unless $self->db; |
29
|
0
|
|
0
|
|
|
|
my $label2dotset=$self->label2dotset || $self->label2dotset({}); |
30
|
0
|
|
0
|
|
|
|
my $label2labelid=$self->label2labelid || $self->label2labelid({}); |
31
|
0
|
|
|
|
|
|
my $saved=Bio::ConnectDots::DB::ConnectorSet->get($self); |
32
|
0
|
|
|
|
|
|
my @newlabels; |
33
|
0
|
0
|
|
|
|
|
if ($saved) { |
34
|
0
|
|
|
|
|
|
$self->db_id($saved->db_id); |
35
|
0
|
|
|
|
|
|
$self->saved_file($saved->file); # so application can catch duplicate loads |
36
|
|
|
|
|
|
|
# compare in-memory vs. saved dotsets |
37
|
0
|
|
|
|
|
|
my $saved_l2d=$saved->label2dotset; |
38
|
0
|
|
|
|
|
|
my $saved_l2i=$saved->label2labelid; |
39
|
0
|
|
|
|
|
|
while(my($label,$dotset)=each %$label2dotset) { |
40
|
0
|
|
|
|
|
|
my $saved_dotset=$saved_l2d->{$label}; |
41
|
0
|
0
|
|
|
|
|
push(@newlabels,$label), next unless $saved_dotset; |
42
|
0
|
0
|
|
|
|
|
$self->throw("In-memory and saved ConnectorSets use label $label for two different DotSets: ".$dotset->name." vs. ".$saved_dotset->name) unless $dotset->name eq $saved_dotset->name; |
43
|
0
|
|
|
|
|
|
$dotset->db_id($saved_dotset->db_id); |
44
|
0
|
|
|
|
|
|
$label2labelid->{$label}=$saved_l2i->{$label}; |
45
|
|
|
|
|
|
|
} |
46
|
|
|
|
|
|
|
} else { # everything is new |
47
|
0
|
|
|
|
|
|
@newlabels=$self->labels; |
48
|
|
|
|
|
|
|
} |
49
|
0
|
|
|
|
|
|
Bio::ConnectDots::DB::ConnectorSet->put($self,@newlabels); # store new information |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
# open file if provided |
52
|
0
|
0
|
|
|
|
|
$self->open_file if $self->file; |
53
|
|
|
|
|
|
|
} |
54
|
|
|
|
|
|
|
sub instances { |
55
|
0
|
|
|
0
|
0
|
|
my $self= shift; |
56
|
0
|
|
0
|
|
|
|
my $instances=$self->_instances || $self->_instances([]); |
57
|
0
|
0
|
|
|
|
|
push(@$instances,@_) if @_; |
58
|
0
|
0
|
|
|
|
|
wantarray? @$instances: $instances; |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
# normalize parameters to hash -- create DotSet objects |
61
|
|
|
|
|
|
|
sub dotsets { |
62
|
0
|
|
|
0
|
0
|
|
my $self=shift; |
63
|
0
|
|
0
|
|
|
|
my $label2dotset=$self->label2dotset || $self->label2dotset({}); |
64
|
0
|
0
|
|
|
|
|
if (@_) { |
65
|
0
|
|
|
|
|
|
my @dotsets=_flatten(@_); |
66
|
0
|
|
|
|
|
|
my $name2dotset={}; |
67
|
0
|
|
|
|
|
|
for my $dotset (@dotsets) { |
68
|
0
|
0
|
|
|
|
|
unless ('HASH' eq ref $dotset) { |
69
|
0
|
|
|
|
|
|
$dotset=$self->_fix_dotset($dotset,$name2dotset); |
70
|
0
|
|
|
|
|
|
my $label=$dotset->name; |
71
|
0
|
0
|
|
|
|
|
$self->throw("Two DotSets have same label: $label") if $label2dotset->{$label}; |
72
|
0
|
|
|
|
|
|
$label2dotset->{$label}=$dotset; |
73
|
|
|
|
|
|
|
} else { # hash: label=>name or DotSet |
74
|
0
|
|
|
|
|
|
my $hash=$dotset; |
75
|
0
|
|
|
|
|
|
while(my($label,$dotset)=each %$hash) { |
76
|
0
|
|
|
|
|
|
$dotset=$self->_fix_dotset($dotset,$name2dotset); |
77
|
0
|
0
|
|
|
|
|
$self->throw("Two DotSets have same label: $label") if $label2dotset->{$label}; |
78
|
0
|
|
|
|
|
|
$label2dotset->{$label}=$dotset; |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
} |
81
|
|
|
|
|
|
|
} |
82
|
|
|
|
|
|
|
} |
83
|
0
|
|
|
|
|
|
my @dotsets=uniq(values %$label2dotset); |
84
|
0
|
0
|
|
|
|
|
wantarray? @dotsets: \@dotsets; |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
sub _fix_dotset { |
87
|
0
|
|
|
0
|
|
|
my($self,$dotset,$name2dotset)=@_; |
88
|
0
|
0
|
0
|
|
|
|
$self->throw("Unrecognized parameter to dotsets: $dotset") |
89
|
|
|
|
|
|
|
unless !ref $dotset || UNIVERSAL::isa($dotset,'Bio::ConnectDots::DotSet'); |
90
|
0
|
0
|
|
|
|
|
if (!ref $dotset) { # scalar: should be DotSet name |
91
|
0
|
|
|
|
|
|
my $name=$dotset; |
92
|
0
|
|
0
|
|
|
|
$dotset=$name2dotset->{$name} || |
93
|
|
|
|
|
|
|
($name2dotset->{$name}=new Bio::ConnectDots::DotSet(-name=>$name,-db=>$self->db)); |
94
|
|
|
|
|
|
|
} else { # already DotSet object -- just test for duplicates |
95
|
0
|
|
|
|
|
|
my $name=$dotset->name; |
96
|
0
|
0
|
0
|
|
|
|
$self->throw("Two DotSets have same name") |
97
|
|
|
|
|
|
|
if $name2dotset->{$name} && $name2dotset->{$name} != $dotset; |
98
|
0
|
|
|
|
|
|
$name2dotset->{$name}=$dotset; |
99
|
|
|
|
|
|
|
} |
100
|
0
|
|
|
|
|
|
$dotset; |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
sub labels { |
103
|
0
|
|
|
0
|
0
|
|
my $self=shift; |
104
|
0
|
|
|
|
|
|
my @labels=_flatten(@_); |
105
|
0
|
|
|
|
|
|
my @results; |
106
|
0
|
0
|
|
|
|
|
if (@labels) { |
107
|
0
|
|
|
|
|
|
my $label2dotset=$self->label2dotset; |
108
|
0
|
|
|
|
|
|
@results=grep {exists $label2dotset->{$_}} @labels; |
|
0
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
} else { |
110
|
0
|
|
|
|
|
|
@results=keys %{$self->label2dotset}; |
|
0
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
} |
112
|
0
|
0
|
|
|
|
|
wantarray? @results: \@results; |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
sub put { |
115
|
0
|
|
|
0
|
0
|
|
my($self,$connector)=@_; |
116
|
0
|
|
|
|
|
|
$self->instances($connector); |
117
|
0
|
|
|
|
|
|
$connector; |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
sub open_file { |
120
|
0
|
|
|
0
|
0
|
|
my($self,$file)=@_; |
121
|
0
|
0
|
|
|
|
|
$file or $file=$self->file; |
122
|
0
|
0
|
|
|
|
|
$self->throw("Attempting to open file, but file is not set") unless $file; |
123
|
0
|
|
|
|
|
|
my $input_fh; |
124
|
0
|
0
|
|
|
|
|
open($input_fh,"< $file") or $self->throw("open of $file failed: $!"); |
125
|
0
|
|
|
|
|
|
$self->input_fh($input_fh); |
126
|
|
|
|
|
|
|
} |
127
|
|
|
|
|
|
|
sub parse_file { |
128
|
0
|
|
|
0
|
0
|
|
my $self=shift; |
129
|
0
|
0
|
|
|
|
|
unless ($self->input_fh) { |
130
|
0
|
0
|
|
|
|
|
my $file=shift or $self->file; |
131
|
0
|
|
|
|
|
|
$self->throw("Cannot parse file: no file provided"); |
132
|
0
|
|
|
|
|
|
$self->open_file($file); |
133
|
|
|
|
|
|
|
} |
134
|
0
|
|
|
|
|
|
while ($self->parse_entry) { |
135
|
0
|
|
|
|
|
|
my $connector=new Bio::ConnectDots::Connector(-connectorset=>$self); |
136
|
0
|
|
|
|
|
|
$self->put($connector); |
137
|
0
|
|
|
|
|
|
$self->dots_hash(undef); |
138
|
|
|
|
|
|
|
} |
139
|
|
|
|
|
|
|
} |
140
|
|
|
|
|
|
|
sub load_file { |
141
|
0
|
|
|
0
|
0
|
|
my($self,$load_save,$load_chunksize)=@_; |
142
|
0
|
|
|
|
|
|
my $db=$self->db; |
143
|
0
|
0
|
|
|
|
|
$self->throw("Cannot load file: ConnectorSet has no database") unless $db; |
144
|
0
|
0
|
|
|
|
|
$self->throw("Cannot load file: database not connected") unless $db->is_connected; |
145
|
0
|
0
|
|
|
|
|
$self->throw("Cannot load file: database does not exist") unless $db->exists; |
146
|
0
|
0
|
|
|
|
|
unless ($self->input_fh) { |
147
|
0
|
0
|
|
|
|
|
my $file=shift or $self->file; |
148
|
0
|
|
|
|
|
|
$self->throw("Cannot load file: no file provided"); |
149
|
0
|
|
|
|
|
|
$self->open_file($file); |
150
|
|
|
|
|
|
|
} |
151
|
0
|
|
|
|
|
|
my $connectorset_id=$self->db_id; |
152
|
0
|
|
|
|
|
|
my $label2dotset=$self->label2dotset; |
153
|
0
|
|
|
|
|
|
my $label2labelid=$self->label2labelid; |
154
|
0
|
|
|
|
|
|
$db->load_init($self->name,$load_save,$load_chunksize); |
155
|
0
|
|
|
|
|
|
my $connector_id=1; |
156
|
0
|
|
|
|
|
|
while ($self->parse_entry) { |
157
|
0
|
|
|
|
|
|
my $dots_hash=$self->dots_hash; |
158
|
0
|
|
|
|
|
|
while(my($label,$ids)=each %$dots_hash) { |
159
|
0
|
|
|
|
|
|
my $dotset_id=$label2dotset->{$label}->db_id; |
160
|
0
|
|
|
|
|
|
my $label_id=$label2labelid->{$label}; |
161
|
0
|
|
|
|
|
|
for my $id (@$ids) { |
162
|
0
|
|
|
|
|
|
$db->load_row($connector_id,$connectorset_id,$id,$dotset_id,$label_id); |
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
} |
165
|
0
|
|
|
|
|
|
$connector_id++; |
166
|
0
|
|
|
|
|
|
$self->dots_hash(undef); |
167
|
|
|
|
|
|
|
} |
168
|
0
|
|
|
|
|
|
$db->load_finish; |
169
|
|
|
|
|
|
|
} |
170
|
|
|
|
|
|
|
sub parse_entry { |
171
|
0
|
|
|
0
|
0
|
|
my($self)=@_; |
172
|
0
|
|
|
|
|
|
$self->throw("parse_enrty() Not implemented: must be implemented in subclass"); |
173
|
|
|
|
|
|
|
} |
174
|
|
|
|
|
|
|
sub have_dots { |
175
|
0
|
|
|
0
|
0
|
|
my $dots_hash=$_[0]->dots_hash; |
176
|
0
|
0
|
|
|
|
|
$dots_hash and %$dots_hash? 1: undef; |
|
|
0
|
|
|
|
|
|
177
|
|
|
|
|
|
|
} |
178
|
|
|
|
|
|
|
sub put_dot { |
179
|
0
|
|
|
0
|
0
|
|
my($self,$label,$value)=@_; |
180
|
0
|
0
|
|
|
|
|
return unless length($value)>0; # skip empty strings |
181
|
0
|
|
0
|
|
|
|
my $dots_hash=$self->dots_hash || $self->dots_hash({}); |
182
|
0
|
|
0
|
|
|
|
my $list=$dots_hash->{$label} || ($dots_hash->{$label}=[]); |
183
|
0
|
|
|
|
|
|
push(@$list,$value); |
184
|
0
|
|
|
|
|
|
$list; |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
|
187
|
0
|
0
|
|
0
|
|
|
sub _flatten {map {'ARRAY' eq ref $_? @$_: $_} @_;} |
|
0
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
1; |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
__END__ |