Beispiel #1
0
    def dot_sql(self, line):
        '''execute a SQL query
        <query>

        Execute a SQL query on the underlying SQLite database.
        '''
        try:
            pretty.pp_cursor(self.stdout, self._bdb.sql_execute(line))
        except apsw.Error as e:
            self.stdout.write('%s\n' % (e, ))
        except Exception as e:
            self.stdout.write(traceback.format_exc())
        return False
Beispiel #2
0
    def dot_sql(self, line):
        '''execute a SQL query
        <query>

        Execute a SQL query on the underlying SQLite database.
        '''
        try:
            pretty.pp_cursor(self.stdout, self._bdb.sql_execute(line))
        except sqlite3.Error as e:
            self.stdout.write('%s\n' % (e,))
        except Exception as e:
            self.stdout.write(traceback.format_exc())
        return False
Beispiel #3
0
 def default(self, line):
     # XXX What is this idiocy?  End-of-input is reported the same
     # as the line with characters `E', `O', `F'.
     if line == 'EOF':
         self.stdout.write('\nMoriturus te querio.\n')
         return True
     if self.prompt == self.def_prompt:
         if line.startswith('.'):
             cmd = line
             for i, c in enumerate(line):
                 if c in (' ', '\t'):
                     cmd = line[:i]
                     break
             self.stdout.write('Unknown command: %s\n' % (cmd, ))
             return False
     # Add a line and check whether it finishes a BQL phrase.
     self.bql.write(line)
     self.bql.write('\n')
     string = self.bql.getvalue()
     if parse.bql_string_complete_p(string):
         # Reset the BQL input.
         self.bql = StringIO.StringIO()
         self.prompt = self.def_prompt
         try:
             first = True
             for phrase in parse.parse_bql_string(string):
                 cursor = bql.execute_phrase(self._bdb, phrase)
                 with txn.bayesdb_caching(self._bdb):
                     # Separate the output tables by a blank line.
                     if first:
                         first = False
                     else:
                         self.stdout.write('\n')
                     if cursor is not None:
                         pretty.pp_cursor(self.stdout, cursor)
         except (bayeslite.BayesDBException, bayeslite.BQLParseError) as e:
             self.stdout.write('%s\n' % (e, ))
         except Exception:
             self.stdout.write(traceback.format_exc())
     else:
         self.prompt = self.bql_prompt
     return False
Beispiel #4
0
 def default(self, line):
     # XXX What is this idiocy?  End-of-input is reported the same
     # as the line with characters `E', `O', `F'.
     if line == 'EOF':
         self.stdout.write('\nMoriturus te querio.\n')
         return True
     if self.prompt == self.def_prompt:
         if line.startswith('.'):
             cmd = line
             for i, c in enumerate(line):
                 if c in (' ', '\t'):
                     cmd = line[:i]
                     break
             self.stdout.write('Unknown command: %s\n' % (cmd,))
             return False
     # Add a line and check whether it finishes a BQL phrase.
     self.bql.write(line)
     self.bql.write('\n')
     string = self.bql.getvalue()
     if parse.bql_string_complete_p(string):
         # Reset the BQL input.
         self.bql = StringIO.StringIO()
         self.prompt = self.def_prompt
         try:
             first = True
             for phrase in parse.parse_bql_string(string):
                 cursor = bql.execute_phrase(self._bdb, phrase)
                 with txn.bayesdb_caching(self._bdb):
                     # Separate the output tables by a blank line.
                     if first:
                         first = False
                     else:
                         self.stdout.write('\n')
                     if cursor is not None:
                         pretty.pp_cursor(self.stdout, cursor)
         except (bayeslite.BayesDBException, bayeslite.BQLParseError) as e:
             self.stdout.write('%s\n' % (e,))
         except Exception:
             self.stdout.write(traceback.format_exc())
     else:
         self.prompt = self.bql_prompt
     return False
