From 29a419e1eba597566f3d4e9f166d7923a2eb3872 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Fri, 5 Sep 2008 22:14:04 +0000 Subject: [PATCH] added: getLineageIterator method to simplify working on large sets of assets --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/AssetLineage.pm | 32 ++++++++++++++++++++++ t/Asset/AssetLineage.t | 54 +++++++++++++++++++++++++++++++++++++- 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 6b963ba10..38d3b696f 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,4 +1,5 @@ 7.6.0 + - added: getLineageIterator method to simplify working on large sets of assets - fixed: Syndicated Content doesn't decode alternate character sets - fixed: Some templates ship with isPublic=1 - fixed: DataForm export tab delimited doesn't work diff --git a/lib/WebGUI/AssetLineage.pm b/lib/WebGUI/AssetLineage.pm index 34eaa10e9..ddcd2fdb2 100644 --- a/lib/WebGUI/AssetLineage.pm +++ b/lib/WebGUI/AssetLineage.pm @@ -380,6 +380,38 @@ sub getLineage { return \@lineage; } +#------------------------------------------------------------------- + +=head2 getLineageIterator ( relatives,rules ) + +Takes the same parameters as getLineage, but instead of returning a list +it returns an iterator. Calling the iterator will return instantiated assets, +or undef when there are no more assets available. + +=cut + +sub getLineageIterator { + my $self = shift; + my $relatives = shift; + my $rules = shift; + + my $sql = $self->getLineageSql($relatives, $rules); + + my $sth = $self->session->db->read($sql); + my $sub = sub { + my $assetInfo = $sth->hashRef; + return + if !$assetInfo; + my $asset = WebGUI::Asset->new( + $self->session, $assetInfo->{assetId}, $assetInfo->{className}, $assetInfo->{revisionDate} + ); + if (!$asset) { + WebGUI::Error::ObjectNotFound->throw(id => $assetInfo->{assetId}); + } + return $asset; + }; + return $sub; +} #------------------------------------------------------------------- diff --git a/t/Asset/AssetLineage.t b/t/Asset/AssetLineage.t index f8d15d3da..4ea6b3cef 100644 --- a/t/Asset/AssetLineage.t +++ b/t/Asset/AssetLineage.t @@ -17,7 +17,7 @@ use WebGUI::Session; use WebGUI::User; use WebGUI::Asset; -use Test::More tests => 87; # increment this value for each test you create +use Test::More tests => 92; # increment this value for each test you create use Test::Deep; # Test the methods in WebGUI::AssetLineage @@ -442,6 +442,58 @@ cmp_bag( 'getLineage: descendants of topFolder', ); +#################################################### +# +# getLineageIterator +# +#################################################### + +sub getListFromIterator { + my $iterator = shift; + my @items; + while (my $item = $iterator->()) { + push @items, $item->getId; + } + return \@items; +} + +@snipIds = map { $_->getId } @snippets; +my $ids = getListFromIterator($folder->getLineageIterator(['descendants'])); +cmp_bag( + \@snipIds, + $ids, + 'getLineageIterator: get descendants of folder' +); + +$ids = getListFromIterator($folder->getLineageIterator(['self','descendants'])); +unshift @snipIds, $folder->getId; +cmp_bag( + \@snipIds, + $ids, + 'getLineageIterator: get descendants of folder and self' +); + +$ids = getListFromIterator($folder->getLineageIterator(['self','children'])); +cmp_bag( + \@snipIds, + $ids, + 'getLineageIterator: descendants == children if there are no grandchildren' +); + +$ids = getListFromIterator($topFolder->getLineageIterator(['self','children'])); +cmp_bag( + [$topFolder->getId, $folder->getId, $folder2->getId, ], + $ids, + 'getLineageIterator: children (no descendants) of topFolder', +); + +$ids = getListFromIterator($topFolder->getLineageIterator(['self','descendants'])); +cmp_bag( + [$topFolder->getId, @snipIds, $folder2->getId, $snippet2->getId], + $ids, + 'getLineageIterator: descendants of topFolder', +); + #################################################### # # addChild