diff --git a/lib/CXGN/Phenotype.pm b/lib/CXGN/Phenotype.pm index 607169ec89..e0f85ba2fb 100644 --- a/lib/CXGN/Phenotype.pm +++ b/lib/CXGN/Phenotype.pm @@ -478,6 +478,7 @@ sub store_external_references { if (! $self->phenotype_id()) { #print STDERR "Can't store external references on this phenotype because there is no phenotype_id\n"; + return; } my $external_references_type_id = SGN::Model::Cvterm->get_cvterm_row($self->schema(), 'phenotype_external_references', 'phenotype_property')->cvterm_id(); @@ -508,6 +509,7 @@ sub store_additional_info { if (! $self->phenotype_id()) { print STDERR "Can't store additional info on this phenotype because there is no phenotype_id\n"; + return; } my $phenotype_additional_info_type_id = SGN::Model::Cvterm->get_cvterm_row($self->schema(), 'phenotype_additional_info', 'phenotype_property')->cvterm_id(); diff --git a/lib/CXGN/Phenotypes/ParseUpload/Plugin/FieldBook.pm b/lib/CXGN/Phenotypes/ParseUpload/Plugin/FieldBook.pm index 75dcd6377e..4d5980c7f2 100644 --- a/lib/CXGN/Phenotypes/ParseUpload/Plugin/FieldBook.pm +++ b/lib/CXGN/Phenotypes/ParseUpload/Plugin/FieldBook.pm @@ -20,6 +20,7 @@ use Moose; use File::Slurp; use Text::CSV; use Data::Dumper; +use JSON qw(decode_json); sub name { return "field book"; @@ -261,7 +262,7 @@ sub parse { my $unit_value = $row[$header_column_info{$unit_col}]; my $trait = $row[$header_column_info{'trait'}]; - my $value = $row[$header_column_info{'value'}]; + my $value = _normalize_fieldbook_value($row[$header_column_info{'value'}]); my $timestamp = defined $header_column_info{'timestamp'} ? $row[$header_column_info{'timestamp'}] : ''; my $collector = defined $header_column_info{'person'} ? $row[$header_column_info{'person'}] : ''; @@ -314,4 +315,34 @@ sub parse { return \%parse_result; } +sub _normalize_fieldbook_value { + my $value = shift; + return $value if !defined($value) || $value !~ /^\s*[\[\{]/; + + my $decoded = eval { decode_json($value) }; + return $value if $@; + + if (ref($decoded) eq "ARRAY") { + my @values = map { _fieldbook_json_value($_) } @$decoded; + @values = grep { defined($_) && $_ ne "" } @values; + return @values ? join(":", @values) : ""; + } + + my $decoded_value = _fieldbook_json_value($decoded); + return defined($decoded_value) ? $decoded_value : $value; +} + +sub _fieldbook_json_value { + my $entry = shift; + return if !defined($entry); + + if (ref($entry) eq "HASH") { + return $entry->{value} if defined($entry->{value}); + return $entry->{label} if defined($entry->{label}); + return; + } + + return ref($entry) ? undef : $entry; +} + 1; diff --git a/lib/CXGN/Phenotypes/StorePhenotypes.pm b/lib/CXGN/Phenotypes/StorePhenotypes.pm index 569b8312d7..beec2f2021 100644 --- a/lib/CXGN/Phenotypes/StorePhenotypes.pm +++ b/lib/CXGN/Phenotypes/StorePhenotypes.pm @@ -620,7 +620,8 @@ sub check_measurement { if (ref($value_array) eq 'ARRAY') { # the entry represents trait + timestamp # - $trait_value = $value_array->[0]; + $trait_value = _normalize_json_trait_value($value_array->[0]); + $value_array->[0] = $trait_value; $timestamp = $value_array->[1]; } elsif (ref($value_array) eq "HASH") { @@ -631,7 +632,7 @@ sub check_measurement { else { # it's a scalar. It really shouldn't be I guess? # - $trait_value = $value_array; + $trait_value = _normalize_json_trait_value($value_array); } #print STDERR "$plot_name, $trait_name, $trait_value\n"; if ( $trait_name ne "notes" ) { @@ -996,7 +997,8 @@ sub store { my $phenotype_object = CXGN::Phenotype->new( { schema => $schema }); - my $trait_value = $value_array->[0]; + my $trait_value = _normalize_json_trait_value($value_array->[0]); + $value_array->[0] = $trait_value; $phenotype_object->value($trait_value); my $timestamp = $value_array->[1]; @@ -1620,6 +1622,36 @@ sub get_trait_props { return \%property_by_cvterm_id; } +sub _normalize_json_trait_value { + my $value = shift; + return $value if !defined($value) || $value !~ /^\s*[\[\{]/; + + my $decoded = eval { decode_json($value) }; + return $value if $@; + + if (ref($decoded) eq "ARRAY") { + my @values = map { _json_trait_entry_value($_) } @$decoded; + @values = grep { defined($_) && $_ ne "" } @values; + return @values ? join(":", @values) : ""; + } + + my $decoded_value = _json_trait_entry_value($decoded); + return defined($decoded_value) ? $decoded_value : $value; +} + +sub _json_trait_entry_value { + my $entry = shift; + return if !defined($entry); + + if (ref($entry) eq "HASH") { + return $entry->{value} if defined($entry->{value}); + return $entry->{label} if defined($entry->{label}); + return; + } + + return ref($entry) ? undef : $entry; +} + ### 1; ###