diff --git a/modules/Markov.py b/modules/Markov.py index 7f64b89..ab72bc4 100644 --- a/modules/Markov.py +++ b/modules/Markov.py @@ -356,7 +356,15 @@ class Markov(Module): values = [] try: db = self.get_db() - query = 'SELECT v FROM markov_chain WHERE k1 = ? AND k2 = ?' + query = '' + if k1 == self.start1 and k2 == self.start2: + # hack. get a quasi-random start from the database, in + # a faster fashion than selecting all starts + max_id = self._get_max_chain_id() + rand_id = random.randint(1,max_id) + query = 'SELECT v FROM markov_chain WHERE k1 = ? AND k2 = ? AND id >= {0:d} LIMIT 1'.format(rand_id) + else: + query = 'SELECT v FROM markov_chain WHERE k1 = ? AND k2 = ?' cursor = db.execute(query, (k1,k2)) results = cursor.fetchall() @@ -387,5 +395,23 @@ class Markov(Module): print('sqlite error: ' + str(e)) raise + def _get_max_chain_id(self): + """Get the highest id in the chain table.""" + + try: + db = self.get_db() + query = ''' + SELECT id FROM markov_chain ORDER BY id DESC LIMIT 1 + ''' + cursor = db.execute(query) + result = cursor.fetchone() + if result: + return result['id'] + else: + return None + except sqlite3.Error as e: + print('sqlite error: ' + str(e)) + raise + # vi:tabstop=4:expandtab:autoindent # kate: indent-mode python;indent-width 4;replace-tabs on;