def cleanup(self): day = 24 * 60 * 60 now = time.time() q = [] self.progress_.show() for grp, lim in [(30.0, Settings.get('group_month')), (7.0, Settings.get('group_week')), (1.0, Settings.get('group_day'))]: w = now - day * lim g = grp * day q.extend( DB.fetchall(''' select avg(w), data, type, agg_mean(time, count), sum(count), sum(mistakes), agg_median(viscosity) from statistic where w <= %f group by data, type, cast(w/%f as int)''' % (w, g))) self.progress_.inc() DB.execute('''delete from statistic where w <= ?''', (w, )) self.progress_.inc() DB.executemany( '''insert into statistic (w, data, type, time, count, mistakes, viscosity) VALUES (?, ?, ?, ?, ?, ?, ?)''', q) self.progress_.inc() DB.commit() DB.execute('vacuum') self.progress_.inc() self.progress_.hide()
def removeSelected(self): cats, texts = self.getSelected() DB.executemany("delete from text where rowid = ?", map(lambda x:(x, ), texts)) self.removeUnused() self.update() DB.commit()
def removeSelected(self): cats, texts = self.getSelected() DB.executemany("delete from text where rowid = ?", map(lambda x: (x, ), texts)) self.removeUnused() self.update() DB.commit()
def cleanup(self): s_in_day = 24*60*60 now = time.time() pending = [] for idx, grp, lim in [ (1, 30, Settings.get("group_month")), (2, 7, Settings.get("group_week")), (3, 1, Settings.get("group_day")), ]: minimum = now - s_in_day * lim binsize = s_in_day * grp pending.extend(DB.fetchall(f""" select avg(w), data, type, agg_mean(time, count), sum(count), sum(mistakes), agg_median(viscosity) from statistic where w <= {minimum} group by data, type, cast(w/{binsize} as int)""")) self.progressbar.set_fraction(idx/5) DB.executemany("""insert into statistic (w, data, type, time, count, mistakes, viscosity) values (?,?,?,?,?,?,?)""", pending) self.progressbar.set_fraction(4/5) # FIXME vacuum not supported # DB.execute("vacuum") self.progressbar.set_fraction(5/5) DB.commit() self.progressbar.set_fraction(0)
def cleanup(self): day = 24*60*60 now = time.time() q = [] self.progress_.show() for grp, lim in [(30.0, Settings.get('group_month')), (7.0, Settings.get('group_week')), (1.0, Settings.get('group_day'))]: w = now - day*lim g = grp * day q.extend(DB.fetchall(''' select avg(w), data, type, agg_mean(time, count), sum(count), sum(mistakes), agg_median(viscosity) from statistic where w <= %f group by data, type, cast(w/%f as int)''' % (w, g))) self.progress_.inc() DB.execute('''delete from statistic where w <= ?''', (w, )) self.progress_.inc() DB.executemany('''insert into statistic (w, data, type, time, count, mistakes, viscosity) VALUES (?, ?, ?, ?, ?, ?, ?)''', q) self.progress_.inc() DB.execute('vacuum') self.progress_.inc() DB.commit() self.progress_.hide()
def disableSelected(self): cats, texts = self.getSelected() DB.setRegex(Settings.get('text_regex')) DB.executemany("""update text set disabled = ifelse(disabled,NULL,1) where rowid = ? and regex_match(text) = 1""", map(lambda x:(x, ), texts)) DB.executemany("""update text set disabled = ifelse(disabled,NULL,1) where source = ? and regex_match(text) = 1""", map(lambda x:(x, ), cats)) self.update()
def disableSelected(self): cats, texts = self.getSelected() DB.setRegex(Settings.get('text_regex')) DB.executemany("""update text set disabled = ifelse(disabled,NULL,1) where rowid = ? and regex_match(text) = 1""", [(x, ) for x in texts]) DB.executemany("""update text set disabled = ifelse(disabled,NULL,1) where source = ? and regex_match(text) = 1""", [(x, ) for x in cats]) self.update()
def disableAllSelected(self): cats, texts = self.getSelected() DB.setRegex(Settings.get('text_regex')) DB.executemany( """update text set disabled = ifelse(disabled, NULL, 1) where rowid = ?""", map(lambda x: (x, ), texts)) DB.executemany( """update text set disabled = ifelse(disabled, NULL, 1) where source = ?""", map(lambda x: (x, ), cats)) self.update()
def disableSelected(self): cats, texts = self.getSelected() DB.setRegex(Settings.get("text_regex")) DB.executemany( """update text set disabled = ifelse(disabled,NULL,1) where rowid = ? and regex_match(text) = 1""", map(lambda x: (x, ), texts), ) DB.executemany( """update text set disabled = ifelse(disabled,NULL,1) where source = ? and regex_match(text) = 1""", map(lambda x: (x, ), cats), ) self.update()
def done(self): print("DONE") # TODO split into smaller bits now = timer() elapsed, chars, times, mis, mistakes = self.typer.get_stats() text = self.text[2] assert chars == len(text) accuracy = 1.0 - sum(1 for f in mis if f) / chars spc = elapsed / chars viscosity = sum((t / spc - 1)**2 for t in times) / chars DB.execute( """insert into result (w, text_id, source, wpm, accuracy, viscosity) values (?,?,?,?,?,?)""", (now, self.text[0], self.text[1], 12.0 / spc, accuracy, viscosity)) wpm_median, acc_median = DB.fetchone( f"""select agg_median(wpm),agg_median(acc) from (select wpm,100.0*accuracy as acc from result order by w desc limit {Settings.get("def_group_by")})""", (0.0, 100.0)) self.result.set_text( "Last: {:.1f}wpm ({:.1f}%), last 10 average: {:.1f}wpm ({:.1f}%)". format(12.0 / spc, 100.0 * accuracy, wpm_median, acc_median)) self.emit("stats-changed") stats = collections.defaultdict(Statistic) viscs = collections.defaultdict(Statistic) for char, time, mistake in zip(text, times, mis): stats[char].append(time, mistake) viscs[char].append((time / spc - 1)**2) def gen_tup(start, end): span = end - start char_avg = sum(times[start:end]) / span visc = sum((t / char_avg - 1)**2 for t in times[start:end]) / span return (text[start:end], char_avg, sum(1 for f in mis[start:end] if f), visc) for trigraph, time, mist, visc in [ gen_tup(i, i + 3) for i in range(0, chars - 2) ]: stats[trigraph].append(time, mist > 0) viscs[trigraph].append(visc) regex = re.compile(r"(\w|'(?![A-Z]))+(-\w(\w|')*)*") for word, time, mist, visc in [ gen_tup(*m.span()) for m in regex.finditer(text) if m.end() - m.start() > 3 ]: stats[word].append(time, mist > 0) viscs[word].append(visc) def kind(key): if len(key) == 1: return 0 if len(key) == 3: return 1 return 2 vals = [] for key, stat in stats.items(): visc = viscs[key].median() vals.append((stat.median(), visc * 100.0, now, len(stat), stat.flawed(), kind(key), key)) is_lesson = DB.fetchone("select discount from source where rowid=?", (None, ), (self.text[1], ))[0] if Settings.get("use_lesson_stats") or not is_lesson: DB.executemany( """insert into statistic (time,viscosity,w,count,mistakes,type,data) values (?,?,?,?,?,?,?)""", vals) DB.executemany( "insert into mistake (w,target,mistake,count) values (?,?,?,?)", [(now, k[0], k[1], v) for k, v in mistakes.items()]) if is_lesson: mins = (Settings.get("min_lesson_wpm"), Settings.get("min_lesson_acc")) else: mins = (Settings.get("min_wpm"), Settings.get("min_acc")) if 12.0 / spc < mins[0] or accuracy < mins[1] / 100.0: self.set_target(self.text) elif not is_lesson and Settings.get('auto_review'): words = [x for x in vals if x[5] == 2] if not words: self.emit("want-text") return words.sort(key=lambda x: (x[4], x[0]), reverse=True) i = 0 while words[i][4] != 0: i += 1 i += (len(words) - i) // 4 # TODO support want-review # self.emit("want-review", [x[6] for x in words[0:i]]) else: self.emit("want-text")