Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 0.7.4 #321

Merged
merged 13 commits into from
Nov 7, 2023
33 changes: 0 additions & 33 deletions SECURITY.md

This file was deleted.

2 changes: 1 addition & 1 deletion mindsdb_sql/__about__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
__title__ = 'mindsdb_sql'
__package_name__ = 'mindsdb_sql'
__version__ = '0.7.3'
__version__ = '0.7.4'
__description__ = "Pure python SQL parser"
__email__ = "[email protected]"
__author__ = 'MindsDB Inc'
Expand Down
2 changes: 2 additions & 0 deletions mindsdb_sql/parser/dialects/mindsdb/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .agents import CreateAgent, DropAgent, UpdateAgent
from .create_view import CreateView
from .create_database import CreateDatabase
from .create_predictor import CreatePredictor, CreateAnomalyDetectionModel
Expand All @@ -16,6 +17,7 @@
from .chatbot import CreateChatBot, UpdateChatBot, DropChatBot
from .trigger import CreateTrigger, DropTrigger
from .knowledge_base import CreateKnowledgeBase, DropKnowledgeBase
from .skills import CreateSkill, DropSkill, UpdateSkill

# remove it in next release
CreateDatasource = CreateDatabase
Expand Down
94 changes: 94 additions & 0 deletions mindsdb_sql/parser/dialects/mindsdb/agents.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
from mindsdb_sql.parser.ast.base import ASTNode
from mindsdb_sql.parser.utils import indent


class CreateAgent(ASTNode):
"""
Node for creating a new agent
"""

def __init__(self, name, model, params, if_not_exists=False, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the agent to create
model (str): name of the underlying model to use with the agent
params (dict): USING parameters to create the agent with
if_not_exists (bool): if True, do not raise an error if the agent exists
"""
super().__init__(*args, **kwargs)
self.name = name
self.model = model
self.params = params
self.if_not_exists = if_not_exists

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}CreateAgent(' \
f'if_not_exists={self.if_not_exists}' \
f'name={self.name.to_string()}, ' \
f'model={self.model}, ' \
f'params={self.params})'
return out_str

def get_string(self, *args, **kwargs):
using_ar = [f'model={repr(self.model)}']
using_ar += [f'{k}={repr(v)}' for k, v in self.params.items()]
using_str = ', '.join(using_ar)

out_str = f'CREATE AGENT {"IF NOT EXISTS " if self.if_not_exists else ""}{self.name.to_string()} USING {using_str}'
return out_str


class UpdateAgent(ASTNode):
"""
Node for updating an agent
"""

def __init__(self, name, updated_params, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the agent to update
updated_params (dict): new SET parameters of the agent to update
"""
super().__init__(*args, **kwargs)
self.name = name
self.params = updated_params

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}UpdateAgent(' \
f'name={self.name.to_string()}, ' \
f'updated_params={self.params})'
return out_str

def get_string(self, *args, **kwargs):
set_ar = [f'{k}={repr(v)}' for k, v in self.params.items()]
set_str = ', '.join(set_ar)

out_str = f'UPDATE AGENT {self.name.to_string()} SET {set_str}'
return out_str


class DropAgent(ASTNode):
"""
Node for dropping an agent
"""

