1 package CXGN
::Stock
::TissueSample
::Search
;
4 CXGN::Stock::TissueSample::Search - an object to handle searching for tissue samples
6 my $sample_search = CXGN::Stock::TissueSample::Search->new({
8 tissue_sample_db_id_list => \@tissue_ids,
9 tissue_sample_name_list => \@tissue_names,
10 plate_db_id_list => \@geno_trial_ids,
11 plate_name_list => \@geno_trial_names,
12 germplasm_db_id_list => \@accession_ids,
13 germplasm_name_list => \@accession_names,
14 observation_unit_db_id_list => \@plot_ids,
15 observation_unit_name_list => \@plot_names,
20 my $result = $sample_search->search();
22 Modeled after brapi samples search call.
23 observation_unit_db_id_list is for a list of source plot_ids, plant_ids, or tissue_sample_ids
24 plate_db_id_list is for a list of genotyping_trial_ids
25 germplasm_db_id_list is for a list of accession_ids
37 use SGN
::Model
::Cvterm
;
38 use CXGN
::Stock
::TissueSample
;
41 isa
=> 'Bio::Chado::Schema',
46 has
'tissue_sample_db_id_list' => (
47 isa
=> 'ArrayRef[Int]|Undef',
51 has
'tissue_sample_name_list' => (
52 isa
=> 'ArrayRef[Str]|Undef',
56 has
'plate_db_id_list' => (
57 isa
=> 'ArrayRef[Int]|Undef',
61 has
'plate_name_list' => (
62 isa
=> 'ArrayRef[Str]|Undef',
66 has
'germplasm_db_id_list' => (
67 isa
=> 'ArrayRef[Int]|Undef',
71 has
'germplasm_name_list' => (
72 isa
=> 'ArrayRef[Str]|Undef',
76 has
'observation_unit_db_id_list' => (
77 isa
=> 'ArrayRef[Int]|Undef',
81 has
'observation_unit_name_list' => (
82 isa
=> 'ArrayRef[Str]|Undef',
103 my $schema = $self->bcs_schema();
105 my $accession_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'accession', 'stock_type')->cvterm_id();
106 my $plant_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'plant', 'stock_type')->cvterm_id();
107 my $plot_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'plot', 'stock_type')->cvterm_id();
108 my $tissue_sample_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'tissue_sample', 'stock_type')->cvterm_id();
109 my $tissue_relationship_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'tissue_sample_of', 'stock_relationship')->cvterm_id();
110 my $genotyping_experiment_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'genotyping_layout', 'experiment_type')->cvterm_id();
113 $and_conditions{'me.type_id'} = $tissue_sample_cvterm_id;
115 my $order_by = $self->order_by || 'me.uniquename';
117 my %join_clause = ('stock_relationship_subjects' => 'object');
118 $and_conditions{'stock_relationship_subjects.type_id'} = $tissue_relationship_cvterm_id;
120 if ($self->tissue_sample_db_id_list() && scalar(@
{$self->tissue_sample_db_id_list}) > 0){
121 $and_conditions{'me.stock_id'} = {'-in' => $self->tissue_sample_db_id_list};
123 if ($self->tissue_sample_name_list() && scalar(@
{$self->tissue_sample_name_list}) > 0){
124 foreach (@
{$self->tissue_sample_name_list}){
125 push @
{$and_conditions{'me.uniquename'}}, {'ilike' => '%'.$_.'%'};
129 if (($self->plate_db_id_list() && scalar(@
{$self->plate_db_id_list}) > 0) || ($self->plate_name_list() && scalar(@
{$self->plate_name_list}) > 0)){
130 $join_clause{nd_experiment_stocks
} = {nd_experiment
=> {nd_experiment_projects
=> 'project'} };
131 $and_conditions{'nd_experiment.type_id'} = $genotyping_experiment_cvterm_id;
133 if ($self->plate_db_id_list() && scalar(@
{$self->plate_db_id_list}) > 0){
134 $and_conditions{'project.project_id'} = {'-in' => $self->plate_db_id_list};
136 if ($self->plate_name_list() && scalar(@
{$self->plate_name_list}) > 0){
137 $and_conditions{'project.name'} = {'-in' => $self->plate_name_list};
141 if (($self->germplasm_db_id_list() && scalar(@
{$self->germplasm_db_id_list}) > 0) || ($self->germplasm_name_list() && scalar(@
{$self->germplasm_name_list}) > 0)){
142 $and_conditions{'object.type_id'} = $accession_cvterm_id;
144 if ($self->germplasm_db_id_list() && scalar(@
{$self->germplasm_db_id_list}) > 0){
145 $and_conditions{'object.stock_id'} = {'-in' => $self->germplasm_db_id_list};
147 if ($self->germplasm_name_list() && scalar(@
{$self->germplasm_name_list}) > 0){
148 foreach (@
{$self->germplasm_name_list}){
149 push @
{$and_conditions{'object.uniquename'}}, {'ilike' => '%'.$_.'%'};
154 if (($self->observation_unit_db_id_list() && scalar(@
{$self->observation_unit_db_id_list}) > 0) || ($self->observation_unit_name_list() && scalar(@
{$self->observation_unit_name_list}) > 0)){
155 $and_conditions{'object.type_id'} = [$plot_cvterm_id, $plant_cvterm_id, $tissue_sample_cvterm_id];
157 if ($self->observation_unit_db_id_list() && scalar(@
{$self->observation_unit_db_id_list}) > 0){
158 $and_conditions{'object.stock_id'} = {'-in' => $self->observation_unit_db_id_list};
160 if ($self->observation_unit_name_list() && scalar(@
{$self->observation_unit_name_list}) > 0){
161 foreach (@
{$self->observation_unit_name_list}){
162 push @
{$and_conditions{'object.uniquename'}}, {'ilike' => '%'.$_.'%'};
167 #$schema->storage->debug(1);
168 my $sample_rs = $schema->resultset("Stock::Stock")->search(
171 join => \
%join_clause,
172 order_by
=> { '-asc' => $order_by },
179 my $limit = $self->limit;
180 my $offset = $self->offset;
181 my $records_total = $sample_rs->count();
182 if (defined($limit) && defined($offset)){
183 $sample_rs = $sample_rs->slice($offset, $limit);
186 while ( my $t = $sample_rs->next() ) {
187 my $s = CXGN
::Stock
::TissueSample
->new(schema
=>$self->bcs_schema, tissue_sample_id
=>$t->stock_id);
188 my $accession_id = $s->get_accession ?
$s->get_accession->[0] : undef;
189 my $accession_name = $s->get_accession ?
$s->get_accession->[1] : undef;
190 my $source_plot_id = $s->get_source_plot ?
$s->get_source_plot->[0] : undef;
191 my $source_plot_name = $s->get_source_plot ?
$s->get_source_plot->[1] : undef;
192 my $source_plant_id = $s->get_source_plant ?
$s->get_source_plant->[0] : undef;
193 my $source_plant_name = $s->get_source_plant ?
$s->get_source_plant->[1] : undef;
194 my $source_sample_id = $s->get_source_tissue_sample ?
$s->get_source_tissue_sample->[0] : undef;
195 my $source_sample_name = $s->get_source_tissue_sample ?
$s->get_source_tissue_sample->[1] : undef;
196 my $source_obs_id = $s->source_observation_unit ?
$s->source_observation_unit->[0] : undef;
197 my $source_obs_name = $s->source_observation_unit ?
$s->source_observation_unit->[1] : undef;
198 my $source_obs_type = $s->source_observation_unit ?
$s->source_observation_unit->[2] : undef;
199 my $plate_id = $s->get_plate ?
$s->get_plate->[0] : undef;
200 my $plate_name = $s->get_plate ?
$s->get_plate->[1] : undef;
201 my $trial_id = $s->get_trial ?
$s->get_trial->[0] : undef;
202 my $trial_name = $s->get_trial ?
$s->get_trial->[1] : undef;
205 sampleDbId
=> $t->stock_id,
206 sampleName
=> $t->uniquename,
207 observationUnitDbId
=> $source_obs_id,
208 observationUnitName
=> $source_obs_name,
209 observationUnitType
=> $source_obs_type,
210 germplasmDbId
=> $accession_id,
211 germplasmName
=> $accession_name,
212 studyDbId
=> $trial_id,
213 studyName
=> $trial_name,
214 plotDbId
=> $source_plot_id,
215 plotName
=> $source_plot_name,
216 plantDbId
=> $source_plant_id,
217 plantName
=> $source_plant_name,
218 sourceSampleDbId
=> $source_sample_id,
219 sourceSampleName
=> $source_sample_name,
220 plateDbId
=> $plate_id,
221 plateName
=> $plate_name,
223 dna_person
=> $s->dna_person,
224 acquisition_date
=> $s->acquisition_date,
225 tissue_type
=> $s->tissue_type,
226 extraction
=> $s->extraction,
229 concentration
=> $s->concentration,
230 volume
=> $s->volume,
231 is_blank
=> $s->is_blank
234 #print STDERR Dumper \@result;
236 return (\
@result, $records_total);