示例#1
0
    def test_bind_unknown_object(self):
        class UnknownType:
            pass

        with self.assertRaises(NotImplementedError):
            binder = StatementBinder(StatementBinderContext())
            binder.bind(UnknownType())
示例#2
0
 def test_bind_tableref_starts_new_context(self, mock_ctx):
     with patch.object(StatementBinder, 'bind'):
         binder = StatementBinder(StatementBinderContext())
         tableref = MagicMock()
         tableref.is_table_atom.return_value = False
         tableref.is_join.return_value = False
         tableref.is_select.return_value = True
         binder._bind_tableref(tableref)
         self.assertEqual(mock_ctx.call_count, 1)
示例#3
0
 def test_bind_tableref_with_func_expr(self):
     with patch.object(StatementBinder, 'bind') as mock_binder:
         binder = StatementBinder(StatementBinderContext())
         tableref = MagicMock()
         tableref.is_table_atom.return_value = False
         tableref.is_select.return_value = False
         tableref.is_join.return_value = False
         binder._bind_tableref(tableref)
         mock_binder.assert_called_with(tableref.func_expr)
示例#4
0
 def test_bind_load_data_raises(self, mock_tve, mock_create):
     load_statement = MagicMock()
     column = MagicMock()
     load_statement.column_list = [column]
     load_statement.table_ref.table.table_obj = None
     with self.assertRaises(RuntimeError):
         with patch.object(StatementBinder, 'bind'):
             binder = StatementBinder(StatementBinderContext())
             binder._bind_load_data_statement(load_statement)
示例#5
0
 def test_bind_tableref_should_raise(self):
     with patch.object(StatementBinder, 'bind'):
         with self.assertRaises(ValueError):
             binder = StatementBinder(StatementBinderContext())
             tableref = MagicMock()
             tableref.is_select.return_value = False
             tableref.is_func_expr.return_value = False
             tableref.is_join.return_value = False
             tableref.is_table_atom.return_value = False
             binder._bind_tableref(tableref)
示例#6
0
 def test_bind_tableref_with_join(self):
     with patch.object(StatementBinder, 'bind') as mock_binder:
         binder = StatementBinder(StatementBinderContext())
         tableref = MagicMock()
         tableref.is_table_atom.return_value = False
         tableref.is_select.return_value = False
         tableref.is_join.return_value = True
         binder._bind_tableref(tableref)
         mock_binder.assert_any_call(tableref.join_node.left)
         mock_binder.assert_any_call(tableref.join_node.right)
示例#7
0
 def test_bind_tuple_value_expression(self):
     with patch.object(StatementBinderContext, 'get_binded_column') as mock:
         mock.return_value = ['table_alias', 'col_obj']
         binder = StatementBinder(StatementBinderContext())
         tve = MagicMock()
         tve.col_name = 'col_name'
         binder._bind_tuple_expr(tve)
         col_alias = '{}.{}'.format('table_alias', 'col_name')
         mock.assert_called_with(tve.col_name, tve.table_alias)
         self.assertEqual(tve.col_object, 'col_obj')
         self.assertEqual(tve.col_alias, col_alias)
示例#8
0
 def test_bind_select_statement(self):
     with patch.object(StatementBinder, 'bind') as mock_binder:
         binder = StatementBinder(StatementBinderContext())
         select_statement = MagicMock()
         mocks = [MagicMock(), MagicMock(), MagicMock(), MagicMock()]
         select_statement.target_list = mocks[:2]
         select_statement.orderby_list = [(mocks[2], 0), (mocks[3], 0)]
         binder._bind_select_statement(select_statement)
         mock_binder.assert_any_call(select_statement.from_table)
         mock_binder.assert_any_call(select_statement.where_clause)
         mock_binder.assert_any_call(select_statement.union_link)
         for mock in mocks:
             mock_binder.assert_any_call(mock)
示例#9
0
    def test_bind_load_data(self, mock_tve, mock_create):
        load_statement = MagicMock()
        column = MagicMock()
        load_statement.column_list = [column]

        table_ref_obj = MagicMock()
        table_ref_obj.columns = [column]

        with patch.object(StatementBinder, 'bind') as mock_binder:
            binder = StatementBinder(StatementBinderContext())
            binder._bind_load_data_statement(load_statement)
            mock_binder.assert_any_call(load_statement.table_ref)
            mock_create.assert_not_called()
            mock_tve.assert_not_called()
            mock_binder.assert_any_call(column)
示例#10
0
    def test_bind_select_statement_union_starts_new_context(self, mock_ctx):
        with patch.object(StatementBinder, 'bind'):
            binder = StatementBinder(StatementBinderContext())
            select_statement = MagicMock()
            select_statement.union_link = None
            binder._bind_select_statement(select_statement)
            self.assertEqual(mock_ctx.call_count, 0)

            binder = StatementBinder(StatementBinderContext())
            select_statement = MagicMock()
            binder._bind_select_statement(select_statement)
            self.assertEqual(mock_ctx.call_count, 1)