Beispiel #5
0
    def dot_describe(self, line):
        '''describe BayesDB entities
        [table(s)|generator(s)|columns|model(s)] [<name>...]

        Print a human-readable description of the specified BayesDB
        entities.
        '''
        # XXX Lousy, lousy tokenizer.
        tokens = line.split()
        if len(tokens) == 0:
            self.stdout.write('Usage: .describe table(s) [<table>...]\n')
            self.stdout.write('       .describe population(s) [<pop>...]\n')
            self.stdout.write('       .describe variables <pop>\n')
            self.stdout.write('       .describe generator(s) [<gen>...]\n')
            self.stdout.write('       .describe model(s) <gen> [<model>...]\n')
            return
        if casefold(tokens[0]) == 'table' or \
           casefold(tokens[0]) == 'tables':
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = '1'
            else:
                params = tokens[1:]
                qualifier = \
                    '(' + ' OR '.join(['tabname = ?' for _p in params]) + ')'
                ok = True
                for table in params:
                    if not core.bayesdb_has_table(self._bdb, table):
                        self.stdout.write('No such table: %s\n' %
                                          (repr(table), ))
                        ok = False
                if not ok:
                    return
                for table in params:
                    core.bayesdb_table_guarantee_columns(self._bdb, table)
            sql = '''
                SELECT tabname, colno, name, shortname
                    FROM bayesdb_column
                    WHERE %s
                    ORDER BY tabname ASC, colno ASC
            ''' % (qualifier, )
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout, self._bdb.execute(sql, params))
        elif casefold(tokens[0]) in ('population', 'populations'):
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = '1'
            else:
                params = tokens[1:]
                names = ','.join('?%d' % (i + 1, )
                                 for i in xrange(len(params)))
                qualifier = '(name IN (%s))' % (names, )
                ok = True
                for population in params:
                    if not core.bayesdb_has_population(self._bdb, population):
                        self.stdout.write('No such population: %s\n' %
                                          (repr(population), ))
                        ok = False
                if not ok:
                    return
            with self._bdb.savepoint():
                cursor = self._bdb.sql_execute(
                    '''
                    SELECT id, name, tabname
                        FROM bayesdb_population
                        WHERE %s
                ''' % (qualifier, ), params)
                pretty.pp_cursor(self.stdout, cursor)
        elif casefold(tokens[0]) == 'generator' or \
                casefold(tokens[0]) == 'generators':
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = '1'
            else:
                params = tokens[1:]
                names = ','.join('?%d' % (i + 1, ) for i in range(len(params)))
                qualifier = '''
                    (name IN ({names}))
                '''.format(names=names)
                ok = True
                for generator in params:
                    if not core.bayesdb_has_generator(self._bdb, None,
                                                      generator):
                        self.stdout.write('No such generator: %s\n' %
                                          (repr(generator), ))
                        ok = False
                if not ok:
                    return
            sql = '''
                SELECT id, name, tabname, backend
                    FROM bayesdb_generator
                    WHERE %s
            ''' % (qualifier, )
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout,
                                 self._bdb.sql_execute(sql, params))
        elif casefold(tokens[0]) == 'variables':
            if len(tokens) != 2:
                self.stdout.write('Usage: .describe variables <population>\n')
                return
            population = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_population(self._bdb, population):
                    self.stdout.write('No such population: %r\n' %
                                      (population, ))
                    return
                population_id = core.bayesdb_get_population(
                    self._bdb, population)
                sql = '''
                    SELECT c.colno AS colno, c.name AS name,
                            v.stattype AS stattype, c.shortname AS shortname
                        FROM bayesdb_population AS p,
                            (bayesdb_column AS c LEFT OUTER JOIN
                                bayesdb_variable AS v
                                USING (colno))
                        WHERE p.id = ? AND p.id = v.population_id
                            AND p.tabname = c.tabname
                        ORDER BY colno ASC;
                '''
                cursor = self._bdb.sql_execute(sql, (population_id, ))
                pretty.pp_cursor(self.stdout, cursor)
        elif casefold(tokens[0]) == 'model' or \
                casefold(tokens[0]) == 'models':
            if len(tokens) < 2:
                self.stdout.write('Describe models of what generator?\n')
                return
            generator = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_generator(self._bdb, None, generator):
                    self.stdout.write('No such generator: %s\n' %
                                      (repr(generator), ))
                    return
                generator_id = core.bayesdb_get_generator(
                    self._bdb, None, generator)
                qualifier = None
                if len(tokens) == 2:
                    qualifier = '1'
                else:
                    modelnos = []
                    for token in tokens[2:]:
                        try:
                            modelno = int(token)
                        except ValueError:
                            self.stdout.write('Invalid model number: %s\n' %
                                              (repr(token), ))
                            return
                        else:
                            if not core.bayesdb_generator_has_model(
                                    self._bdb, generator_id, modelno):
                                self.stdout.write('No such model: %d\n' %
                                                  (modelno, ))
                                return
                            modelnos.append(modelno)
                    qualifier = 'modelno IN (%s)' % \
                        (','.join(map(str, modelnos),))
                sql = '''
                    SELECT modelno, iterations FROM bayesdb_generator_model
                        WHERE generator_id = ? AND %s
                ''' % (qualifier, )
                cursor = self._bdb.sql_execute(sql, (generator_id, ))
                pretty.pp_cursor(self.stdout, cursor)
        else:
            self.stdout.write('Usage: .describe table(s) [<table>...]\n')
            self.stdout.write('       .describe generator(s) [<gen>...]\n')
            self.stdout.write('       .describe variables <pop>\n')
            self.stdout.write('       .describe model(s) <gen> [<model>...]\n')