def __init__(self, name, if_exists=False, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the agent to drop
if_exists (bool): if True, do not raise an error if the agent does not exist
"""
super().__init__(*args, **kwargs)
self.name = name
self.if_exists = if_exists

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}DropAgent(if_exists={self.if_exists}, name={self.name.to_string()})'
return out_str

def get_string(self, *args, **kwargs):
out_str = f'DROP AGENT {"IF EXISTS " if self.if_exists else ""}{str(self.name.to_string())}'
return out_str
4 changes: 4 additions & 0 deletions mindsdb_sql/parser/dialects/mindsdb/lexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class MindsDBLexer(Lexer):
ENGINE, TRAIN, PREDICT, PARAMETERS, JOB, CHATBOT, EVERY,PROJECT,
ANOMALY, DETECTION,
KNOWLEDGE_BASE, KNOWLEDGE_BASES,
SKILL,
AGENT,

# SHOW/DDL Keywords

Expand Down Expand Up @@ -119,6 +121,8 @@ class MindsDBLexer(Lexer):

KNOWLEDGE_BASE = r'\bKNOWLEDGE[_|\s]BASE\b'
KNOWLEDGE_BASES = r'\bKNOWLEDGE[_|\s]BASES\b'
SKILL = r'\bSKILL\b'
AGENT = r'\bAGENT\b'

# Misc
SET = r'\bSET\b'
Expand Down
49 changes: 49 additions & 0 deletions mindsdb_sql/parser/dialects/mindsdb/parser.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from sly import Parser
from mindsdb_sql.parser.ast import *
from mindsdb_sql.parser.ast.drop import DropDatabase, DropView
from mindsdb_sql.parser.dialects.mindsdb.agents import CreateAgent, DropAgent, UpdateAgent
from mindsdb_sql.parser.dialects.mindsdb.drop_datasource import DropDatasource
from mindsdb_sql.parser.dialects.mindsdb.drop_predictor import DropPredictor
from mindsdb_sql.parser.dialects.mindsdb.drop_dataset import DropDataset
Expand All @@ -17,6 +18,7 @@
from mindsdb_sql.parser.dialects.mindsdb.evaluate import Evaluate
from mindsdb_sql.parser.dialects.mindsdb.create_file import CreateFile
from mindsdb_sql.parser.dialects.mindsdb.knowledge_base import CreateKnowledgeBase, DropKnowledgeBase
from mindsdb_sql.parser.dialects.mindsdb.skills import CreateSkill, DropSkill, UpdateSkill
from mindsdb_sql.exceptions import ParsingException
from mindsdb_sql.parser.dialects.mindsdb.lexer import MindsDBLexer
from mindsdb_sql.parser.dialects.mindsdb.retrain_predictor import RetrainPredictor
Expand Down Expand Up @@ -85,6 +87,12 @@ class MindsDBParser(Parser):
'drop_trigger',
'create_kb',
'drop_kb',
'create_skill',
'drop_skill',
'update_skill',
'create_agent',
'drop_agent',
'update_agent'
)
def query(self, p):
return p[0]
Expand Down Expand Up @@ -130,6 +138,46 @@ def create_kb(self, p):
def drop_kb(self, p):
return DropKnowledgeBase(name=p.identifier, if_exists=p.if_exists_or_empty)

# -- Skills --
@_('CREATE SKILL if_not_exists_or_empty identifier USING kw_parameter_list')
def create_skill(self, p):
params = p.kw_parameter_list

return CreateSkill(
name=p.identifier,
type=params.pop('type'),
params=params,
if_not_exists=p.if_not_exists_or_empty
)

@_('DROP SKILL if_exists_or_empty identifier')
def drop_skill(self, p):
return DropSkill(name=p.identifier, if_exists=p.if_exists_or_empty)

@_('UPDATE SKILL identifier SET kw_parameter_list')
def update_skill(self, p):
return UpdateSkill(name=p.identifier, updated_params=p.kw_parameter_list)

# -- Agent --
@_('CREATE AGENT if_not_exists_or_empty identifier USING kw_parameter_list')
def create_agent(self, p):
params = p.kw_parameter_list

return CreateAgent(
name=p.identifier,
model=params.pop('model'),
params=params,
if_not_exists=p.if_not_exists_or_empty
)

@_('DROP AGENT if_exists_or_empty identifier')
def drop_agent(self, p):
return DropAgent(name=p.identifier, if_exists=p.if_exists_or_empty)

@_('UPDATE AGENT identifier SET kw_parameter_list')
def update_agent(self, p):
return UpdateAgent(name=p.identifier, updated_params=p.kw_parameter_list)

# -- ChatBot --
@_('CREATE CHATBOT identifier USING kw_parameter_list')
def create_chat_bot(self, p):
Expand Down Expand Up @@ -1609,6 +1657,7 @@ def parameter(self, p):
'WARNINGS',
'MODEL',
'MODELS',
'AGENT'
)
def id(self, p):
return p[0]
Expand Down
94 changes: 94 additions & 0 deletions mindsdb_sql/parser/dialects/mindsdb/skills.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
from mindsdb_sql.parser.ast.base import ASTNode
from mindsdb_sql.parser.utils import indent


class CreateSkill(ASTNode):
"""
Node for creating a new skill
"""

def __init__(self, name, type, params, if_not_exists=False, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the skill to create
type (str): type of the skill to create
params (dict): USING parameters to create the skill with
if_not_exists (bool): if True, do not raise an error if the skill exists
"""
super().__init__(*args, **kwargs)
self.name = name
self.type = type
self.params = params
self.if_not_exists = if_not_exists

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}CreateSkill(' \
f'if_not_exists={self.if_not_exists}' \
f'name={self.name.to_string()}, ' \
f'type={self.type}, ' \
f'params={self.params})'
return out_str

def get_string(self, *args, **kwargs):
using_ar = [f'type={repr(self.type)}']
using_ar += [f'{k}={repr(v)}' for k, v in self.params.items()]
using_str = ', '.join(using_ar)

out_str = f'CREATE SKILL {"IF NOT EXISTS " if self.if_not_exists else ""}{self.name.to_string()} USING {using_str}'
return out_str


class UpdateSkill(ASTNode):
"""
Node for updating a skill
"""

def __init__(self, name, updated_params, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the skill to update
updated_params (dict): new SET parameters of the skill to update
"""
super().__init__(*args, **kwargs)
self.name = name
self.params = updated_params

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}UpdateSkill(' \
f'name={self.name.to_string()}, ' \
f'updated_params={self.params})'
return out_str

def get_string(self, *args, **kwargs):
set_ar = [f'{k}={repr(v)}' for k, v in self.params.items()]
set_str = ', '.join(set_ar)

out_str = f'UPDATE SKILL {self.name.to_string()} SET {set_str}'
return out_str


class DropSkill(ASTNode):
"""
Node for dropping a skill
"""

def __init__(self, name, if_exists=False, *args, **kwargs):
"""
Parameters:
name (Identifier): name of the skill to drop
if_exists (bool): if True, do not raise an error if the skill does not exist
"""
super().__init__(*args, **kwargs)
self.name = name
self.if_exists = if_exists

def to_tree(self, level=0, *args, **kwargs):
ind = indent(level)
out_str = f'{ind}DropSkill(if_exists={self.if_exists}, name={self.name.to_string()})'
return out_str

def get_string(self, *args, **kwargs):
out_str = f'DROP SKILL {"IF EXISTS " if self.if_exists else ""}{str(self.name.to_string())}'
return out_str
Loading