DictionaryDb: removed linear lookups

This commit is contained in:
Doug Blank
2015-08-07 21:45:45 -04:00
parent 1b71908bca
commit 1e7ab9f847

View File

@@ -1,6 +1,6 @@
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2012 Douglas S. Blank <doug.blank@gmail.com> # Copyright (C) 2012 - 2015 Douglas S. Blank <doug.blank@gmail.com>
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -59,6 +59,7 @@ class DictionaryDb(DbGeneric):
version_file.write("dictionarydb") version_file.write("dictionarydb")
def initialize_backend(self, directory): def initialize_backend(self, directory):
# Handle dicts:
self._person_dict = {} self._person_dict = {}
self._family_dict = {} self._family_dict = {}
self._source_dict = {} self._source_dict = {}
@@ -69,6 +70,18 @@ class DictionaryDb(DbGeneric):
self._repository_dict = {} self._repository_dict = {}
self._note_dict = {} self._note_dict = {}
self._tag_dict = {} self._tag_dict = {}
# Gramps id dicts:
self._person_id_dict = {}
self._family_id_dict = {}
self._source_id_dict = {}
self._citation_id_dict = {}
self._event_id_dict = {}
self._media_id_dict = {}
self._place_id_dict = {}
self._repository_id_dict = {}
self._note_id_dict = {}
# Name:
self._tag_name_dict = {}
# Secondary: # Secondary:
self._reference_list = [] self._reference_list = []
@@ -162,10 +175,7 @@ class DictionaryDb(DbGeneric):
return self._tag_dict.keys() return self._tag_dict.keys()
def get_tag_from_name(self, name): def get_tag_from_name(self, name):
retval = [x for x in self._tag_dict.keys() if x.name == name] return self._tag_name_dict.get(name, None)
if retval:
return retval[0]
return None
def get_number_of_people(self): def get_number_of_people(self):
return len(self._person_dict) return len(self._person_dict)
@@ -224,6 +234,7 @@ class DictionaryDb(DbGeneric):
given_name, surname, gender_type = self.get_person_data(person) given_name, surname, gender_type = self.get_person_data(person)
# update the person: # update the person:
self._person_dict[person.handle] = person self._person_dict[person.handle] = person
self._person_id_dict[person.gramps_id] = person
else: else:
emit = "person-add" emit = "person-add"
self.genderStats.count_person(person) self.genderStats.count_person(person)
@@ -231,6 +242,7 @@ class DictionaryDb(DbGeneric):
given_name, surname, gender_type = self.get_person_data(person) given_name, surname, gender_type = self.get_person_data(person)
# Insert the person: # Insert the person:
self._person_dict[person.handle] = person self._person_dict[person.handle] = person
self._person_id_dict[person.gramps_id] = person
if not trans.batch: if not trans.batch:
self.update_backlinks(person) self.update_backlinks(person)
if old_person: if old_person:
@@ -280,9 +292,11 @@ class DictionaryDb(DbGeneric):
emit = "family-update" emit = "family-update"
old_family = self.get_family_from_handle(family.handle).serialize() old_family = self.get_family_from_handle(family.handle).serialize()
self._family_dict[family.handle] = family self._family_dict[family.handle] = family
self._family_id_dict[family.gramps_id] = family
else: else:
emit = "family-add" emit = "family-add"
self._family_dict[family.handle] = family self._family_dict[family.handle] = family
self._family_id_dict[family.gramps_id] = family
if not trans.batch: if not trans.batch:
self.update_backlinks(family) self.update_backlinks(family)
op = TXNUPD if old_family else TXNADD op = TXNUPD if old_family else TXNADD
@@ -327,9 +341,11 @@ class DictionaryDb(DbGeneric):
emit = "citation-update" emit = "citation-update"
old_citation = self.get_citation_from_handle(citation.handle).serialize() old_citation = self.get_citation_from_handle(citation.handle).serialize()
self._citation_dict[citation.handle] = citation self._citation_dict[citation.handle] = citation
self._citation_id_dict[citation.gramps_id] = citation
else: else:
emit = "citation-add" emit = "citation-add"
self._citation_dict[citation.handle] = citation self._citation_dict[citation.handle] = citation
self._citation_id_dict[citation.gramps_id] = citation
if not trans.batch: if not trans.batch:
self.update_backlinks(citation) self.update_backlinks(citation)
op = TXNUPD if old_citation else TXNADD op = TXNUPD if old_citation else TXNADD
@@ -359,9 +375,11 @@ class DictionaryDb(DbGeneric):
emit = "source-update" emit = "source-update"
old_source = self.get_source_from_handle(source.handle).serialize() old_source = self.get_source_from_handle(source.handle).serialize()
self._source_dict[source.handle] = source self._source_dict[source.handle] = source
self._source_id_dict[source.gramps_id] = source
else: else:
emit = "source-add" emit = "source-add"
self._source_dict[source.handle] = source self._source_dict[source.handle] = source
self._source_id_dict[source.gramps_id] = source
if not trans.batch: if not trans.batch:
self.update_backlinks(source) self.update_backlinks(source)
op = TXNUPD if old_source else TXNADD op = TXNUPD if old_source else TXNADD
@@ -393,9 +411,11 @@ class DictionaryDb(DbGeneric):
emit = "repository-update" emit = "repository-update"
old_repository = self.get_repository_from_handle(repository.handle).serialize() old_repository = self.get_repository_from_handle(repository.handle).serialize()
self._repository_dict[repository.handle] = repository self._repository_dict[repository.handle] = repository
self._repository_id_dict[repository.gramps_id] = repository
else: else:
emit = "repository-add" emit = "repository-add"
self._repository_dict[repository.handle] = repository self._repository_dict[repository.handle] = repository
self._repository_id_dict[repository.gramps_id] = repository
if not trans.batch: if not trans.batch:
self.update_backlinks(repository) self.update_backlinks(repository)
op = TXNUPD if old_repository else TXNADD op = TXNUPD if old_repository else TXNADD
@@ -420,9 +440,11 @@ class DictionaryDb(DbGeneric):
emit = "note-update" emit = "note-update"
old_note = self.get_note_from_handle(note.handle).serialize() old_note = self.get_note_from_handle(note.handle).serialize()
self._note_dict[note.handle] = note self._note_dict[note.handle] = note
self._note_id_dict[note.gramps_id] = note
else: else:
emit = "note-add" emit = "note-add"
self._note_dict[note.handle] = note self._note_dict[note.handle] = note
self._note_id_dict[note.gramps_id] = note
if not trans.batch: if not trans.batch:
self.update_backlinks(note) self.update_backlinks(note)
op = TXNUPD if old_note else TXNADD op = TXNUPD if old_note else TXNADD
@@ -444,9 +466,11 @@ class DictionaryDb(DbGeneric):
emit = "place-update" emit = "place-update"
old_place = self.get_place_from_handle(place.handle).serialize() old_place = self.get_place_from_handle(place.handle).serialize()
self._place_dict[place.handle] = place self._place_dict[place.handle] = place
self._place_id_dict[place.gramps_id] = place
else: else:
emit = "place-add" emit = "place-add"
self._place_dict[place.handle] = place self._place_dict[place.handle] = place
self._place_id_dict[place.gramps_id] = place
if not trans.batch: if not trans.batch:
self.update_backlinks(place) self.update_backlinks(place)
op = TXNUPD if old_place else TXNADD op = TXNUPD if old_place else TXNADD
@@ -477,9 +501,11 @@ class DictionaryDb(DbGeneric):
emit = "event-update" emit = "event-update"
old_event = self.get_event_from_handle(event.handle).serialize() old_event = self.get_event_from_handle(event.handle).serialize()
self._event_dict[event.handle] = event self._event_dict[event.handle] = event
self._event_id_dict[event.gramps_id] = event
else: else:
emit = "event-add" emit = "event-add"
self._event_dict[event.handle] = event self._event_dict[event.handle] = event
self._event_id_dict[event.gramps_id] = event
if not trans.batch: if not trans.batch:
self.update_backlinks(event) self.update_backlinks(event)
op = TXNUPD if old_event else TXNADD op = TXNUPD if old_event else TXNADD
@@ -507,9 +533,11 @@ class DictionaryDb(DbGeneric):
if tag.handle in self.tag_map: if tag.handle in self.tag_map:
emit = "tag-update" emit = "tag-update"
self._tag_dict[tag.handle] = tag self._tag_dict[tag.handle] = tag
self._tag_name_dict[tag.name] = tag
else: else:
emit = "tag-add" emit = "tag-add"
self._tag_dict[tag.handle] = tag self._tag_dict[tag.handle] = tag
self._tag_name_dict[tag.name] = tag
if not trans.batch: if not trans.batch:
self.update_backlinks(tag) self.update_backlinks(tag)
# Emit after added: # Emit after added:
@@ -523,9 +551,11 @@ class DictionaryDb(DbGeneric):
emit = "media-update" emit = "media-update"
old_media = self.get_object_from_handle(media.handle).serialize() old_media = self.get_object_from_handle(media.handle).serialize()
self._media_dict[media.handle] = media self._media_dict[media.handle] = media
self._media_id_dict[media.gramps_id] = media
else: else:
emit = "media-add" emit = "media-add"
self._media_dict[media.handle] = media self._media_dict[media.handle] = media
self._media_id_dict[media.gramps_id] = media
if not trans.batch: if not trans.batch:
self.update_backlinks(media) self.update_backlinks(media)
op = TXNUPD if old_media else TXNADD op = TXNUPD if old_media else TXNADD
@@ -569,6 +599,7 @@ class DictionaryDb(DbGeneric):
if handle in self.person_map: if handle in self.person_map:
person = Person.create(self.person_map[handle]) person = Person.create(self.person_map[handle])
del self._person_dict[handle] del self._person_dict[handle]
del self._person_id_dict[person.gramps_id]
self.emit("person-delete", ([handle],)) self.emit("person-delete", ([handle],))
if not transaction.batch: if not transaction.batch:
transaction.add(PERSON_KEY, TXNDEL, person.handle, transaction.add(PERSON_KEY, TXNDEL, person.handle,
@@ -590,7 +621,10 @@ class DictionaryDb(DbGeneric):
return return
if handle in data_map: if handle in data_map:
dict = getattr(self, "_%s_dict" % key2table[key]) dict = getattr(self, "_%s_dict" % key2table[key])
obj = dict[handle]
del dict[handle] del dict[handle]
dict = getattr(self, "_%s_id_dict" % key2table[key])
del dict[obj.gramps_id]
self.emit(KEY_TO_NAME_MAP[key] + "-delete", ([handle],)) self.emit(KEY_TO_NAME_MAP[key] + "-delete", ([handle],))
if not transaction.batch: if not transaction.batch:
data = data_map[handle] data = data_map[handle]
@@ -730,40 +764,31 @@ class DictionaryDb(DbGeneric):
return key in self._tag_dict return key in self._tag_dict
def has_gramps_id_for_person(self, key): def has_gramps_id_for_person(self, key):
# FIXME: linear return (key in self._person_id_dict)
return len([x for x in self._person_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_family(self, key): def has_gramps_id_for_family(self, key):
# FIXME: linear return (key in self._family_id_dict)
return len([x for x in self._family_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_source(self, key): def has_gramps_id_for_source(self, key):
# FIXME: linear return (key in self._source_id_dict)
return len([x for x in self._source_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_citation(self, key): def has_gramps_id_for_citation(self, key):
# FIXME: linear return (key in self._citation_id_dict)
return len([x for x in self._citation_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_event(self, key): def has_gramps_id_for_event(self, key):
# FIXME: linear return (key in self._event_id_dict)
return len([x for x in self._event_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_media(self, key): def has_gramps_id_for_media(self, key):
# FIXME: linear return (key in self._media_id_dict)
return len([x for x in self._media_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_place(self, key): def has_gramps_id_for_place(self, key):
# FIXME: linear return (key in self._place_id_dict)
return len([x for x in self._place_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_repository(self, key): def has_gramps_id_for_repository(self, key):
# FIXME: linear return (key in self._repository_id_dict)
return len([x for x in self._repository_dict.values() if x.gramps_id == key]) > 0
def has_gramps_id_for_note(self, key): def has_gramps_id_for_note(self, key):
# FIXME: linear return (key in self._note_id_dict)
return len([x for x in self._note_dict.values() if x.gramps_id == key]) > 0
def get_person_gramps_ids(self): def get_person_gramps_ids(self):
return [x.gramps_id for x in self._person_dict.values()] return [x.gramps_id for x in self._person_dict.values()]
@@ -797,90 +822,72 @@ class DictionaryDb(DbGeneric):
return self._person_dict[key].serialize() return self._person_dict[key].serialize()
def _get_raw_person_from_id_data(self, key): def _get_raw_person_from_id_data(self, key):
# FIXME: linear if key in self._person_id_dict:
for x in self._person_dict.values(): return self._person_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_family_data(self, key): def _get_raw_family_data(self, key):
if key in self._family_dict: if key in self._family_dict:
return self._family_dict[key].serialize() return self._family_dict[key].serialize()
def _get_raw_family_from_id_data(self, key): def _get_raw_family_from_id_data(self, key):
# FIXME: linear if key in self._family_id_dict:
for x in self._family_dict.values(): return self._family_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_source_data(self, key): def _get_raw_source_data(self, key):
if key in self._source_dict: if key in self._source_dict:
return self._source_dict[key].serialize() return self._source_dict[key].serialize()
def _get_raw_source_from_id_data(self, key): def _get_raw_source_from_id_data(self, key):
# FIXME: linear if key in self._source_id_dict:
for x in self._source_dict.values(): return self._source_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_citation_data(self, key): def _get_raw_citation_data(self, key):
if key in self._citation_dict: if key in self._citation_dict:
return self._citation_dict[key].serialize() return self._citation_dict[key].serialize()
def _get_raw_citation_from_id_data(self, key): def _get_raw_citation_from_id_data(self, key):
# FIXME: linear if key in self._citation_id_dict:
for x in self._citation_dict.values(): return self._citation_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_event_data(self, key): def _get_raw_event_data(self, key):
if key in self._event_dict: if key in self._event_dict:
return self._event_dict[key].serialize() return self._event_dict[key].serialize()
def _get_raw_event_from_id_data(self, key): def _get_raw_event_from_id_data(self, key):
# FIXME: linear if key in self._event_id_dict:
for x in self._event_dict.values(): return self._event_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_media_data(self, key): def _get_raw_media_data(self, key):
if key in self._media_dict: if key in self._media_dict:
return self._media_dict[key].serialize() return self._media_dict[key].serialize()
def _get_raw_media_from_id_data(self, key): def _get_raw_media_from_id_data(self, key):
# FIXME: linear if key in self._media_id_dict:
for x in self._media_dict.values(): return self._media_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_place_data(self, key): def _get_raw_place_data(self, key):
if key in self._place_dict: if key in self._place_dict:
return self._place_dict[key].serialize() return self._place_dict[key].serialize()
def _get_raw_place_from_id_data(self, key): def _get_raw_place_from_id_data(self, key):
# FIXME: linear if key in self._place_id_dict:
for x in self._place_dict.values(): return self._place_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_repository_data(self, key): def _get_raw_repository_data(self, key):
if key in self._repository_dict: if key in self._repository_dict:
return self._repository_dict[key].serialize() return self._repository_dict[key].serialize()
def _get_raw_repository_from_id_data(self, key): def _get_raw_repository_from_id_data(self, key):
# FIXME: linear if key in self._repository_id_dict:
for x in self._repository_dict.values(): return self._repository_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_note_data(self, key): def _get_raw_note_data(self, key):
if key in self._note_dict: if key in self._note_dict:
return self._note_dict[key].serialize() return self._note_dict[key].serialize()
def _get_raw_note_from_id_data(self, key): def _get_raw_note_from_id_data(self, key):
# FIXME: linear if key in self._note_id_dict:
for x in self._note_dict.values(): return self._note_id_dict[key].serialize()
if x.gramps_id == key:
return x.serialize()
def _get_raw_tag_data(self, key): def _get_raw_tag_data(self, key):
if key in self._tag_dict: if key in self._tag_dict:
@@ -954,6 +961,18 @@ class DictionaryDb(DbGeneric):
self._repository_dict = {} self._repository_dict = {}
self._note_dict = {} self._note_dict = {}
self._tag_dict = {} self._tag_dict = {}
# Gramps id dicts:
self._person_id_dict = {}
self._family_id_dict = {}
self._source_id_dict = {}
self._citation_id_dict = {}
self._event_id_dict = {}
self._media_id_dict = {}
self._place_id_dict = {}
self._repository_id_dict = {}
self._note_id_dict = {}
# Name:
self._tag_name_dict = {}
# Secondary: # Secondary:
self._reference_list = [] self._reference_list = []