Beispiel #6
0
    def dot_describe(self, line):
        '''describe BayesDB entities
        [table(s)|generator(s)|columns|model(s)] [<name>...]

        Print a human-readable description of the specified BayesDB
        entities.
        '''
        # XXX Lousy, lousy tokenizer.
        tokens = line.split()
        if len(tokens) == 0:
            self.stdout.write('Usage: .describe table(s) [<table>...]\n')
            self.stdout.write('       .describe generator(s) [<gen>...]\n')
            self.stdout.write('       .describe columns <gen>\n')
            self.stdout.write('       .describe model(s) <gen> [<model>...]\n')
            return
        if casefold(tokens[0]) == 'table' or \
           casefold(tokens[0]) == 'tables':
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = '1'
            else:
                params = tokens[1:]
                qualifier = \
                    '(' + ' OR '.join(['tabname = ?' for _p in params]) + ')'
                ok = True
                for table in params:
                    if not core.bayesdb_has_table(self._bdb, table):
                        self.stdout.write('No such table: %s\n' %
                                          (repr(table),))
                        ok = False
                if not ok:
                    return
                for table in params:
                    core.bayesdb_table_guarantee_columns(self._bdb, table)
            sql = '''
                SELECT tabname, colno, name, shortname
                    FROM bayesdb_column
                    WHERE %s
                    ORDER BY tabname ASC, colno ASC
            ''' % (qualifier,)
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout, self._bdb.execute(sql, params))
        elif casefold(tokens[0]) == 'generator' or \
                casefold(tokens[0]) == 'generators':
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = '1'
            else:
                params = tokens[1:]
                names = ','.join('?%d' % (i + 1,) for i in range(len(params)))
                qualifier = '''
                    (name IN ({names}) OR (defaultp AND tabname IN ({names})))
                '''.format(names=names)
                ok = True
                for generator in params:
                    if not core.bayesdb_has_generator_default(self._bdb,
                            generator):
                        self.stdout.write('No such generator: %s\n' %
                            (repr(generator),))
                        ok = False
                if not ok:
                    return
            sql = '''
                SELECT id, name, tabname, metamodel
                    FROM bayesdb_generator
                    WHERE %s
            ''' % (qualifier,)
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout,
                    self._bdb.sql_execute(sql, params))
        elif casefold(tokens[0]) == 'columns':
            if len(tokens) != 2:
                self.stdout.write('Describe columns of what generator?\n')
                return
            generator = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_generator_default(self._bdb,
                        generator):
                    self.stdout.write('No such generator: %s\n' %
                        (repr(generator),))
                    return
                generator_id = core.bayesdb_get_generator_default(self._bdb,
                    generator)
                sql = '''
                    SELECT c.colno AS colno, c.name AS name,
                            gc.stattype AS stattype, c.shortname AS shortname
                        FROM bayesdb_generator AS g,
                            (bayesdb_column AS c LEFT OUTER JOIN
                                bayesdb_generator_column AS gc
                                USING (colno))
                        WHERE g.id = ? AND g.id = gc.generator_id
                            AND g.tabname = c.tabname
                        ORDER BY colno ASC;
                '''
                cursor = self._bdb.sql_execute(sql, (generator_id,))
                pretty.pp_cursor(self.stdout, cursor)
        elif casefold(tokens[0]) == 'model' or \
                casefold(tokens[0]) == 'models':
            if len(tokens) < 2:
                self.stdout.write('Describe models of what generator?\n')
                return
            generator = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_generator_default(self._bdb,
                        generator):
                    self.stdout.write('No such generator: %s\n' %
                        (repr(generator),))
                    return
                generator_id = core.bayesdb_get_generator_default(self._bdb,
                    generator)
                qualifier = None
                if len(tokens) == 2:
                    qualifier = '1'
                else:
                    modelnos = []
                    for token in tokens[2:]:
                        try:
                            modelno = int(token)
                        except ValueError:
                            self.stdout.write('Invalid model number: %s\n' %
                                (repr(token),))
                            return
                        else:
                            if not core.bayesdb_generator_has_model(
                                    self._bdb, generator_id, modelno):
                                self.stdout.write('No such model: %d\n' %
                                    (modelno,))
                                return
                            modelnos.append(modelno)
                    qualifier = 'modelno IN (%s)' % \
                        (','.join(map(str, modelnos),))
                sql = '''
                    SELECT modelno, iterations FROM bayesdb_generator_model
                        WHERE generator_id = ? AND %s
                ''' % (qualifier,)
                cursor = self._bdb.sql_execute(sql, (generator_id,))
                pretty.pp_cursor(self.stdout, cursor)
        else:
            self.stdout.write('Usage: .describe table(s) [<table>...]\n')
            self.stdout.write('       .describe generator(s) [<gen>...]\n')
            self.stdout.write('       .describe columns <gen>\n')
            self.stdout.write('       .describe model(s) <gen> [<model>...]\n')
