903 """Insert some rql snippets into another rql syntax tree, replacing computed |
903 """Insert some rql snippets into another rql syntax tree, replacing computed |
904 relations by their associated rule. |
904 relations by their associated rule. |
905 |
905 |
906 This class *isn't thread safe*. |
906 This class *isn't thread safe*. |
907 """ |
907 """ |
908 def __init__(self, session): |
|
909 super(RQLRelationRewriter, self).__init__(session) |
|
910 self.rules = {} |
|
911 for rschema in self.schema.iter_computed_relations(): |
|
912 self.rules[rschema.type] = RRQLExpression(rschema.rule) |
|
913 |
908 |
914 def rewrite(self, union, kwargs=None): |
909 def rewrite(self, union, kwargs=None): |
915 self.kwargs = kwargs |
910 self.kwargs = kwargs |
916 self.removing_ambiguity = False |
911 self.removing_ambiguity = False |
917 self.existingvars = None |
912 self.existingvars = None |
918 self.pending_keys = None |
913 self.pending_keys = None |
|
914 rules = self.schema.rules_rqlexpr_mapping |
919 for relation in union.iget_nodes(n.Relation): |
915 for relation in union.iget_nodes(n.Relation): |
920 if relation.r_type in self.rules: |
916 if relation.r_type in rules: |
921 self.select = relation.stmt |
917 self.select = relation.stmt |
922 self.solutions = solutions = self.select.solutions[:] |
918 self.solutions = solutions = self.select.solutions[:] |
923 self.current_expr = self.rules[relation.r_type] |
919 self.current_expr = rules[relation.r_type] |
924 self._insert_scope = relation.scope |
920 self._insert_scope = relation.scope |
925 self.rewritten = {} |
921 self.rewritten = {} |
926 lhs, rhs = relation.get_variable_parts() |
922 lhs, rhs = relation.get_variable_parts() |
927 varmap = {lhs.name: 'S', rhs.name: 'O'} |
923 varmap = {lhs.name: 'S', rhs.name: 'O'} |
928 self.init_from_varmap(tuple(sorted(varmap.items()))) |
924 self.init_from_varmap(tuple(sorted(varmap.items()))) |