ignore emacs backup files also in db/run_all_patches.pl
[sgn.git] / lib / CXGN / Stock / TissueSample / Search.pm
bloba57066f3f14f16a561d99963b7265d7ccbaec7ad
1 package CXGN::Stock::TissueSample::Search;
3 =head1 NAME
4 CXGN::Stock::TissueSample::Search - an object to handle searching for tissue samples
5 =head1 USAGE
6 my $sample_search = CXGN::Stock::TissueSample::Search->new({
7 bcs_schema=>$schema,
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,
16 order_by => '',
17 limit => 10,
18 offset => 0
19 });
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
27 =head1 DESCRIPTION
28 =head1 AUTHORS
30 =cut
32 use strict;
33 use warnings;
34 use Moose;
35 use Try::Tiny;
36 use Data::Dumper;
37 use SGN::Model::Cvterm;
38 use CXGN::Stock::TissueSample;
40 has 'bcs_schema' => (
41 isa => 'Bio::Chado::Schema',
42 is => 'rw',
43 required => 1,
46 has 'tissue_sample_db_id_list' => (
47 isa => 'ArrayRef[Int]|Undef',
48 is => 'rw'
51 has 'tissue_sample_name_list' => (
52 isa => 'ArrayRef[Str]|Undef',
53 is => 'rw'
56 has 'plate_db_id_list' => (
57 isa => 'ArrayRef[Int]|Undef',
58 is => 'rw'
61 has 'plate_name_list' => (
62 isa => 'ArrayRef[Str]|Undef',
63 is => 'rw'
66 has 'germplasm_db_id_list' => (
67 isa => 'ArrayRef[Int]|Undef',
68 is => 'rw'
71 has 'germplasm_name_list' => (
72 isa => 'ArrayRef[Str]|Undef',
73 is => 'rw'
76 has 'observation_unit_db_id_list' => (
77 isa => 'ArrayRef[Int]|Undef',
78 is => 'rw'
81 has 'observation_unit_name_list' => (
82 isa => 'ArrayRef[Str]|Undef',
83 is => 'rw'
86 has 'order_by' => (
87 isa => 'Str|Undef',
88 is => 'rw'
91 has 'limit' => (
92 isa => 'Int|Undef',
93 is => 'rw',
96 has 'offset' => (
97 isa => 'Int|Undef',
98 is => 'rw',
101 sub search {
102 my $self = shift;
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();
112 my %and_conditions;
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(
169 \%and_conditions,
171 join => \%join_clause,
172 order_by => { '-asc' => $order_by },
173 distinct => 1
177 my @result;
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;
204 push @result, {
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,
222 plateIndex => 0,
223 dna_person => $s->dna_person,
224 acquisition_date => $s->acquisition_date,
225 tissue_type => $s->tissue_type,
226 extraction => $s->extraction,
227 notes => $s->notes,
228 well => $s->well,
229 concentration => $s->concentration,
230 volume => $s->volume,
231 is_blank => $s->is_blank
234 #print STDERR Dumper \@result;
236 return (\@result, $records_total);