+
+
+def random_lookup(valid_types=[], session=None, indices=None):
+ """Takes similar arguments as `lookup()`, but returns a random lookup
+ result from one of the provided `valid_types`.
+ """
+
+ tables = []
+ for valid_type in valid_types:
+ table_name = _parse_table_name(valid_type)
+ if table_name:
+ tables.append(indexed_tables[table_name])
+
+ if not tables:
+ tables = indexed_tables.values()
+
+ # Rather than create an array of many hundred items and pick randomly from
+ # it, just pick a number up to the total number of potential items, then
+ # pick randomly from that, and partition the whole range into chunks
+ total = 0
+ partitions = []
+ for table in tables:
+ count = session.query(table).count()
+ total += count
+ partitions.append((table, count))
+
+ n = random.randint(1, total)
+ while n > partitions[0][1]:
+ n -= partitions[0][1]
+ partitions.pop(0)
+
+ return lookup(unicode(n), valid_types=[ partitions[0][0] ],
+ indices=indices, session=session)