Beispiel #1
0
 def route(self):
     result = RoutingResult()
     if not self.logic_tables:
         result.table_units.table_units.append(
             TableUnit(self.sharding_rule.sharding_data_source_names.
                       data_source_names[0]))
     elif len(self.logic_tables) == 1:
         logic_table_name = self.logic_tables[0]
         data_node = self.sharding_rule.find_data_node_by_logic_table_name(
             logic_table_name)
         table_unit = TableUnit(data_node.data_source_name)
         table_unit.routing_tables.append(
             RoutingTable(logic_table_name, data_node.table_name))
         result.table_units.table_units.append(table_unit)
     else:
         routing_tables = list()
         data_source_name = None
         for each in self.logic_tables:
             data_node = self.sharding_rule.find_data_node(
                 data_source_name, each)
             routing_tables.append(RoutingTable(each, data_node.table_name))
             if not data_source_name:
                 data_source_name = data_node.data_source_name
             table_unit = TableUnit(data_source_name)
             table_unit.routing_tables.extend(routing_tables)
             result.table_units.table_units.append(table_unit)
     return result
Beispiel #2
0
 def test_rewrite_column_without_columns_with_parameters(self):
     parameters = ['x', 1]
     self.insert_statement.insert_values_list_last_position = 35
     self.insert_statement.sql_tokens.append(TableToken(12, 0, '`table_x`'))
     self.insert_statement.generate_key_column_index = 0
     self.insert_statement.sql_tokens.append(InsertColumnToken(21, '('))
     items_token = ItemsToken(21)
     items_token.is_first_of_items_special = True
     items_token.items.append('name')
     items_token.items.append('id')
     self.insert_statement.sql_tokens.append(items_token)
     self.insert_statement.sql_tokens.append(InsertColumnToken(21, ')'))
     self.insert_statement.sql_tokens.append(
         InsertValuesToken(29, 'table_x'))
     sharding_condition = InsertShardingCondition('(?, ?)', parameters)
     sharding_condition.data_nodes.append(DataNode('db0.table_1'))
     table_unit = TableUnit('db0')
     table_unit.routing_tables.append(RoutingTable('table_x', 'table_1'))
     sql = 'INSERT INTO `table_x` VALUES (?, ?)'
     rewrite_engine = SQLRewriteEngine(
         self.sharding_rule, sql, DatabaseType.MySQL, self.insert_statement,
         ShardingConditions([sharding_condition]), [])
     rewrite_sql = 'INSERT INTO table_1(name, id) VALUES (?, ?)'
     self.assertEqual(
         rewrite_engine.rewrite(True).to_sql(table_unit, self.table_tokens,
                                             None).sql, rewrite_sql)