Beispiel #7
0
    def dot_describe(self, line):
        """describe BayesDB entities
        [table(s)|generator(s)|columns|model(s)] [<name>...]

        Print a human-readable description of the specified BayesDB
        entities.
        """
        # XXX Lousy, lousy tokenizer.
        tokens = line.split()
        if len(tokens) == 0:
            self.stdout.write("Usage: .describe table(s) [<table>...]\n")
            self.stdout.write("       .describe generator(s) [<gen>...]\n")
            self.stdout.write("       .describe columns <gen>\n")
            self.stdout.write("       .describe model(s) <gen> [<model>...]\n")
            return
        if casefold(tokens[0]) == "table" or casefold(tokens[0]) == "tables":
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = "1"
            else:
                params = tokens[1:]
                qualifier = "(" + " OR ".join(["tabname = ?" for _p in params]) + ")"
                ok = True
                for table in params:
                    if not core.bayesdb_has_table(self._bdb, table):
                        self.stdout.write("No such table: %s\n" % (repr(table),))
                        ok = False
                if not ok:
                    return
                for table in params:
                    core.bayesdb_table_guarantee_columns(self._bdb, table)
            sql = """
                SELECT tabname, colno, name, shortname
                    FROM bayesdb_column
                    WHERE %s
                    ORDER BY tabname ASC, colno ASC
            """ % (
                qualifier,
            )
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout, self._bdb.execute(sql, params))
        elif casefold(tokens[0]) == "generator" or casefold(tokens[0]) == "generators":
            params = None
            qualifier = None
            if len(tokens) == 1:
                params = ()
                qualifier = "1"
            else:
                params = tokens[1:]
                names = ",".join("?%d" % (i + 1,) for i in range(len(params)))
                qualifier = """
                    (name IN ({names}) OR (defaultp AND tabname IN ({names})))
                """.format(
                    names=names
                )
                ok = True
                for generator in params:
                    if not core.bayesdb_has_generator_default(self._bdb, generator):
                        self.stdout.write("No such generator: %s\n" % (repr(generator),))
                        ok = False
                if not ok:
                    return
            sql = """
                SELECT id, name, tabname, metamodel
                    FROM bayesdb_generator
                    WHERE %s
            """ % (
                qualifier,
            )
            with self._bdb.savepoint():
                pretty.pp_cursor(self.stdout, self._bdb.sql_execute(sql, params))
        elif casefold(tokens[0]) == "columns":
            if len(tokens) != 2:
                self.stdout.write("Describe columns of what generator?\n")
                return
            generator = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_generator_default(self._bdb, generator):
                    self.stdout.write("No such generator: %s\n" % (repr(generator),))
                    return
                generator_id = core.bayesdb_get_generator_default(self._bdb, generator)
                sql = """
                    SELECT c.colno AS colno, c.name AS name,
                            gc.stattype AS stattype, c.shortname AS shortname
                        FROM bayesdb_generator AS g,
                            (bayesdb_column AS c LEFT OUTER JOIN
                                bayesdb_generator_column AS gc
                                USING (colno))
                        WHERE g.id = ? AND g.id = gc.generator_id
                            AND g.tabname = c.tabname
                        ORDER BY colno ASC;
                """
                cursor = self._bdb.sql_execute(sql, (generator_id,))
                pretty.pp_cursor(self.stdout, cursor)
        elif casefold(tokens[0]) == "model" or casefold(tokens[0]) == "models":
            if len(tokens) < 2:
                self.stdout.write("Describe models of what generator?\n")
                return
            generator = tokens[1]
            with self._bdb.savepoint():
                if not core.bayesdb_has_generator_default(self._bdb, generator):
                    self.stdout.write("No such generator: %s\n" % (repr(generator),))
                    return
                generator_id = core.bayesdb_get_generator_default(self._bdb, generator)
                qualifier = None
                if len(tokens) == 2:
                    qualifier = "1"
                else:
                    modelnos = []
                    for token in tokens[2:]:
                        try:
                            modelno = int(token)
                        except ValueError:
                            self.stdout.write("Invalid model number: %s\n" % (repr(token),))
                            return
                        else:
                            if not core.bayesdb_generator_has_model(self._bdb, generator_id, modelno):
                                self.stdout.write("No such model: %d\n" % (modelno,))
                                return
                            modelnos.append(modelno)
                    qualifier = "modelno IN (%s)" % (",".join(map(str, modelnos)))
                sql = """
                    SELECT modelno, iterations FROM bayesdb_generator_model
                        WHERE generator_id = ? AND %s
                """ % (
                    qualifier,
                )
                cursor = self._bdb.sql_execute(sql, (generator_id,))
                pretty.pp_cursor(self.stdout, cursor)
        else:
            self.stdout.write("Usage: .describe table(s) [<table>...]\n")
            self.stdout.write("       .describe generator(s) [<gen>...]\n")
            self.stdout.write("       .describe columns <gen>\n")
            self.stdout.write("       .describe model(s) <gen> [<model>...]\n")