Parent Directory
|
Revision Log
Tutorial examples.
#!/usr/bin/perl -w use strict; use ERDB; use BasicLocation; if (! @ARGV) { print "usage: NeighboringFeatures <alias or id> <size>\n"; } else { my $erdb = ERDB::GetDatabase('Sprout'); my $chunkSize = $erdb->MaxSegment(); my ($peg_alias_or_id, $size) = @ARGV; my $feature; if ($peg_alias_or_id =~ /^fig\|/) { # Look for a feature with the given ID. $feature = $erdb->GetEntity(Feature => $peg_alias_or_id); } else { my ($peg_id) = $erdb->GetFlat('FeatureAlias IsAliasOf Feature', "FeatureAlias(id) = ?", [$peg_alias_or_id], 'Feature(id)'); if (defined $peg_id) { # Look for a feature with the computed ID. $feature = $erdb->GetEntity(Feature => $peg_id); } } if (! defined $feature) { print "No feature found named \"$peg_alias_or_id\".\n"; } else { # Keep the features we've found in here. my %found; # Get the location. my @locations = split /,/, $feature->PrimaryValue('location-string'); for my $location (@locations) { my $loc = BasicLocation->new($location); # Now we need to come up with a way to ask if a location overlaps the # BasicLocation we just created. The obvious filter is # # IsLocatedIn(beg) + IsLocatedIn(len) >= $left AND # IsLocatedIn(beg) <= $right # # This, however, will be slow. We know the maximum size of an # IsLocatedIn region is $chunksize, so we can add # # IsLocatedIn(beg) + $chunkSize >= $left # # to the query. This enables the SQL processor to grab a section # of the index and look inside that. # So, first compute the region of interest. my $left = $loc->Left - $size; my $right = $loc->Right + $size; # Ask for the features. my $qh = $erdb->Get('Feature IsLocatedIn', 'IsLocatedIn(beg) + ? >= ? AND ' . 'IsLocatedIn(beg) <= ? AND ' . 'IsLocatedIn(beg) + IsLocatedIn(len) >= ?', [$chunkSize, $left, $right, $left]); while (my $feature = $qh->Fetch()) { # Get this feature's data. my ($id, $location) = $feature->Values(['id', 'location-string']); print "$id\t$location\n"; } } } }
MCS Webmaster | ViewVC Help |
Powered by ViewVC 1.0.3 |