Random lookup algorithm is now more naive, but less broken.

This commit is contained in:
Eevee 2011-04-03 01:56:27 -07:00
parent c519a4c824
commit 721b07084f

View file

@ -563,25 +563,18 @@ class PokedexLookup(object):
table_names = self.indexed_tables.keys() table_names = self.indexed_tables.keys()
table_names.remove('pokemon_forms') table_names.remove('pokemon_forms')
# Rather than create an array of many hundred items and pick randomly # Pick a random table, then pick a random item from it. Small tables
# from it, just pick a number up to the total number of potential # like Type will have an unnatural bias. The alternative is that a
# items, then pick randomly from that, and partition the whole range # simple search for "random" will do some eight queries, counting the
# into chunks. This also avoids the slight problem that the index # rows in every single indexed table, and that's awful.
# contains more rows (for languages) for some items than others. # XXX Can we improve on this, reasonably?
# XXX ought to cache this (in the index?) if possible table_name = random.choice(table_names)
total = 0 count = self.session.query(self.indexed_tables[table_name]).count()
partitions = [] id, = self.session.query(self.indexed_tables[table_name].id) \
for table_name in table_names: .offset(random.randint(0, count - 1)) \
count = self.session.query(self.indexed_tables[table_name]).count() .first()
total += count
partitions.append((table_name, count))
n = random.randint(1, total) return self.lookup(unicode(id), valid_types=[table_name])
while n > partitions[0][1]:
n -= partitions[0][1]
partitions.pop(0)
return self.lookup(unicode(n), valid_types=[ partitions[0][0] ])
def prefix_lookup(self, prefix, valid_types=[]): def prefix_lookup(self, prefix, valid_types=[]):
"""Returns terms starting with the given exact prefix. """Returns terms starting with the given exact prefix.