def _scan_bql_maybe_end(self, text): assert text == '}' if bql_string_complete_p(self._bql.getvalue()): operator = ast.Located([0, self.cur_pos - 1], vv.symbol('bayesdb_bql')) population = ast.Located(self._name_position, vv.symbol(self._name)) bql = ast.Located( [self._bql_start, self.cur_pos - 1], vv.string(self._bql.getvalue())) self.produce(ast.Located([0, self.cur_pos - 1], [operator, population, bql])) else: self._bql.write(text)
def _bql(self, lines): out = StringIO.StringIO() ok = False for line in lines: if ok: self._bdb.execute(out.getvalue()) out = StringIO.StringIO() ok = False out.write('%s\n' % (line, )) if out.getvalue() and bql_string_complete_p(out.getvalue()): ok = True cursor = self._bdb.execute(out.getvalue()) return utils_bql.cursor_to_df(cursor)
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 test_complete(): assert parse.bql_string_complete_p('') assert parse.bql_string_complete_p(';') assert parse.bql_string_complete_p(';;;') assert parse.bql_string_complete_p('\n;\n;;;\n;\n') assert not parse.bql_string_complete_p('select 0') assert parse.bql_string_complete_p('select 0;') assert not parse.bql_string_complete_p('select 0\nfrom t') assert parse.bql_string_complete_p('select 0\nfrom t;') assert not parse.bql_string_complete_p('select 0;select 1') assert parse.bql_string_complete_p('select 0;select 1;') assert not parse.bql_string_complete_p('select 0;\nselect 1') assert parse.bql_string_complete_p('select 0;\nselect 1;')