Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/CXGN/Phenotype.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down
33 changes: 32 additions & 1 deletion lib/CXGN/Phenotypes/ParseUpload/Plugin/FieldBook.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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'}] : '';

Expand Down Expand Up @@ -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;
38 changes: 35 additions & 3 deletions lib/CXGN/Phenotypes/StorePhenotypes.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand All @@ -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" ) {
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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;
###
Loading