Skip to content

Commit

Permalink
Merge pull request #321 from mindsdb/staging
Browse files Browse the repository at this point in the history
Release 0.7.4
  • Loading branch information
ea-rus authored Nov 7, 2023
2 parents 7344cd2 + 101ad93 commit 9d0705a
Show file tree
Hide file tree
Showing 9 changed files with 370 additions and 34 deletions.
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

0 comments on commit 9d0705a

Please sign in to comment.