Beispiel #3
0
 def _get_all_table_units(self, logic_table_name):
     result = list()
     table_rule = self.sharding_rule.get_table_rule(logic_table_name)
     for each in table_rule.actual_data_nodes:
         table_unit = TableUnit(each.data_source_name)
         table_unit.routing_tables.append(
             RoutingTable(logic_table_name, each.table_name))
         result.append(table_unit)
     return result
 def test_single_table(self):
     routing_result = UnicastRoutingEngine(self.sharding_rule,
                                           ['t_order']).route()
     self.assertTrue(isinstance(routing_result, RoutingResult))
     self.assertEqual(len(routing_result.table_units.table_units), 1)
     self.assertEqual(
         routing_result.table_units.table_units[0].data_source_name, 'ds0')
     self.assertEqual(
         len(routing_result.table_units.table_units[0].routing_tables), 1)
     self.assertEqual(
         routing_result.table_units.table_units[0].routing_tables[0],
         RoutingTable('t_order', 't_order_0'))
    def test_empty_tables(self):
        routing_results = list()

        routing_result = RoutingResult()
        table_unit = TableUnit('ds0')
        table_unit.routing_tables.extend([RoutingTable('t_user', 't_user_0')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds0')
        table_unit.routing_tables.extend([RoutingTable('t_user', 't_user_1')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds1')
        table_unit.routing_tables.extend([RoutingTable('t_user', 't_user_0')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds1')
        table_unit.routing_tables.extend([RoutingTable('t_user', 't_user_1')])
        routing_result.table_units.table_units.append(table_unit)
        routing_results.append(routing_result)

        routing_result = RoutingResult()
        table_unit = TableUnit('ds0')
        table_unit.routing_tables.extend([RoutingTable('t_order', 't_order_0')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds0')
        table_unit.routing_tables.extend([RoutingTable('t_order', 't_order_1')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds1')
        table_unit.routing_tables.extend([RoutingTable('t_order', 't_order_0')])
        routing_result.table_units.table_units.append(table_unit)
        table_unit = TableUnit('ds1')
        table_unit.routing_tables.extend([RoutingTable('t_order', 't_order_1')])
        routing_result.table_units.table_units.append(table_unit)
        routing_results.append(routing_result)

        routing_result = CartesianRoutingEngine(routing_results).route()
        assert_routing_result(self, routing_result, 8,
                              [('ds0', 2, [('t_user', 't_user_0'), ('t_order', 't_order_0')]),
                               ('ds0', 2, [('t_user', 't_user_0'), ('t_order', 't_order_1')]),
                               ('ds0', 2, [('t_user', 't_user_1'), ('t_order', 't_order_0')]),
                               ('ds0', 2, [('t_user', 't_user_1'), ('t_order', 't_order_1')]),
                               ('ds1', 2, [('t_user', 't_user_0'), ('t_order', 't_order_0')]),
                               ('ds1', 2, [('t_user', 't_user_0'), ('t_order', 't_order_1')]),
                               ('ds1', 2, [('t_user', 't_user_1'), ('t_order', 't_order_0')]),
                               ('ds1', 2, [('t_user', 't_user_1'), ('t_order', 't_order_1')])])
Beispiel #6
0
 def test_generate_sql(self):
     parameters = [1, 'x']
     self.select_statement.sql_tokens.append(TableToken(7, 0, 'table_x'))
     self.select_statement.sql_tokens.append(TableToken(31, 0, 'table_x'))
     self.select_statement.sql_tokens.append(TableToken(58, 0, 'table_x'))
     self.select_statement.tables.add(Table('table_x', 'x'))
     self.select_statement.tables.add(Table('table_y', 'y'))
     sql = 'SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?'
     rewrite_engine = SQLRewriteEngine(self.sharding_rule, sql,
                                       DatabaseType.MySQL,
                                       self.select_statement, None,
                                       parameters)
     rewrite_sql = 'SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?'
     table_unit = TableUnit('db0')
     table_unit.routing_tables.append(RoutingTable('table_x', 'table_x'))
     self.assertEqual(
         rewrite_engine.generate_sql(table_unit,
                                     rewrite_engine.rewrite(True)).sql,
         rewrite_sql)
Beispiel #7
0
 def test_rewrite_auto_generated_key_column(self):
     parameters = ['x', 1]
     self.insert_statement.parameters_index = 2
     self.insert_statement.insert_values_list_last_position = 45
     self.insert_statement.sql_tokens.append(TableToken(12, 0, 'table_x'))
     items_token = ItemsToken(30)
     items_token.items.append('id')
     self.insert_statement.sql_tokens.append(items_token)
     self.insert_statement.sql_tokens.append(
         InsertValuesToken(39, 'table_x'))
     sharding_condition = InsertShardingCondition('(?, ?, ?)', parameters)
     sharding_condition.data_nodes.append(DataNode('db0.table_1'))
     table_unit = TableUnit('db0')
     table_unit.routing_tables.append(RoutingTable('table_x', 'table_1'))
     sql = 'INSERT INTO table_x (name, age) VALUES (?, ?)'
     rewrite_engine = SQLRewriteEngine(
         self.sharding_rule, sql, DatabaseType.MySQL, self.insert_statement,
         ShardingConditions([sharding_condition]), parameters)
     rewrite_sql = 'INSERT INTO table_1 (name, age, id) VALUES (?, ?, ?)'
     self.assertEqual(
         rewrite_engine.rewrite(True).to_sql(table_unit, self.table_tokens,
                                             None).sql, rewrite_sql)