def get_database_name_out_of_ddl(ddl): clean_ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace(ddl) if clean_ddl.upper().startswith('CREATE DATABASE "'): return SQLTextHelper.get_first_double_quoted_identifier(clean_ddl) elif clean_ddl.upper().startswith('CREATE DATABASE '): database_name = clean_ddl.split(' ')[2] else: raise DDLTransformer.UnsupportedDDLForTransformationException(clean_ddl) return database_name
def get_database_name_out_of_ddl(ddl): clean_ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace( ddl) if clean_ddl.upper().startswith('CREATE DATABASE "'): return SQLTextHelper.get_first_double_quoted_identifier(clean_ddl) elif clean_ddl.upper().startswith('CREATE DATABASE '): database_name = clean_ddl.split(' ')[2] else: raise DDLTransformer.UnsupportedDDLForTransformationException( clean_ddl) return database_name
def get_ddl_for_different_relation_where_relation_just_before_round_bracket( self, ddl, new_table_name=None, new_schema_name=None): """ Get ddl but adapt it to create a relation with different name but same structure :param ddl: ddl from admin.v_generate_tbl_ddl view :param new_table_name: if None don't replace table_name :param new_schema_name: if None don't replace schema_name :return: """ relation_specification = 'Unknown' try: round_bracket_separated_parts = ddl.split('(') first_round_bracket_part = round_bracket_separated_parts[0].rstrip() space_separated_parts = first_round_bracket_part.split(' ') relation_specification = space_separated_parts[-1] relation_regex = self.get_relation_regex_string( quoted_schema=relation_specification.startswith('"'), quoted_table=relation_specification.endswith('"') ) match_dict = re.match(relation_regex, relation_specification).groupdict() relation_specification = '' if self.has_schema_in_ddl(): original_schema_name = SQLTextHelper.quote_unindent(match_dict['schema_name']) new_schema_name = new_schema_name or original_schema_name relation_specification += '{schema}'.format(schema=SQLTextHelper.quote_indent(new_schema_name)) if self.has_table_in_ddl(): original_table_name = SQLTextHelper.quote_unindent(match_dict['table_name']) new_table_name = new_table_name or original_table_name relation_specification += '.{table}'.format(table=SQLTextHelper.quote_indent(new_table_name)) space_separated_parts[-1] = relation_specification round_bracket_separated_parts[0] = ' '.join(space_separated_parts) new_ddl = '('.join(round_bracket_separated_parts) return new_ddl except: logging.debug('Clean ddl: {ddl}\nRelation name: {rel_name}'.format( ddl=ddl, rel_name=relation_specification )) raise DDLTransformer.InvalidDDLSQLException(ddl)
def get_ddl_for_different_relation_where_relation_just_before_round_bracket( self, ddl, new_table_name=None, new_schema_name=None): """ Get ddl but adapt it to create a relation with different name but same structure :param ddl: ddl from admin.v_generate_tbl_ddl view :param new_table_name: if None don't replace table_name :param new_schema_name: if None don't replace schema_name :return: """ relation_specification = 'Unknown' try: round_bracket_separated_parts = ddl.split('(') first_round_bracket_part = round_bracket_separated_parts[0].rstrip( ) space_separated_parts = first_round_bracket_part.split(' ') relation_specification = space_separated_parts[-1] relation_regex = self.get_relation_regex_string( quoted_schema=relation_specification.startswith('"'), quoted_table=relation_specification.endswith('"')) match_dict = re.match(relation_regex, relation_specification).groupdict() relation_specification = '' if self.has_schema_in_ddl(): original_schema_name = SQLTextHelper.quote_unindent( match_dict['schema_name']) new_schema_name = new_schema_name or original_schema_name relation_specification += '{schema}'.format( schema=SQLTextHelper.quote_indent(new_schema_name)) if self.has_table_in_ddl(): original_table_name = SQLTextHelper.quote_unindent( match_dict['table_name']) new_table_name = new_table_name or original_table_name relation_specification += '.{table}'.format( table=SQLTextHelper.quote_indent(new_table_name)) space_separated_parts[-1] = relation_specification round_bracket_separated_parts[0] = ' '.join(space_separated_parts) new_ddl = '('.join(round_bracket_separated_parts) return new_ddl except: logging.debug('Clean ddl: {ddl}\nRelation name: {rel_name}'.format( ddl=ddl, rel_name=relation_specification)) raise DDLTransformer.InvalidDDLSQLException(ddl)
def __init__(self, path_to_v_generate, view_start): logging.debug('From {cwd} open v_generate {path}'.format( cwd=os.getcwd(), path=path_to_v_generate)) with open(path_to_v_generate, 'r') as v_generate: self.view_sql = v_generate.read() self.view_sql = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace( self.view_sql) if self.view_sql.startswith(view_start): self.view_query_sql = self.view_sql[len(view_start):] self.filter_sql = ''
def __init__(self, path_to_v_generate, view_start): logging.debug('From {cwd} open v_generate {path}'.format( cwd=os.getcwd(), path=path_to_v_generate )) with open(path_to_v_generate, 'r') as v_generate: self.view_sql = v_generate.read() self.view_sql = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace(self.view_sql) if self.view_sql.startswith(view_start): self.view_query_sql = self.view_sql[len(view_start):] self.filter_sql = ''
def get_ddl_for_different_relation(ddl, new_table_name=None, new_schema_name=None): logging.debug('Transforming ddl: {ddl}'.format(ddl=ddl)) clean_ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace(ddl) if clean_ddl.upper().startswith('CREATE TABLE IF NOT EXISTS '): return TableDDLTransformer.get_create_table_ddl_for_different_relation( clean_ddl, new_table_name=new_table_name, new_schema_name=new_schema_name ) elif clean_ddl.upper().startswith('CREATE SCHEMA '): return SchemaDDLTransformer.get_create_schema_ddl_for_different_relation( clean_ddl, new_schema_name=new_schema_name ) raise DDLTransformer.UnsupportedDDLForTransformationException(clean_ddl)
def get_create_sql(self, generate=False): logging.debug('get_create_sql for {self}'.format(self=self)) if generate: ddl_dict = self.get_cluster().get_query_full_result_as_list_of_dict( self.get_statement_to_retrieve_ddl_create_statement_text() ) ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace( '\n'.join([r['ddl'] for r in ddl_dict]) ) self.create_sql = ddl return ddl else: if self.create_sql is not None: return self.create_sql else: raise Resource.CreateSQLNotSet('No create sql configured for resource {r}'.format(r=str(self)))
def get_ddl_for_different_relation(ddl, new_table_name=None, new_schema_name=None): logging.debug('Transforming ddl: {ddl}'.format(ddl=ddl)) clean_ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace( ddl) if clean_ddl.upper().startswith('CREATE TABLE IF NOT EXISTS '): return TableDDLTransformer.get_create_table_ddl_for_different_relation( clean_ddl, new_table_name=new_table_name, new_schema_name=new_schema_name) elif clean_ddl.upper().startswith('CREATE SCHEMA '): return SchemaDDLTransformer.get_create_schema_ddl_for_different_relation( clean_ddl, new_schema_name=new_schema_name) raise DDLTransformer.UnsupportedDDLForTransformationException( clean_ddl)
def get_create_sql(self, generate=False): logging.debug('get_create_sql for {self}'.format(self=self)) if generate: ddl_dict = self.get_cluster( ).get_query_full_result_as_list_of_dict( self.get_statement_to_retrieve_ddl_create_statement_text()) ddl = SQLTextHelper.get_sql_without_commands_newlines_and_whitespace( '\n'.join([r['ddl'] for r in ddl_dict])) self.create_sql = ddl return ddl else: if self.create_sql is not None: return self.create_sql else: raise Resource.CreateSQLNotSet( 'No create sql configured for resource {r}'.format( r=str(self)))
def get_sql(self): sql_to_get_all_ddl = SQLTextHelper.remove_trailing_semicolon(self.view_query_sql) return 'SELECT * FROM (' + sql_to_get_all_ddl + ') ' + self.filter_sql + ';'
def get_sql(self): sql_to_get_all_ddl = SQLTextHelper.remove_trailing_semicolon( self.view_query_sql) return 'SELECT * FROM (' + sql_to_get_all_ddl + ') ' + self.filter_sql + ';'
def test_extract_first_double_quoted_identifier_from_string_with_escaped_double_quotes_at_end( self): test_string = 'CREATE DATABASE "test"""' self.assertEquals( '"test"""', SQLTextHelper.get_first_double_quoted_identifier(test_string))