X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FData%2FCollection%2FSet.pm;h=ceb1e3fd5b5b9bcc4357ae73fa4e0b2109ac3280;hb=e49bd8614d0ac18dc8bc7cae5c3a687d3d032077;hp=4d902940dc85104be248745422f5a90539f5f528;hpb=c51eabc5e365e02962c64af5f1fe21dd342a53bc;p=dbsrgits%2FDBIx-Data-Store-old.git diff --git a/lib/DBIx/Data/Collection/Set.pm b/lib/DBIx/Data/Collection/Set.pm index 4d90294..ceb1e3f 100644 --- a/lib/DBIx/Data/Collection/Set.pm +++ b/lib/DBIx/Data/Collection/Set.pm @@ -68,20 +68,22 @@ method _key_cache_has_object ($obj) { } method _key_cache_get_raw ($raw) { - my $id = $self->_raw_to_id($raw); - exists $self->_key_cache->{$id} - ? ($self->_key_cache->{$id}) - : () + $self->_key_cache_get_id($self->_raw_to_id($raw)) } method _key_cache_get_object ($obj) { - $self->_key_cache_get_raw($self->_deflate($obj)) + $self->_key_cache_get_id($self->_object_to_id($obj)) } -## loading data +method _key_cache_get_object_spec ($spec) { + # see _object_spec_to_id for doc of what the difference is + $self->_key_cache_get_id($self->_object_spec_to_id($spec)) +} -method _new_raw_stream { - $self->_store->new_select_command([])->execute +method _key_cache_get_id ($id) { + exists $self->_key_cache->{$id} + ? ($self->_key_cache->{$id}) + : () } ## thunking between the store representation and the set representation @@ -90,6 +92,8 @@ method _new_raw_stream { # _deflate is final repr -> raw data # _merge takes final repr + raw data and updates the repr # (this is used for pk-generated values and later lazy loading) +# +# _deflate_spec is attributes of final repr -> raw data method _inflate ($raw) { bless($raw, $self->_class) if $self->_has_class; @@ -105,6 +109,10 @@ method _merge ($obj, $raw) { $obj } +method _deflate_spec ($spec) { + $spec +} + ## methods to get ids method _raw_to_id ($raw) { @@ -116,8 +124,19 @@ method _object_to_id ($obj) { $self->_raw_to_id($self->_deflate($obj)) } +method _object_spec_to_id ($spec) { + # intentionally C&P from _raw_to - this is not the same thing. If a column + # were mapped to an attribute of a different name, the raw would have the + # column name as a key but an object spec would have the attribute name + join ';', map $spec->{$_}, @{$self->_set_over} +} + ## array-ish operations - i.e. get all members +method _new_raw_stream { + $self->_store->new_select_command([])->execute +} + method flatten { @{$self->_member_cache}; } @@ -126,6 +145,22 @@ method as_stream { Data::Perl::Stream::Array->new(array => $self->_member_cache); } +## load single row + +method get ($spec) { + if (my ($got) = $self->_key_cache_get_object_spec($spec)) { + return $got + } + if (my ($raw) = $self->_get_from_store($self->_deflate_spec($spec))) { + return $self->_add_to_key_cache($self->_inflate($raw)) + } + return undef # we aren't handling cache misses here yet +} + +method _get_from_store ($raw) { + $self->_store->new_select_single_command($raw)->execute +} + ## add to set method add ($new) { @@ -155,7 +190,7 @@ method remove ($old) { } method _remove_from_store ($old) { - $self->_store->new_delete_command($self->_deflate($old))->execute; + $self->_store->new_delete_command($self->_deflate($old))->execute } method _remove_from_caches ($old) { @@ -164,4 +199,13 @@ method _remove_from_caches ($old) { $old } +## update + +method _update_in_store ($obj) { + # this is currently a call command but we should think about it + # being a row command so that we can have RETURNING or other + # mechanisms handle things like set-on-update datetime values + $self->_store->new_update_command($self->_deflate($obj))->execute +} + 1;