Skip to content
Snippets Groups Projects
Commit ba03d9f51737 authored by Sylvain Thénault's avatar Sylvain Thénault
Browse files

rql stcheck now check for backend availability of function

parent 7b111884fdde
No related branches found
No related tags found
No related merge requests found
ChangeLog for RQL
=================
--
* enhanced Select.replace method
* rql st checker now checks function avaibility according to backend (if specified)
2010-06-11 -- 0.26.2
* totally remove 'IS' operator
......
......@@ -38,7 +38,7 @@
- comparison of two queries
"""
def __init__(self, schema, uid_func_mapping=None, special_relations=None,
resolver_class=None):
resolver_class=None, backend=None):
# chech schema
#for e_type in REQUIRED_TYPES:
# if not schema.has_entity(e_type):
......@@ -49,7 +49,7 @@
if uid_func_mapping:
for key in uid_func_mapping:
special_relations[key] = 'uid'
self._checker = RQLSTChecker(schema, special_relations)
self._checker = RQLSTChecker(schema, special_relations, backend)
self._annotator = RQLSTAnnotator(schema, special_relations)
self._analyser_lock = threading.Lock()
if resolver_class is None:
......@@ -76,6 +76,12 @@
self._annotator.schema = schema
self._analyser.set_schema(schema)
def get_backend(self):
return self._checker.backend
def set_backend(self, backend):
self._checker.backend = backend
backend = property(get_backend, set_backend)
def parse(self, rqlstring, annotate=True):
"""Return a syntax tree created from a RQL string."""
rqlst = parse(rqlstring, False)
......
......@@ -18,4 +18,5 @@
"""Base classes for RQL syntax tree nodes.
Note: this module uses __slots__ to limit memory usage.
"""
......@@ -21,5 +22,4 @@
"""
__docformat__ = "restructuredtext en"
class BaseNode(object):
......
......@@ -15,5 +15,5 @@
#
# You should have received a copy of the GNU Lesser General Public License along
# with rql. If not, see <http://www.gnu.org/licenses/>.
"""RQL functions for manipulating syntax trees.
"""RQL functions for manipulating syntax trees."""
......@@ -19,5 +19,4 @@
"""
__docformat__ = "restructuredtext en"
from rql.nodes import Constant, Variable, VariableRef, Relation, make_relation
......
......@@ -80,6 +80,6 @@
errors due to a bad rql input
"""
def __init__(self, schema, special_relations=None):
def __init__(self, schema, special_relations=None, backend=None):
self.schema = schema
self.special_relations = special_relations or {}
......@@ -84,5 +84,6 @@
self.schema = schema
self.special_relations = special_relations or {}
self.backend = backend
def check(self, node):
state = STCheckState()
......@@ -417,6 +418,11 @@
funcdescr.check_nbargs(len(function.children))
except BadRQLQuery, ex:
state.error(str(ex))
if self.backend is not None:
try:
funcdescr.st_check_backend(self.backend, function)
except BadRQLQuery, ex:
state.error(str(ex))
if funcdescr.aggregat:
if isinstance(function.children[0], Function) and \
function.children[0].descr().aggregat:
......
......@@ -15,5 +15,5 @@
#
# You should have received a copy of the GNU Lesser General Public License along
# with rql. If not, see <http://www.gnu.org/licenses/>.
"""Miscellaneous utilities for RQL.
"""Miscellaneous utilities for RQL."""
......@@ -19,4 +19,3 @@
"""
__docformat__ = "restructuredtext en"
......@@ -21,5 +20,7 @@
__docformat__ = "restructuredtext en"
from rql._exceptions import BadRQLQuery
UPPERCASE = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def decompose_b26(index, table=UPPERCASE):
"""Return a letter (base-26) decomposition of index."""
......@@ -78,6 +79,12 @@
', '.join(sorted(child.get_description(mainindex, tr)
for child in iter_funcnode_variables(funcnode))))
@monkeypatch(FunctionDescr)
def st_check_backend(self, backend, funcnode):
if not self.supports(backend):
raise BadRQLQuery("backend %s doesn't support function %s" % (backend, self.name))
def iter_funcnode_variables(funcnode):
for term in funcnode.children:
try:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment