133 def __init__(self, session): |
133 def __init__(self, session): |
134 self.repo = session.repo |
134 self.repo = session.repo |
135 SingleLastOperation.__init__(self, session) |
135 SingleLastOperation.__init__(self, session) |
136 |
136 |
137 def commit_event(self): |
137 def commit_event(self): |
138 self.repo.set_schema(self.repo.schema) |
138 rebuildinfered = self.session.data.get('rebuild-infered', True) |
|
139 self.repo.set_schema(self.repo.schema, rebuildinfered=rebuildinfered) |
139 |
140 |
140 |
141 |
141 class MemSchemaOperation(Operation): |
142 class MemSchemaOperation(Operation): |
142 """base class for schema operations""" |
143 """base class for schema operations""" |
143 def __init__(self, session, kobj=None, **kwargs): |
144 def __init__(self, session, kobj=None, **kwargs): |
716 self.perm, erschema.type, self.expr) |
717 self.perm, erschema.type, self.expr) |
717 return |
718 return |
718 erschema.set_rqlexprs(self.perm, rqlexprs) |
719 erschema.set_rqlexprs(self.perm, rqlexprs) |
719 |
720 |
720 |
721 |
|
722 class MemSchemaSpecializesAdd(MemSchemaOperation): |
|
723 |
|
724 def commit_event(self): |
|
725 eschema = self.session.schema.schema_by_eid(self.etypeeid) |
|
726 parenteschema = self.session.schema.schema_by_eid(self.parentetypeeid) |
|
727 eschema._specialized_type = parenteschema.type |
|
728 parenteschema._specialized_by.append(eschema.type) |
|
729 |
|
730 |
|
731 class MemSchemaSpecializesDel(MemSchemaOperation): |
|
732 |
|
733 def commit_event(self): |
|
734 try: |
|
735 eschema = self.session.schema.schema_by_eid(self.etypeeid) |
|
736 parenteschema = self.session.schema.schema_by_eid(self.parentetypeeid) |
|
737 except KeyError: |
|
738 # etype removed, nothing to do |
|
739 return |
|
740 eschema._specialized_type = None |
|
741 parenteschema._specialized_by.remove(eschema.type) |
|
742 |
|
743 |
721 # deletion hooks ############################################################### |
744 # deletion hooks ############################################################### |
722 |
745 |
723 def before_del_eetype(session, eid): |
746 def before_del_eetype(session, eid): |
724 """before deleting a CWEType entity: |
747 """before deleting a CWEType entity: |
725 * check that we don't remove a core entity type |
748 * check that we don't remove a core entity type |
1013 expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR', |
1036 expr = session.execute('Any EXPR WHERE X eid %(x)s, X expression EXPR', |
1014 {'x': object}, 'x')[0][0] |
1037 {'x': object}, 'x')[0][0] |
1015 MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr) |
1038 MemSchemaPermissionRQLExpressionDel(session, perm, subject, expr) |
1016 |
1039 |
1017 |
1040 |
1018 def rebuild_infered_relations(session, subject, rtype, object): |
1041 def after_add_specializes(session, subject, rtype, object): |
1019 # registering a schema operation will trigger a call to |
1042 MemSchemaSpecializesAdd(session, etypeeid=subject, parentetypeeid=object) |
1020 # repo.set_schema() on commit which will in turn rebuild |
1043 |
1021 # infered relation definitions |
1044 def after_del_specializes(session, subject, rtype, object): |
1022 MemSchemaNotifyChanges(session) |
1045 MemSchemaSpecializesDel(session, etypeeid=subject, parentetypeeid=object) |
1023 |
1046 |
1024 |
1047 |
1025 def _register_schema_hooks(hm): |
1048 def _register_schema_hooks(hm): |
1026 """register schema related hooks on the hooks manager""" |
1049 """register schema related hooks on the hooks manager""" |
1027 # schema synchronisation ##################### |
1050 # schema synchronisation ##################### |
1041 # before/after delete |
1064 # before/after delete |
1042 hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType') |
1065 hm.register_hook(before_del_eetype, 'before_delete_entity', 'CWEType') |
1043 hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType') |
1066 hm.register_hook(after_del_eetype, 'after_delete_entity', 'CWEType') |
1044 hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType') |
1067 hm.register_hook(before_del_ertype, 'before_delete_entity', 'CWRType') |
1045 hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type') |
1068 hm.register_hook(after_del_relation_type, 'after_delete_relation', 'relation_type') |
1046 hm.register_hook(rebuild_infered_relations, 'after_add_relation', 'specializes') |
1069 hm.register_hook(after_add_specializes, 'after_add_relation', 'specializes') |
1047 hm.register_hook(rebuild_infered_relations, 'after_delete_relation', 'specializes') |
1070 hm.register_hook(after_del_specializes, 'after_delete_relation', 'specializes') |
1048 # constraints synchronization hooks |
1071 # constraints synchronization hooks |
1049 hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint') |
1072 hm.register_hook(after_add_econstraint, 'after_add_entity', 'CWConstraint') |
1050 hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint') |
1073 hm.register_hook(after_update_econstraint, 'after_update_entity', 'CWConstraint') |
1051 hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by') |
1074 hm.register_hook(before_delete_constrained_by, 'before_delete_relation', 'constrained_by') |
1052 hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by') |
1075 hm.register_hook(after_add_constrained_by, 'after_add_relation', 'constrained_by') |