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
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
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
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
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')
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')
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")