示例#11
0
def execute_query(query) -> Iterator[Batch]:
    """
    Execute the query and return a result generator.
    """
    stmt = Parser().parse(query)[0]
    try:
        StatementBinder(StatementBinderContext()).bind(stmt)
    except Exception as error:
        raise RuntimeError(f'Binder failed: {error}')
    l_plan = StatementToPlanConvertor().visit(stmt)
    p_plan = PlanGenerator().build(l_plan)
    return PlanExecutor(p_plan).execute_plan()
示例#12
0
    def test_bind_load_video_statement(self, mock_tve, mock_create):
        load_statement = MagicMock()
        load_statement.file_options = {'file_format': FileFormatType.VIDEO}
        load_statement.column_list = None
        column = MagicMock()
        table_ref_obj = MagicMock()
        table_ref_obj.columns = [column]
        table_ref_obj.name = 'table_alias'
        load_statement.table_ref.table.table_obj = table_ref_obj
        load_statement.table_ref.table.table_name = 'table_name'
        mock_tve.return_value = tve_return_value = MagicMock()

        with patch.object(StatementBinder, 'bind') as mock_binder:
            binder = StatementBinder(StatementBinderContext())
            binder._bind_load_data_statement(load_statement)
            mock_binder.assert_any_call(load_statement.table_ref)
            mock_create.assert_any_call('table_name')
            mock_tve.assert_called_with(col_name=column.name,
                                        table_alias='table_alias',
                                        col_object=column)
            mock_binder.assert_any_call(tve_return_value)
            self.assertEqual(load_statement.column_list, [tve_return_value])
示例#13
0
    def test_bind_func_expr(self, mock_path_to_class, mock_catalog):
        # setup
        func_expr = MagicMock(alias='func_expr', output_col_aliases=[])
        obj1 = MagicMock()
        obj1.name.lower.return_value = 'out1'
        obj2 = MagicMock()
        obj2.name.lower.return_value = 'out2'
        func_ouput_objs = [obj1, obj2]
        udf_obj = MagicMock()
        mock_get_name = mock_catalog().get_udf_by_name = MagicMock()
        mock_get_name.return_value = udf_obj

        mock_get_udf_outputs = mock_catalog().get_udf_outputs = MagicMock()
        mock_get_udf_outputs.return_value = func_ouput_objs
        mock_path_to_class.return_value.return_value = 'path_to_class'

        # Case 1 set output
        func_expr.output = 'out1'
        binder = StatementBinder(StatementBinderContext())
        binder._bind_func_expr(func_expr)

        mock_get_name.assert_called_with(func_expr.name)
        mock_get_udf_outputs.assert_called_with(udf_obj)
        mock_path_to_class.assert_called_with(udf_obj.impl_file_path,
                                              udf_obj.name)
        self.assertEqual(func_expr.output_objs, [obj1])
        self.assertEqual(func_expr.output_col_aliases,
                         ['{}.{}'.format(func_expr.alias, obj1.name.lower())])
        self.assertEqual(func_expr.function, 'path_to_class')

        # Case 2 output not set
        func_expr.output = None
        binder = StatementBinder(StatementBinderContext())
        binder._bind_func_expr(func_expr)

        mock_get_name.assert_called_with(func_expr.name)
        mock_get_udf_outputs.assert_called_with(udf_obj)
        mock_path_to_class.assert_called_with(udf_obj.impl_file_path,
                                              udf_obj.name)
        self.assertEqual(func_expr.output_objs, func_ouput_objs)
        self.assertEqual(func_expr.output_col_aliases,
                         ['func_expr.out1', 'func_expr.out2'])
        self.assertEqual(func_expr.function, 'path_to_class')
示例#14
0
    def test_bind_tableref(self, mock_bind_tabe_info):
        with patch.object(StatementBinderContext, 'add_table_alias') as mock:
            binder = StatementBinder(StatementBinderContext())
            tableref = MagicMock()
            tableref.is_table_atom.return_value = True
            binder._bind_tableref(tableref)
            mock.assert_called_with(tableref.alias, tableref.table.table_name)
            mock_bind_tabe_info.assert_called_once_with(tableref.table)

        with patch.object(StatementBinder, 'bind') as mock_binder:
            with patch.object(StatementBinderContext,
                              'add_derived_table_alias') as mock_context:
                binder = StatementBinder(StatementBinderContext())
                tableref = MagicMock()
                tableref.is_table_atom.return_value = False
                tableref.is_select.return_value = True
                binder._bind_tableref(tableref)
                mock_context.assert_called_with(
                    tableref.alias, tableref.select_statement.target_list)
                mock_binder.assert_called_with(tableref.select_statement)
示例#15
0
 def test_bind_create_mat_statement(self):
     with patch.object(StatementBinder, 'bind') as mock_binder:
         binder = StatementBinder(StatementBinderContext())
         mat_statement = MagicMock()
         binder._bind_create_mat_statement(mat_statement)
         mock_binder.assert_called_with(mat_statement.query)