+ my $first = $self->First;
+ return undef unless $first; # No entries to check
+
+ # Key should be the same for all values of the same ocfv
+ my $ocfv_key = $first->GetOCFVCacheKey;
+
+ # This cache relieves performance issues when adding large numbers of values
+ # to a CF since each add compares against the full list each time.
+
+ unless ( $_OCFV_CACHE->{$ocfv_key} ) {
+ # Load the cache with existing values
+ foreach my $item ( @{$self->ItemsArrayRef} ) {
+ push @{$_OCFV_CACHE->{$ocfv_key}}, {
+ 'ObjectId' => $item->Id,
+ 'CustomFieldObj' => $item->CustomFieldObj,
+ 'Content' => $item->_Value('Content'),
+ 'LargeContent' => $item->LargeContent };
+ }
+ }
+
+ my %canon_value;
+ my $item_id;
+ foreach my $item ( @{$_OCFV_CACHE->{$ocfv_key}} ) {
+ my $cf = $item->{'CustomFieldObj'};
+ my $args = $canon_value{ $cf->Type };
+ if ( !$args ) {
+ $args = { Content => $value, LargeContent => $large_content };
+ my ($ok, $msg) = $cf->_CanonicalizeValue( $args );
+ next unless $ok;
+ $canon_value{ $cf->Type } = $args;
+ }
+
+ if ( $cf->Type eq 'Select' ) {
+ # select is case insensitive
+ $item_id = $item->{'ObjectId'} if lc $item->{'Content'} eq lc $args->{Content};
+ }
+ else {
+ if ( ($item->{'Content'} // '') eq $args->{Content} ) {
+ if ( defined $item->{'LargeContent'} ) {
+ $item_id = $item->{'ObjectId'}
+ if defined $args->{LargeContent}
+ && $item->{'LargeContent'} eq $args->{LargeContent};
+ }
+ else {
+ $item_id = $item->{'ObjectId'} unless defined $args->{LargeContent};
+ }
+ } elsif ( $item->{'LargeContent'} && $args->{Content} ) {
+ $item_id = $item->{'ObjectId'} if ($item->{'LargeContent'} eq $args->{Content});
+ }
+ }
+ last if $item_id;
+ }
+
+ if ( $item_id ) {
+ my $ocfv = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
+ my ($ret, $msg) = $ocfv->Load($item_id);
+ RT::Logger->error("Unable to load object custom field value from id: $item_id $msg")
+ unless $ret;
+ return $ocfv;
+ }
+ else {
+ return undef;