Skip to content

Commit f5f13e8

Browse files
committed
alter kb
1 parent 6647d23 commit f5f13e8

File tree

4 files changed

+129
-42
lines changed

4 files changed

+129
-42
lines changed

mindsdb_sql_parser/ast/mindsdb/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
from .drop_job import DropJob
1818
from .chatbot import CreateChatBot, UpdateChatBot, DropChatBot
1919
from .trigger import CreateTrigger, DropTrigger
20-
from .knowledge_base import CreateKnowledgeBase, DropKnowledgeBase, CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex \
21-
, EvaluateKnowledgeBase
20+
from .knowledge_base import (
21+
CreateKnowledgeBase, DropKnowledgeBase, CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex, AlterKnowledgeBase,
22+
EvaluateKnowledgeBase
23+
)
24+
2225
from .skills import CreateSkill, DropSkill, UpdateSkill
2326

2427
# remove it in next release

mindsdb_sql_parser/ast/mindsdb/knowledge_base.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,57 @@ def __repr__(self) -> str:
8080
return self.to_tree()
8181

8282

83+
class AlterKnowledgeBase(ASTNode):
84+
"""
85+
Update the knowledge base
86+
"""
87+
def __init__(
88+
self,
89+
name,
90+
params=None,
91+
*args,
92+
**kwargs,
93+
):
94+
"""
95+
Args:
96+
name: Identifier -- name of the knowledge base
97+
params: dict -- additional parameters to pass to the knowledge base. E.g., chunking strategy, etc.
98+
"""
99+
super().__init__(*args, **kwargs)
100+
self.name = name
101+
self.params = params
102+
def to_tree(self, *args, level=0, **kwargs):
103+
ind = indent(level)
104+
out_str = f"""
105+
{ind}AlterKnowledgeBase(
106+
{ind} name={self.name.to_string()},
107+
{ind} params={self.params}
108+
{ind})
109+
"""
110+
return out_str
111+
112+
def get_string(self, *args, **kwargs):
113+
114+
using_ar = []
115+
params = self.params.copy()
116+
if params:
117+
using_ar += [f"{k}={repr(v)}" for k, v in params.items()]
118+
if using_ar:
119+
using_str = "USING " + ", ".join(using_ar)
120+
else:
121+
using_str = ""
122+
123+
out_str = (
124+
f"ALTER KNOWLEDGE_BASE {self.name.to_string()} "
125+
f"{using_str}"
126+
)
127+
128+
return out_str
129+
130+
def __repr__(self) -> str:
131+
return self.to_tree()
132+
133+
83134
class DropKnowledgeBase(ASTNode):
84135
"""
85136
Delete a knowledge base

mindsdb_sql_parser/parser.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from mindsdb_sql_parser.ast.mindsdb.latest import Latest
2222
from mindsdb_sql_parser.ast.mindsdb.evaluate import Evaluate
2323
from mindsdb_sql_parser.ast.mindsdb.knowledge_base import CreateKnowledgeBase, DropKnowledgeBase, \
24-
CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex, EvaluateKnowledgeBase
24+
AlterKnowledgeBase, CreateKnowledgeBaseIndex, DropKnowledgeBaseIndex, EvaluateKnowledgeBase
2525
from mindsdb_sql_parser.ast.mindsdb.skills import CreateSkill, DropSkill, UpdateSkill
2626
from mindsdb_sql_parser.exceptions import ParsingException
2727
from mindsdb_sql_parser.ast.mindsdb.retrain_predictor import RetrainPredictor
@@ -95,6 +95,7 @@ class MindsDBParser(Parser):
9595
'create_trigger',
9696
'drop_trigger',
9797
'create_kb',
98+
'alter_kb',
9899
'drop_kb',
99100
'evaluate_kb',
100101
'create_skill',
@@ -113,9 +114,6 @@ def query(self, p):
113114
@_(
114115
'CREATE KNOWLEDGE_BASE if_not_exists_or_empty identifier USING kw_parameter_list',
115116
'CREATE KNOWLEDGE_BASE if_not_exists_or_empty identifier',
116-
# from select
117-
'CREATE KNOWLEDGE_BASE if_not_exists_or_empty identifier FROM LPAREN select RPAREN USING kw_parameter_list',
118-
'CREATE KNOWLEDGE_BASE if_not_exists_or_empty identifier FROM LPAREN select RPAREN',
119117
)
120118
def create_kb(self, p):
121119
params = getattr(p, 'kw_parameter_list', {})
@@ -145,6 +143,19 @@ def create_kb(self, p):
145143
if_not_exists=if_not_exists
146144
)
147145

146+
@_(
147+
'ALTER KNOWLEDGE_BASE identifier USING kw_parameter_list',
148+
)
149+
def alter_kb(self, p):
150+
params = getattr(p, 'kw_parameter_list', {})
151+
name = p.identifier
152+
params = {k.lower(): v for k, v in params.items()} # case insensitive
153+
154+
return AlterKnowledgeBase(
155+
name=name,
156+
params=params
157+
)
158+
148159
@_('CREATE INDEX ON KNOWLEDGE_BASE identifier')
149160
def create_index(self, p):
150161
return CreateKnowledgeBaseIndex(name=p.identifier)

tests/test_mindsdb/test_knowledgebase.py

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from mindsdb_sql_parser.ast.mindsdb.knowledge_base import (
44
CreateKnowledgeBase,
55
DropKnowledgeBase,
6+
AlterKnowledgeBase,
67
)
78
from mindsdb_sql_parser.ast import (
89
Select,
@@ -18,6 +19,7 @@
1819
)
1920
from mindsdb_sql_parser.utils import to_single_line
2021

22+
2123
class TestKB:
2224

2325
def test_create_knowledge_base(self):
@@ -60,42 +62,6 @@ def test_create_knowledge_base(self):
6062
ast = parse_sql(sql)
6163
assert ast == expected_ast
6264

63-
# create from a query
64-
sql = """
65-
CREATE KNOWLEDGE_BASE my_knowledge_base
66-
FROM (
67-
SELECT id, content, embeddings, metadata
68-
FROM my_table
69-
JOIN my_embedding_model
70-
)
71-
USING
72-
MODEL = mindsdb.my_embedding_model,
73-
STORAGE = my_vector_database.some_table
74-
"""
75-
ast = parse_sql(sql)
76-
expected_ast = CreateKnowledgeBase(
77-
name=Identifier("my_knowledge_base"),
78-
if_not_exists=False,
79-
model=Identifier(parts=["mindsdb", "my_embedding_model"]),
80-
storage=Identifier(parts=["my_vector_database", "some_table"]),
81-
from_select=Select(
82-
targets=[
83-
Identifier("id"),
84-
Identifier("content"),
85-
Identifier("embeddings"),
86-
Identifier("metadata"),
87-
],
88-
from_table=Join(
89-
left=Identifier("my_table"),
90-
right=Identifier("my_embedding_model"),
91-
join_type="JOIN",
92-
),
93-
),
94-
params={},
95-
)
96-
97-
assert ast == expected_ast
98-
9965
# create without MODEL
10066
sql = """
10167
CREATE KNOWLEDGE_BASE my_knowledge_base
@@ -189,6 +155,62 @@ def test_create_knowledge_base(self):
189155
)
190156
assert ast == expected_ast
191157

