GEPS 6: Implement place hierarchy

svn: r23444
This commit is contained in:
Nick Hall
2013-11-01 19:13:16 +00:00
parent 8e123f8695
commit d6ae8cffb4
44 changed files with 2208 additions and 1272 deletions

View File

@@ -110,6 +110,7 @@ TAGTRANS = "tag_name"
SURNAMES = "surnames"
NAME_GROUP = "name_group"
META = "meta_data"
PPARENT = "place_parent"
FAMILY_TBL = "family"
PLACES_TBL = "place"
@@ -183,6 +184,15 @@ def find_idmap(key, data):
val = val.encode('utf-8')
return val
def find_parent(key, data):
if len(data[5]) > 0:
val = data[5][0][0]
else:
val = ''
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
# Secondary database key lookups for reference_map table
# reference_map data values are of the form:
# ((primary_object_class_name, primary_object_handle),
@@ -374,6 +384,13 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
return DbBsddbAssocCursor(self.reference_map_referenced_map,
self.txn)
@catch_db_error
def get_place_parent_cursor(self):
"""
Returns a reference to a cursor over the place parents
"""
return DbBsddbAssocCursor(self.parents, self.txn)
# These are overriding the DbBsddbRead's methods of saving metadata
# because we now have txn-capable metadata table
@@ -870,6 +887,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
("rid_trans", RIDTRANS, db.DB_HASH, 0),
("nid_trans", NIDTRANS, db.DB_HASH, 0),
("tag_trans", TAGTRANS, db.DB_HASH, 0),
("parents", PPARENT, db.DB_HASH, 0),
("reference_map_primary_map", REF_PRI, db.DB_BTREE, 0),
("reference_map_referenced_map", REF_REF, db.DB_BTREE, db.DB_DUPSORT),
]
@@ -887,6 +905,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
(self.family_map, self.fid_trans, find_idmap),
(self.event_map, self.eid_trans, find_idmap),
(self.place_map, self.pid_trans, find_idmap),
(self.place_map, self.parents, find_parent),
(self.source_map, self.sid_trans, find_idmap),
(self.citation_map, self.cid_trans, find_idmap),
(self.media_map, self.oid_trans, find_idmap),
@@ -934,6 +953,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
( self.nid_trans, NIDTRANS ),
( self.cid_trans, CIDTRANS ),
( self.tag_trans, TAGTRANS ),
( self.parents, PPARENT ),
( self.reference_map_primary_map, REF_PRI),
( self.reference_map_referenced_map, REF_REF),
]
@@ -960,6 +980,36 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if callback:
callback(12)
@catch_db_error
def find_place_child_handles(self, handle):
"""
Find all child places having the given place as the primary parent.
"""
handle = str(handle)
parent_cur = self.get_place_parent_cursor()
try:
ret = parent_cur.set(handle)
except:
ret = None
while (ret is not None):
(key, data) = ret
### FIXME: this is a dirty hack that works without no
### sensible explanation. For some reason, for a readonly
### database, secondary index returns a primary table key
### corresponding to the data, not the data.
if self.readonly:
data = self.place_map.get(data)
else:
data = pickle.loads(data)
yield data[0]
ret = parent_cur.next_dup()
parent_cur.close()
@catch_db_error
def find_backlink_handles(self, handle, include_classes=None):
"""
@@ -1303,6 +1353,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__close_metadata()
self.name_group.close()
self.surnames.close()
self.parents.close()
self.id_trans.close()
self.fid_trans.close()
self.eid_trans.close()