コード例 #1
0
    def test_commit_rollback_iuc(self):
        """ Test commit and rollback of internal uniqueness constraints."""
        obj1 = EntityType(name="O1")
        obj2 = EntityType(name="V1")

        fact1 = FactType(name="F1")
        role1 = fact1.add_role(player=obj1)
        role2 = fact1.add_role(player=obj2)
        fact1.commit()

        fact2 = FactType(name="F2")
        role3 = fact2.add_role(player=obj1)
        fact2.commit()

        cons1 = Constraint.UniquenessConstraint(covers=[role1],
                                                identifier_for=None)
        cons2 = Constraint.UniquenessConstraint(covers=[role2],
                                                identifier_for=obj1)

        self.assertEquals(role1.covered_by, [])
        self.assertEquals(role2.covered_by, [])

        self.assertEquals(obj1.identifying_constraint, None)
        self.assertEquals(obj1.ref_roles, [])
        self.assertItemsEqual(obj1.roles, [role1, role3])

        cons1.commit()
        cons2.commit()

        self.assertEquals(role1.covered_by, [cons1])
        self.assertEquals(role2.covered_by, [cons2])
        self.assertEquals(obj1.identifying_constraint, cons2)
        self.assertEquals(obj1.ref_roles, [role1])

        cons1.rollback()
        cons2.rollback()

        self.assertEquals(role1.covered_by, [])
        self.assertEquals(role2.covered_by, [])
        self.assertEquals(obj1.identifying_constraint, None)
        self.assertEquals(obj1.ref_roles, [])
コード例 #2
0
    def test_commit_and_rollback_affect_on_role_unique(self):
        """ Test affect of commit and rollback on role.unique """
        fact = FactType("AHasB")
        fact.add_role(ObjectType("A"))
        fact.add_role(ObjectType("B"))
        fact.commit()

        role = fact.roles[0]
        self.assertFalse(role.unique)

        # Unique after covered by a simple IUC
        uniq1 = Constraint.UniquenessConstraint(covers=[role])
        uniq1.commit()
        self.assertTrue(role.unique)

        # No longer unique after rollback
        uniq1.rollback()
        self.assertFalse(role.unique)

        # Not unique after covered by spanning IUC
        uniq2 = Constraint.UniquenessConstraint(covers=[role, fact.roles[1]])
        uniq2.commit()
        self.assertFalse(role.unique)

        # Unique again, covered by simple IUC
        uniq1.commit()
        self.assertTrue(role.unique)

        # Cover by a second simple IUC
        uniq3 = Constraint.UniquenessConstraint(covers=[role])
        uniq3.commit()

        # Still unique after rollback, because it's still covered by a simple IUC
        uniq1.rollback()
        self.assertTrue(role.unique)

        # No longer unique: not covered by any simple IUCs.
        uniq3.rollback()
        self.assertFalse(role.unique)
コード例 #3
0
    def _load_uniqueness_constraint(self, xml_node):
        """ Load uniqueness constraint. """
        attribs, name = get_basic_attribs(xml_node)
        name = "Uniqueness constraint " + name

        # Get object type that this constraint is a preferred id for
        pref_node = find(xml_node, "PreferredIdentifierFor")
        if pref_node is not None:
            uid = pref_node.get("ref")
            attribs['identifier_for'] = self._elements.get(uid)

        # Get sequence of covered roles
        covers = self._load_role_sequence(xml_node, name)

        if covers and isinstance(covers[0], Constraint.SubtypeConstraint):
            return None  # Covers a role in an implicit subtype fact
        else:
            return Constraint.UniquenessConstraint(covers=covers, **attribs)
コード例 #4
0
    def test_commit_and_rollback(self):
        """ Test committing and rolling back constraints on a model. """
        model = Model()

        obj1 = ObjectType(name="O1")
        obj2 = ObjectType(name="O2")

        fact = FactType(name="F1")
        role1 = fact.add_role(player=obj1, name="R1")
        role2 = fact.add_role(player=obj2, name="R2")

        cons1 = Constraint.MandatoryConstraint(name="M1", covers=[role1])
        cons2 = Constraint.UniquenessConstraint(name="U1",
                                                covers=[role1, role2])
        cons3 = Constraint.ValueConstraint(name="V1", covers=[obj1])

        for element in [obj1, obj2, fact, cons1, cons2, cons3]:
            model.add(element)

        self.assertEquals(model.constraints.get("M1").covers, [role1])
        self.assertEquals(model.constraints.get("U1").covers, [role1, role2])
        self.assertEquals(model.constraints.get("V1").covers, [obj1])

        self.assertEquals(role1.covered_by, [cons1, cons2])
        self.assertEquals(role2.covered_by, [cons2])
        self.assertEquals(obj1.covered_by, [cons3])

        model.remove(cons2)
        model.remove(cons3)

        self.assertEquals(model.constraints.get("M1"), cons1)
        self.assertEquals(model.constraints.get("U1"), None)
        self.assertEquals(model.constraints.get("V1"), None)

        self.assertEquals(role1.covered_by, [cons1])
        self.assertEquals(role2.covered_by, [])
        self.assertEquals(obj1.covered_by, [])

        # Test that additional rollback has no effect
        model.remove(cons3)
        self.assertEquals(model.constraints.get("M1"), cons1)
        self.assertEquals(model.constraints.get("V1"), None)
        self.assertEquals(obj1.covered_by, [])
コード例 #5
0
    def test_commit_rollback_euc(self):
        """ Test commit and rollback of external uniqueness constraint."""
        obj1 = EntityType(name="O1")
        obj2 = EntityType(name="V1")
        obj3 = EntityType(name="V2")

        fact1 = FactType(name="F1")
        role11 = fact1.add_role(player=obj1)
        role12 = fact1.add_role(player=obj2)
        fact1.commit()

        fact2 = FactType(name="F2")
        role21 = fact2.add_role(player=obj1)
        role23 = fact2.add_role(player=obj3)
        fact2.commit()

        fact3 = FactType(name="F3")
        role31 = fact3.add_role(player=obj1)
        fact3.commit()

        cons = Constraint.UniquenessConstraint(covers=[role12, role23],
                                               identifier_for=obj1)

        self.assertEquals(obj1.identifying_constraint, None)
        self.assertEquals(obj1.ref_roles, [])
        self.assertItemsEqual(obj1.roles, [role11, role21, role31])

        cons.commit()

        self.assertEquals(obj1.identifying_constraint, cons)
        self.assertItemsEqual(obj1.ref_roles, [role11, role21])

        cons.rollback()

        self.assertEquals(obj1.identifying_constraint, None)
        self.assertEquals(obj1.ref_roles, [])