diff --git a/ChangeLog b/ChangeLog index 7b111884fdde8c60d2d5eb69652219a7e81095be_Q2hhbmdlTG9n..ba03d9f517373e344d42d1fe7238ec83f26b00e5_Q2hhbmdlTG9n 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ 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 diff --git a/__init__.py b/__init__.py index 7b111884fdde8c60d2d5eb69652219a7e81095be_X19pbml0X18ucHk=..ba03d9f517373e344d42d1fe7238ec83f26b00e5_X19pbml0X18ucHk= 100644 --- a/__init__.py +++ b/__init__.py @@ -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) diff --git a/base.py b/base.py index 7b111884fdde8c60d2d5eb69652219a7e81095be_YmFzZS5weQ==..ba03d9f517373e344d42d1fe7238ec83f26b00e5_YmFzZS5weQ== 100644 --- a/base.py +++ b/base.py @@ -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): diff --git a/editextensions.py b/editextensions.py index 7b111884fdde8c60d2d5eb69652219a7e81095be_ZWRpdGV4dGVuc2lvbnMucHk=..ba03d9f517373e344d42d1fe7238ec83f26b00e5_ZWRpdGV4dGVuc2lvbnMucHk= 100644 --- a/editextensions.py +++ b/editextensions.py @@ -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 diff --git a/stcheck.py b/stcheck.py index 7b111884fdde8c60d2d5eb69652219a7e81095be_c3RjaGVjay5weQ==..ba03d9f517373e344d42d1fe7238ec83f26b00e5_c3RjaGVjay5weQ== 100644 --- a/stcheck.py +++ b/stcheck.py @@ -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: diff --git a/utils.py b/utils.py index 7b111884fdde8c60d2d5eb69652219a7e81095be_dXRpbHMucHk=..ba03d9f517373e344d42d1fe7238ec83f26b00e5_dXRpbHMucHk= 100644 --- a/utils.py +++ b/utils.py @@ -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: