Exemple #1
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.commit()
        DB.execute('vacuum')
        self.progress_.inc()
        self.progress_.hide()
Exemple #2
0
 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()
Exemple #3
0
 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()
Exemple #4
0
    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)
Exemple #5
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()
Exemple #6
0
 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()
Exemple #9
0
 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()
Exemple #10
0
    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")