• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

georgia-tech-db / eva / #725

pending completion
#725

push

circle-ci

web-flow
chore: reducing coverage loss (#619)

* adding delete operation

* Adding Insert Statement

* checkpoint

* supporting multiple entries

* implemented for structured data error

* adding parser visitor for delete

* delete executor

* delete plan and rules

* adding delete to plan executor

* change position of LogicalDelete

* logical delimeter

* delete test case

* adding test case

* adding test case

* adding delete testcase

* adding predicate to delete executor

* adding delete to Image storage

* bug fix in delete

* fixing testcase

* adding test case for insert statement

* remove order_by from statement_binder.py

* better variable names, using Batch

* error message for insert

* removing order_by and limit from delete

* remove order_by and limit

* use f-string

* adding to changelog

* removing commit messages

* formatting

* fixing comments

* formatting

* eva insert f32 values

* fix: should delete range

* delete multiple rows

* udf bootstrap

* try to run tests in parallel

* minor fix for ray to work

* ray fixes

---------

Co-authored-by: Aryan-Rajoria <aryanrajoria1003@gmail.com>
Co-authored-by: Gaurav <gaurav21776@gmail.com>

236 of 236 new or added lines in 53 files covered. (100.0%)

7003 of 9005 relevant lines covered (77.77%)

0.78 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.18
/eva/executor/create_mat_view_executor.py
1
# coding=utf-8
2
# Copyright 2018-2022 EVA
3
#
4
# Licensed under the Apache License, Version 2.0 (the "License");
5
# you may not use this file except in compliance with the License.
6
# You may obtain a copy of the License at
7
#
8
#     http://www.apache.org/licenses/LICENSE-2.0
9
#
10
# Unless required by applicable law or agreed to in writing, software
11
# distributed under the License is distributed on an "AS IS" BASIS,
12
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
# See the License for the specific language governing permissions and
14
# limitations under the License.
15
from eva.catalog.catalog_manager import CatalogManager
1✔
16
from eva.executor.abstract_executor import AbstractExecutor
1✔
17
from eva.executor.executor_utils import ExecutorError, handle_if_not_exists
1✔
18
from eva.expression.abstract_expression import ExpressionType
1✔
19
from eva.parser.create_statement import ColumnDefinition
1✔
20
from eva.plan_nodes.create_mat_view_plan import CreateMaterializedViewPlan
1✔
21
from eva.plan_nodes.types import PlanOprType
1✔
22
from eva.storage.storage_engine import StorageEngine
1✔
23
from eva.utils.logging_manager import logger
1✔
24

25

26
class CreateMaterializedViewExecutor(AbstractExecutor):
1✔
27
    def __init__(self, node: CreateMaterializedViewPlan):
1✔
28
        super().__init__(node)
1✔
29
        self.catalog = CatalogManager()
1✔
30

31
    def exec(self, *args, **kwargs):
1✔
32
        """Create materialized view executor"""
33
        if not handle_if_not_exists(self.node.view, self.node.if_not_exists):
1✔
34
            child = self.children[0]
1✔
35
            project_cols = None
1✔
36
            # only support seq scan based materialization
37
            if child.node.opr_type == PlanOprType.SEQUENTIAL_SCAN:
1✔
38
                project_cols = child.project_expr
1✔
39
            elif child.node.opr_type == PlanOprType.PROJECT:
1✔
40
                project_cols = child.target_list
1✔
41
            else:
42
                err_msg = "Invalid query {}, expected {} or {}".format(
1✔
43
                    child.node.opr_type,
44
                    PlanOprType.SEQUENTIAL_SCAN,
45
                    PlanOprType.PROJECT,
46
                )
47

48
                logger.error(err_msg)
1✔
49
                raise ExecutorError(err_msg)
1✔
50

51
            # gather child projected column objects
52
            child_objs = []
1✔
53
            for child_col in project_cols:
1✔
54
                if child_col.etype == ExpressionType.TUPLE_VALUE:
×
55
                    child_objs.append(child_col.col_object)
×
56
                elif child_col.etype == ExpressionType.FUNCTION_EXPRESSION:
×
57
                    child_objs.extend(child_col.output_objs)
×
58

59
            # Number of projected columns should be equal to mat view columns
60
            if len(self.node.columns) != len(child_objs):
1✔
61
                err_msg = "# projected columns mismatch, expected {} found {}\
1✔
62
                ".format(
63
                    len(self.node.columns), len(child_objs)
64
                )
65
                logger.error(err_msg)
1✔
66
                raise ExecutorError(err_msg)
1✔
67

68
            col_defs = []
×
69
            # Copy column type info from child columns
70
            for idx, child_col_obj in enumerate(child_objs):
×
71
                col = self.node.columns[idx]
×
72
                col_defs.append(
×
73
                    ColumnDefinition(
74
                        col.name,
75
                        child_col_obj.type,
76
                        child_col_obj.array_type,
77
                        child_col_obj.array_dimensions,
78
                    )
79
                )
80

81
            view_catalog_entry = self.catalog.create_and_insert_table_catalog_entry(
×
82
                self.node.view, col_defs
83
            )
84
            storage_engine = StorageEngine.factory(view_catalog_entry)
×
85
            storage_engine.create(table=view_catalog_entry)
×
86

87
            # Populate the view
88
            for batch in child.exec():
×
89
                batch.drop_column_alias()
×
90
                storage_engine.write(view_catalog_entry, batch)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc