def __parse_table(self, table_config): table_strategy = TableStrategyTypes.from_value( table_config.pop("type")) try: if table_strategy == TableStrategyTypes.TRUNCATE: return TruncateTableStrategy(**table_config) elif table_strategy == TableStrategyTypes.DELETE: return DeleteTableStrategy(**table_config) elif table_strategy == TableStrategyTypes.UPDATE_COLUMNS: # update columns supports dict and list columns, so this has to be normalized again during parsing. normalized_columns = StrategyParser.__normalize_update_columns_list( table_config.pop("columns")) parsed_columns = [ self.__parse_update_column(column) for column in normalized_columns ] return UpdateColumnsTableStrategy( column_strategies=parsed_columns, **table_config) else: raise UnknownTableStrategyError(table_config) except TypeError as error: # TypeError can be thrown when the dict args dont match the constructors for the types. We need to re-throw raise ConfigSyntaxError()
def simple_strategy_update(simple_strategy_update_fake_column): return UpdateColumnsTableStrategy("update_table_where_3", [ UniqueEmailUpdateColumnStrategy("column1", where="BANANAS < 5"), UniqueLoginUpdateColumnStrategy("column2", where="BANANAS < 5"), simple_strategy_update_fake_column, EmptyUpdateColumnStrategy("column4") ])
def test_get_update_table_literal(literal_strategy): result_queries = query_factory.get_update_table("seed_table", UpdateColumnsTableStrategy("anon_table", [ LiteralUpdateColumnStrategy("literal_column", "RANDOM()") ])) assert result_queries == [ "UPDATE anon_table AS \"updatetarget\" SET \"literal_column\" = RANDOM();" ]
def test_get_update_table_literal(literal_strategy): result_queries = query_factory.get_update_table( "seed_table", UpdateColumnsTableStrategy( "anon_table", [LiteralUpdateColumnStrategy("literal_column", "RAND()")])) assert result_queries == [ "UPDATE `anon_table` SET `literal_column` = RAND();" ]
def test_get_update_table_literal(literal_strategy): result_queries = query_factory.get_update_table( "seed_table", UpdateColumnsTableStrategy( "anon_table", [LiteralUpdateColumnStrategy("literal_column", "RANDOM()")] ), ) assert result_queries == [ 'UPDATE "anon_table" AS "updatetarget" SET "literal_column" = RANDOM();' ]
def test_get_update_table_fake_column(column_strategy_list): update_table_all = query_factory.get_update_table("seed_table", UpdateColumnsTableStrategy("anon_table", column_strategy_list)) assert update_table_all == [ "UPDATE anon_table AS \"updatetarget\" SET " "\"test_column1\" = ( SELECT first_name FROM seed_table ORDER BY RANDOM(), MD5(\"updatetarget\"::text) LIMIT 1)," "\"test_column2\" = ( SELECT last_name FROM seed_table ORDER BY RANDOM(), MD5(\"updatetarget\"::text) LIMIT 1)," "\"test_column7\" = ( SELECT user_id::UUID FROM seed_table ORDER BY RANDOM(), MD5(\"updatetarget\"::text) LIMIT 1)," "\"test_column3\" = ('')," "\"test_column4\" = ( SELECT md5(random()::text) ORDER BY MD5(\"updatetarget\"::text) LIMIT 1)," "\"test_column5\" = ( SELECT CONCAT(md5(random()::text), '@', md5(random()::text), '.com') ORDER BY MD5(\"updatetarget\"::text) LIMIT 1)," "\"test_column6\" = RANDOM();" ]
def test_get_update_table_fake_column(column_strategy_list): update_table_all = query_factory.get_update_table( "seed_table", UpdateColumnsTableStrategy("anon_table", column_strategy_list)) assert update_table_all == [ "UPDATE anon_table AS \"updatetarget\" SET " "test_column1 = ( SELECT first_name FROM seed_table WHERE \"updatetarget\"=\"updatetarget\" ORDER BY RANDOM() LIMIT 1)," "test_column2 = ( SELECT last_name FROM seed_table WHERE \"updatetarget\"=\"updatetarget\" ORDER BY RANDOM() LIMIT 1)," "test_column3 = ('')," "test_column4 = ( SELECT md5(random()::text) WHERE \"updatetarget\"=\"updatetarget\" )," "test_column5 = ( SELECT CONCAT(md5(random()::text), '@', md5(random()::text), '.com') WHERE \"updatetarget\"=\"updatetarget\" )," "test_column6 = RANDOM();" ]
def test_get_update_table_fake_column(column_strategy_list): update_table_all = query_factory.get_update_table( "seed_table", UpdateColumnsTableStrategy("anon_table", column_strategy_list)) assert update_table_all == [ "UPDATE `anon_table` SET " "`test_column1` = ( SELECT `first_name` FROM `seed_table` ORDER BY RAND() LIMIT 1)," "`test_column2` = ( SELECT `last_name` FROM `seed_table` ORDER BY RAND() LIMIT 1)," "`test_column3` = ('')," "`test_column4` = ( SELECT MD5(FLOOR((NOW() + RAND()) * (RAND() * RAND() / RAND()) + RAND())) )," "`test_column5` = ( SELECT CONCAT(MD5(FLOOR((NOW() + RAND()) * (RAND() * RAND() / RAND()) + RAND())), '@', MD5(FLOOR((NOW() + RAND()) * (RAND() * RAND() / RAND()) + RAND())), '.com') )," "`test_column6` = RAND();" ]
def test_get_update_table_fake_column(column_strategy_list): update_table_all = query_factory.get_update_table( "seed_table", UpdateColumnsTableStrategy("anon_table", column_strategy_list) ) assert update_table_all == [ 'UPDATE "anon_table" AS "updatetarget" SET ' '"test_column1" = ( SELECT "first_name" FROM "seed_table" ORDER BY RANDOM(), MD5("updatetarget"::text) LIMIT 1),' '"test_column2" = ( SELECT "last_name" FROM "seed_table" ORDER BY RANDOM(), MD5("updatetarget"::text) LIMIT 1),' '"test_column7" = ( SELECT "user_id"::UUID FROM "seed_table" ORDER BY RANDOM(), MD5("updatetarget"::text) LIMIT 1),' "\"test_column3\" = ('')," '"test_column4" = ( SELECT md5(random()::text) ORDER BY MD5("updatetarget"::text) LIMIT 1),' "\"test_column5\" = ( SELECT CONCAT(md5(random()::text), '@', md5(random()::text), '.com') ORDER BY MD5(\"updatetarget\"::text) LIMIT 1)," '"test_column6" = RANDOM();' ]
def update_table_strategy_unknown(unsupported_column_strategy): return UpdateColumnsTableStrategy("invalid_table", [unsupported_column_strategy])
def update_table_strategy(column_strategy_list): return UpdateColumnsTableStrategy("table_name", column_strategy_list)