mirror of
https://github.com/veekun/pokedex.git
synced 2024-08-20 18:16:34 +00:00
Random lookup algorithm is now more naive, but less broken.
This commit is contained in:
parent
c519a4c824
commit
721b07084f
1 changed files with 11 additions and 18 deletions
|
@ -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
|
|
||||||
partitions = []
|
|
||||||
for table_name in table_names:
|
|
||||||
count = self.session.query(self.indexed_tables[table_name]).count()
|
count = self.session.query(self.indexed_tables[table_name]).count()
|
||||||
total += count
|
id, = self.session.query(self.indexed_tables[table_name].id) \
|
||||||
partitions.append((table_name, count))
|
.offset(random.randint(0, count - 1)) \
|
||||||
|
.first()
|
||||||
|
|
||||||
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.
|
||||||
|
|
Loading…
Reference in a new issue