sub
id {
my
(
$self
) =
@_
;
$self
->throw_exception(
"Can't call id() as a class method"
)
unless
ref
$self
;
my
@id_vals
=
$self
->_ident_values;
return
(
wantarray
?
@id_vals
:
$id_vals
[0]);
}
sub
_ident_values {
my
(
$self
,
$use_storage_state
) =
@_
;
my
(
@ids
,
@missing
);
for
(
$self
->_pri_cols) {
push
@ids
, (
$use_storage_state
and
exists
$self
->{_column_data_in_storage}{
$_
})
?
$self
->{_column_data_in_storage}{
$_
}
:
$self
->get_column(
$_
)
;
push
@missing
,
$_
if
(!
defined
$ids
[-1] and !
$self
->has_column_loaded (
$_
) );
}
if
(
@missing
&&
$self
->in_storage) {
$self
->throw_exception (
'Unable to uniquely identify result object with missing PK columns: '
.
join
(
', '
,
@missing
)
);
}
return
@ids
;
}
sub
ID {
my
(
$self
) =
@_
;
$self
->throw_exception(
"Can't call ID() as a class method"
)
unless
ref
$self
;
return
undef
unless
$self
->in_storage;
return
$self
->_create_ID(%{
$self
->ident_condition});
}
sub
_create_ID {
my
(
$self
,
%vals
) =
@_
;
return
undef
unless
0 ==
grep
{ !
defined
}
values
%vals
;
return
join
'|'
,
ref
$self
||
$self
,
$self
->result_source->name,
map
{
$_
.
'='
.
$vals
{
$_
} }
sort
keys
%vals
;
}
sub
ident_condition {
shift
->_mk_ident_cond(
@_
);
}
sub
_storage_ident_condition {
shift
->_mk_ident_cond(
shift
, 1);
}
sub
_mk_ident_cond {
my
(
$self
,
$alias
,
$use_storage_state
) =
@_
;
my
@pks
=
$self
->_pri_cols;
my
@vals
=
$self
->_ident_values(
$use_storage_state
);
my
(
%cond
,
@undef
);
my
$prefix
=
defined
$alias
?
$alias
.
'.'
:
''
;
for
my
$col
(
@pks
) {
if
(!
defined
(
$cond
{
$prefix
.
$col
} =
shift
@vals
) ) {
push
@undef
,
$col
;
}
}
if
(
@undef
&&
$self
->in_storage) {
$self
->throw_exception (
'Unable to construct result object identity condition due to NULL PK columns: '
.
join
(
', '
,
@undef
)
);
}
return
\
%cond
;
}
1;