NAME
Genezzo::PushHash::hph.pm - an impure virtual class module that defines a *hierarchical* "push hash", a hash that generates its own unique key for each value. Values are "pushed" into the hash, similar to pushing into an array. Hierarchical pushhashes must be supplied with a factory method which manufactures additional pushhashes as necessary.
SYNOPSIS
use Genezzo::PushHash::hph;
sub make_fac {
my $tclass = shift;
my %args = (
@_);
my %td_hash1 = ();
my $newfunc =
sub {
my $tiehash1 =
tie %td_hash1, $tclass, %args;
return $tiehash1;
};
return $newfunc;
}
my $fac1 = make_fac('Genezzo::PushHash::PHFixed');
%args =
(
factory => $fac1
);
my %tied_hash = ();
my $tie_val =
tie %tied_hash, 'Genezzo::PushHash::hph', %args;
my $newkey = $tie_val->HPush("this is a test");
$tied_hash{$newkey} = "update this entry";
my $getcount = $tie_val->HCount();
DESCRIPTION
A hierarchical pushhash (hph) is a pushhash built upon a collection of other pushhashes. A push into the top-level hash is routed into one of the bottom hashes. If the bottom hashes are full (push fails), the top-level pushhash uses the factory method to create or obtain a new pushhash.
The hph uses a split-level identifier scheme to route STOREs and FETCHes to the appropriate bottom level hashes. For example, the top-level hash might have three children identified with integer prefixes 1, 2, and 3. Pushes into hash 1 would return keys 1/1, 1/2, 1/3, etc. until it fills up, at which point the top-level hash would redirect pushes into hash 2, generating keys 2/1, 2/2, 2/3, etc. When key "1/2" is fetched, the top-level hash "splits" the key and directs child hash "1" to fetch key "2". Iteration over keys is similar: the parent interates over the set of child hashes, and each child iterates over its set of keys.
You may construct hierarchical pushhashes of arbitrary depth.
EXPORT
- RIDSEP -- (Row) Identifier Separator character - "/" by default.
- RIDSEPRX -- Regular Expression for RIDSEP - used to handle case of "." as separator, or other regexp metachars, for internal RID join and split operations.
- MAXCOUNT -- no max if -1, else maximum number of elements for this hash
CONCEPTS and INTERNALS - useful for implementors
A hph is constructed of N pushhash "chunks", and the elements of each chunk are referred to as "slices". Typically, one chunk is "current" -- we push into the current chunk until it fills up, at which point the hph attempts to make a new one. Key identifiers are called "rids", and a rid may have multiple parts, e.g. "1/2/3/4". When this rid is split, the first part, "1", is the "chunk number", and the remainder "2/3/4" is the "slice number". The basic implementation uses positive integers for chunk and slice numbers -- zeroes reset the FIRSTKEY/NEXTKEY mechanism and may indicate errors, among other things.
The following methods are private to hph and should only be used in the construction of subclasses and friend classes.
- _currchunkno
-
get the number of the current (active) chunk. NOTE WELL: when constructing push hash classes, remember that "current" has the specific meaning of the insert high-water mark -- the "current" insertion point. It's not necessarily the last chunk that you were using, or the chunk that is currently cached.
- _get_current_chunk
-
return the current chunk
- _make_new_chunk
-
construct a new chunk and return it
- _get_a_chunk
-
given a chunk number, returns the chunk
- _get_chunk_and_slice
-
given a rid, it returns the actual chunk (not the chunk number) and the slice number.
- _joinrid/_splitrid
-
construct and deconstruct rid's from/to the chunknumber and the slice number using the rid separator regular expression.
- _First_Chunkno/_Next_Chunkno
-
methods to iterate over the chunk numbers.
AUTHOR
Jeffrey I. Cohen, jcohen@genezzo.com
SEE ALSO
Genezzo::PushHash::PushHash, perl(1).
Copyright (c) 2003, 2004, 2005, 2006 Jeffrey I Cohen. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Address bug reports and comments to: jcohen@genezzo.com
For more information, please visit the Genezzo homepage at http://www.genezzo.com