--- nfo/perl/libs/Data/Storage/Handler/Tangram.pm 2003/04/08 22:52:22 1.32 +++ nfo/perl/libs/Data/Storage/Handler/Tangram.pm 2003/04/09 06:07:43 1.33 @@ -1,8 +1,11 @@ ############################################ # -# $Id: Tangram.pm,v 1.32 2003/04/08 22:52:22 joko Exp $ +# $Id: Tangram.pm,v 1.33 2003/04/09 06:07:43 joko Exp $ # # $Log: Tangram.pm,v $ +# Revision 1.33 2003/04/09 06:07:43 joko +# revamped 'sub sendQuery' +# # Revision 1.32 2003/04/08 22:52:22 joko # modified 'querySchema': better behaviour regarding filtering result # @@ -137,7 +140,7 @@ use DesignPattern::Object; use Data::Storage::Result::Tangram; use Data::Mungle::Compare::Struct qw( isEmpty ); -use Data::Mungle::Transform::Deep qw( expand ); +use Data::Mungle::Transform::Deep qw( expand deep_copy merge_to ); # get logger instance my $logger = Log::Dispatch::Config->instance; @@ -553,57 +556,137 @@ sub sendQuery { my $self = shift; my $query = shift; - #my $sql = "SELECT cs FROM $self->{metainfo}->{$descent}->{node} WHERE $self->{metainfo}->{$descent}->{IdentProvider}->{arg}='$self->{entry}->{source}->{ident}';"; - #my $result = $self->{metainfo}->{$descent}->{storage}->sendCommand($sql); #print Dumper($query); - # HACK: special case: querying by id does not translate into a common tangram query - # just load the object by given id(ent) - if ($query->{criterias} && ($query->{criterias}->[0]->{key} eq 'id' && $query->{criterias}->[0]->{op} eq 'eq')) { - #print "LOAD!!!", "\n"; - #exit; - #return Set::Object->new( $self->{COREHANDLE}->load($query->{criterias}->[0]->{val}) ); - my $ident = $query->{criterias}->[0]->{val}; -#print "load obj", "\n"; - #return $self->createSet() if $ident == 5; - $self->{_COREHANDLE}->unload($ident); - my $object = $self->{_COREHANDLE}->load($ident); -#print "get id", "\n"; - my $oid = $self->{_COREHANDLE}->id($object); -#print Dumper($object); -#print "oid: $oid", "\n"; - return $self->createSet($object); - #return $self->createSet( $self->{COREHANDLE}->load('300090018') ); - } - - my $list = $self->getListFiltered($query->{node}, $query->{criterias}); - #return $self->createSet($object); - #return $self->createSet($list); - return $self->createSet(@$list); - - #die("This should not be reached for now - redirect to \$self->getListFiltered() here!"); + # type = ITEM|LIST|TRANSPARENT + my $type = ''; + # mode = OID|SPECIAL + my $mode = ''; + my $ident = ''; + my $action = ''; + + + # dispatch type and mode + + # defaults - 1 + if ($query->{options}) { + $action = $query->{options}->{action}; + } + + # defaults - 2 + $type ||= 'TRANSPARENT'; + $action ||= 'load'; + + if ($query->{options}->{OID}) { + $type = 'ITEM'; + $mode = 'OID'; + $ident = $query->{options}->{OID}; + + } elsif (my $guid = $query->{options}->{GUID}) { + $type = 'TRANSPARENT'; + $query->{criterias} = [ { key => 'guid', op => 'eq', val => $guid } ]; + + } + + # HACK: special case: querying by id does not translate into a common tangram query + # just load the object by given identifier (OID) named 'id' - this is required by Data::Transfer::Sync! + if ($query->{criterias} && ($query->{criterias}->[0]->{key} eq 'id' && $query->{criterias}->[0]->{op} eq 'eq')) { + $type = 'ITEM'; + $mode = 'SPECIAL.SYNC'; + $ident = $query->{criterias}->[0]->{val}; + } + + + # execute query + my $result; + + if ($type eq 'ITEM' && $ident) { + if ($mode eq 'OID') { + $result = $self->getObject($ident, $query->{options}); + + } elsif ($mode eq 'SPECIAL.SYNC') { + + # V1 - failed + #return Set::Object->new( $self->{COREHANDLE}->load($query->{criterias}->[0]->{val}) ); + + # hmm.... + #return $self->createSet() if $ident == 5; + + # Unload single object before doing any further operations to + # expect a "fresh" object from orm when performing the next calls. + $self->{_COREHANDLE}->unload($ident); + + # Load object from orm. + my $object = $self->{_COREHANDLE}->load($ident); + + # determine object identifier (OID) + my $oid = $self->{_COREHANDLE}->id($object); + + # encapsulate into result/response container and return this one + $result = $self->createSet($object); + + # debugging + #$result = $self->createSet( $self->{COREHANDLE}->load('300090018') ); + + } + + + } elsif ($type eq 'TRANSPARENT') { + + if ($action eq 'load') { + my $list = $self->getListFiltered($query->{node}, $query->{criterias}); + #return $self->createSet($object); + #return $self->createSet($list); + return $self->createSet(@$list); + + #die("This should not be reached for now - redirect to \$self->getListFiltered() here!"); + + # try a generic tangram query here + # TODO: try to place an oql on top of that (search.cpan.org!) + my @crits; + foreach (@{$query->{criterias}}) { + my $op = ''; + $op = '=' if lc $_->{op} eq 'eq'; + push @crits, "$_->{key}$op'$_->{val}'"; + } + my $subnodes = {}; + map { $subnodes->{$_}++ } @{$query->{subnodes}}; + # HACK: this is hardcoded ;( expand possibilities! + #my $crit = join(' AND ', @crits); + #my $sql = hash2Sql($query->{node}, $subnodes, 'SELECT', $crit); + #return $self->sendCommand($sql); + #my $h = $self->{COREHANDLE}->remote($query->{node}); + #my $res = $self->{COREHANDLE}->select($h, $h->{); + $result = $self->createCursor($query->{node}); + + } elsif ($action eq 'save') { + + # Patch current query to be a loader (e.g. change action, remove payload) ... + my $childquery = deep_copy($query); + $childquery->{options}->{action} = 'load'; + delete $childquery->{payload}; + + # ... to use it to fetch fresh object using ourselves (sendQuery). + my $cursor = $self->sendQuery($childquery); + my $status = $cursor->getStatus(); + my $object = $cursor->getNextEntry(); + + # Merge values and apply value modifiers. + my $options = { utf8 => 1, php => 1 }; + merge_to($object, $query->{payload}, $options); + # Execute update operation at orm. + $self->update($object); + + } + + } + + return $result; - # try a generic tangram query here - # TODO: try to place an oql on top of that (search.cpan.org!) - my @crits; - foreach (@{$query->{criterias}}) { - my $op = ''; - $op = '=' if lc $_->{op} eq 'eq'; - push @crits, "$_->{key}$op'$_->{val}'"; - } - my $subnodes = {}; - map { $subnodes->{$_}++ } @{$query->{subnodes}}; - # HACK: this is hardcoded ;( expand possibilities! - #my $crit = join(' AND ', @crits); - #my $sql = hash2Sql($query->{node}, $subnodes, 'SELECT', $crit); - #return $self->sendCommand($sql); - #my $h = $self->{COREHANDLE}->remote($query->{node}); - #my $res = $self->{COREHANDLE}->select($h, $h->{); - return $self->createCursor($query->{node}); } sub eraseAll { @@ -639,7 +722,7 @@ return $object if $object; } -sub getObjectByGuid { +sub getObjectByGuid_old { my $self = shift; my $guid = shift; my $options = shift; @@ -669,7 +752,7 @@ } -sub getObjectAsHash { +sub getObjectAsHash_old { my $self = shift; my $oid = shift; my $options = shift;