158+
def disabled_test_create_from_select(self):
159+
# create from a query
160+
sql = """
161+
CREATE KNOWLEDGE_BASE my_knowledge_base
162+
FROM (
163+
SELECT id, content, embeddings, metadata
164+
FROM my_table
165+
JOIN my_embedding_model
166+
)
167+
USING
168+
MODEL = mindsdb.my_embedding_model,
169+
STORAGE = my_vector_database.some_table
170+
"""
171+
ast = parse_sql(sql)
172+
expected_ast = CreateKnowledgeBase(
173+
name=Identifier("my_knowledge_base"),
174+
if_not_exists=False,
175+
model=Identifier(parts=["mindsdb", "my_embedding_model"]),
176+
storage=Identifier(parts=["my_vector_database", "some_table"]),
177+
from_select=Select(
178+
targets=[
179+
Identifier("id"),
180+
Identifier("content"),
181+
Identifier("embeddings"),
182+
Identifier("metadata"),
183+
],
184+
from_table=Join(
185+
left=Identifier("my_table"),
186+
right=Identifier("my_embedding_model"),
187+
join_type="JOIN",
188+
),
189+
),
190+
params={},
191+
)
192+
193+
assert ast == expected_ast
194+
195+
def test_update_knowledge_base(self):
196+
# create without select
197+
sql = """
198+
ALTER KNOWLEDGE_BASE my_kb
199+
USING
200+
reranking_model={'provider': 'openai'},
201+
embedding_model={'api_key': '123'}
202+
"""
203+
ast = parse_sql(sql)
204+
expected_ast = AlterKnowledgeBase(
205+
name=Identifier("my_kb"),
206+
params={
207+
'reranking_model': {'provider': 'openai'},
208+
'embedding_model': {'api_key': '123'},
209+
},
210+
)
211+
assert to_single_line(str(ast)) == to_single_line(str(expected_ast))
212+
assert ast == expected_ast
213+
192214
def test_drop_knowledge_base(self):
193215
# drop if exists
194216
sql = """

0 commit comments

Comments
 (0)