Skip to content

Commit 6dd3f0b

Browse files
authored
Merge pull request #29 from mindsdb/feature/alter_view
Added the Syntax for ALTER VIEW
2 parents 1c32c2c + 320fd72 commit 6dd3f0b

File tree

4 files changed

+86
-1
lines changed

4 files changed

+86
-1
lines changed

mindsdb_sql_parser/ast/mindsdb/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .agents import CreateAgent, DropAgent, UpdateAgent
22
from .alter_database import AlterDatabase
33
from .create_view import CreateView
4+
from .alter_view import AlterView
45
from .create_database import CreateDatabase
56
from .create_predictor import CreatePredictor, CreateAnomalyDetectionModel
67
from .drop_predictor import DropPredictor
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from mindsdb_sql_parser.ast.base import ASTNode
2+
from mindsdb_sql_parser.utils import indent
3+
from mindsdb_sql_parser.ast.select.identifier import Identifier
4+
5+
6+
class AlterView(ASTNode):
7+
"""
8+
Alter a view.
9+
"""
10+
def __init__(
11+
self,
12+
name: Identifier,
13+
query_str: str,
14+
from_table: Identifier = None,
15+
*args,
16+
**kwargs
17+
):
18+
"""
19+
Args:
20+
name: Identifier -- name of the view to alter.
21+
query_str: str -- the new query string for the view.
22+
from_table: Identifier -- optional table to alter the view from.
23+
"""
24+
super().__init__(*args, **kwargs)
25+
self.name = name
26+
self.query_str = query_str
27+
self.from_table = from_table
28+
29+
def to_tree(self, *args, level=0, **kwargs):
30+
ind = indent(level)
31+
ind1 = indent(level+1)
32+
33+
name_str = f'\n{ind1}name={self.name.to_string()},'
34+
from_table_str = f'\n{ind1}from_table=\n{self.from_table.to_tree(level=level+2)},' if self.from_table else ''
35+
query_str = f'\n{ind1}query="{self.query_str}"'
36+
37+
out_str = f'{ind}AlterView(' \
38+
f'{name_str}' \
39+
f'{query_str}' \
40+
f'{from_table_str}' \
41+
f'\n{ind})'
42+
return out_str
43+
44+
def get_string(self, *args, **kwargs):
45+
from_str = f' FROM {str(self.from_table)}' if self.from_table else ''
46+
47+
out_str = f'ALTER VIEW {self.name.to_string()}{from_str} AS ( {self.query_str} )'
48+
49+
return out_str

mindsdb_sql_parser/parser.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from mindsdb_sql_parser.ast.mindsdb.create_database import CreateDatabase
1212
from mindsdb_sql_parser.ast.mindsdb.create_ml_engine import CreateMLEngine
1313
from mindsdb_sql_parser.ast.mindsdb.create_view import CreateView
14+
from mindsdb_sql_parser.ast.mindsdb.alter_view import AlterView
1415
from mindsdb_sql_parser.ast.mindsdb.create_job import CreateJob
1516
from mindsdb_sql_parser.ast.mindsdb.chatbot import CreateChatBot, UpdateChatBot, DropChatBot
1617
from mindsdb_sql_parser.ast.mindsdb.drop_job import DropJob
@@ -80,6 +81,7 @@ class MindsDBParser(Parser):
8081
'drop_database',
8182
'alter_database',
8283
'drop_view',
84+
'alter_view',
8385
'drop_table',
8486
'create_table',
8587
'create_job',
@@ -709,6 +711,18 @@ def create_view(self, p):
709711
query_str=query_str,
710712
if_not_exists=p.if_not_exists_or_empty)
711713

714+
# ALTER VIEW
715+
@_('ALTER VIEW identifier create_view_from_table_or_nothing AS LPAREN raw_query RPAREN',
716+
'ALTER VIEW identifier create_view_from_table_or_nothing LPAREN raw_query RPAREN')
717+
def alter_view(self, p):
718+
query_str = tokens_to_string(p.raw_query)
719+
720+
return AlterView(
721+
name=p.identifier,
722+
from_table=p.create_view_from_table_or_nothing,
723+
query_str=query_str
724+
)
725+
712726
@_('FROM identifier')
713727
def create_view_from_table_or_nothing(self, p):
714728
return p.identifier

tests/test_mindsdb/test_create_view.py renamed to tests/test_mindsdb/test_views.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from mindsdb_sql_parser.ast import *
44
from mindsdb_sql_parser.lexer import MindsDBLexer
55

6-
class TestCreateView:
6+
class TestViews:
77
def test_create_view_lexer(self):
88
sql = "CREATE VIEW my_view FROM integration AS ( SELECT * FROM pred )"
99
tokens = list(MindsDBLexer().tokenize(sql))
@@ -34,6 +34,27 @@ def test_create_view_nofrom(self):
3434
assert str(ast) == str(expected_ast)
3535
assert ast.to_tree() == expected_ast.to_tree()
3636

37+
def test_alter_view_full(self):
38+
sql = "ALTER VIEW my_view FROM integr AS ( SELECT * FROM pred )"
39+
ast = parse_sql(sql)
40+
expected_ast = AlterView(
41+
name=Identifier('my_view'),
42+
from_table=Identifier('integr'),
43+
query_str="SELECT * FROM pred"
44+
)
45+
assert str(ast) == str(expected_ast)
46+
assert ast.to_tree() == expected_ast.to_tree()
47+
48+
def test_alter_view_nofrom(self):
49+
sql = "ALTER VIEW my_view AS ( SELECT * FROM pred )"
50+
ast = parse_sql(sql)
51+
expected_ast = AlterView(
52+
name=Identifier('my_view'),
53+
query_str="SELECT * FROM pred"
54+
)
55+
assert str(ast) == str(expected_ast)
56+
assert ast.to_tree() == expected_ast.to_tree()
57+
3758
# def test_create_dataset_full(self):
3859
# sql = "CREATE DATASET my_view FROM integr AS ( SELECT * FROM pred )"
3960
# ast = parse_sql(sql)

0 commit comments

Comments
 (0)