예제 #1
0
    def testManyToManyTwoEntityTwoRelationshipsAGGNodes(self):
        schema = Schema()
        schema.addEntity('A')
        schema.addEntity('B')
        schema.addRelationship('AB1', ('A', Schema.MANY), ('B', Schema.MANY))
        schema.addRelationship('AB2', ('A', Schema.MANY), ('B', Schema.MANY))
        schema.addAttribute('A', 'X')
        schema.addAttribute('B', 'Y')
        schema.addAttribute('AB1', 'XY1')
        schema.addAttribute('AB2', 'XY2')
        model = Model(schema, [])
        aAGG = AbstractGroundGraph(model, 'A', 4)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[A].X', '[A, AB1].XY1', '[A, AB2].XY2', '[A, AB1, B].Y',
                '[A, AB2, B].Y', '[A, AB1, B, AB1].XY1',
                '[A, AB1, B, AB2].XY2', '[A, AB2, B, AB1].XY1',
                '[A, AB2, B, AB2].XY2', '[A, AB1, B, AB1, A].X',
                '[A, AB1, B, AB2, A].X', '[A, AB2, B, AB1, A].X',
                '[A, AB2, B, AB2, A].X'
            ]
        ]
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[A, AB1].XY1', '[A, AB2, B, AB1].XY1'),
            ('[A, AB2].XY2', '[A, AB1, B, AB2].XY2'),
            ('[A, AB1, B].Y', '[A, AB2, B].Y'),
            ('[A, AB1, B, AB1].XY1', '[A, AB2, B, AB1].XY1'),
            ('[A, AB2, B, AB2].XY2', '[A, AB1, B, AB2].XY2'),
            ('[A, AB1, B, AB1, A].X', '[A, AB1, B, AB2, A].X'),
            ('[A, AB1, B, AB1, A].X', '[A, AB2, B, AB1, A].X'),
            ('[A, AB1, B, AB1, A].X', '[A, AB2, B, AB2, A].X'),
            ('[A, AB2, B, AB2, A].X', '[A, AB1, B, AB2, A].X'),
            ('[A, AB2, B, AB2, A].X', '[A, AB2, B, AB1, A].X'),
            ('[A, AB1, B, AB2, A].X', '[A, AB2, B, AB1, A].X')
        ])
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          aAGG.getRelationalVariableNodes())
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            aAGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], aAGG)

        ab1AGG = AbstractGroundGraph(model, 'AB1', 4)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[AB1].XY1', '[AB1, A].X', '[AB1, B].Y', '[AB1, A, AB1].XY1',
                '[AB1, A, AB2].XY2', '[AB1, B, AB1].XY1', '[AB1, B, AB2].XY2',
                '[AB1, A, AB1, B].Y', '[AB1, A, AB2, B].Y',
                '[AB1, B, AB1, A].X', '[AB1, B, AB2, A].X',
                '[AB1, A, AB1, B, AB1].XY1', '[AB1, A, AB2, B, AB1].XY1',
                '[AB1, B, AB1, A, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1',
                '[AB1, A, AB1, B, AB2].XY2', '[AB1, A, AB2, B, AB2].XY2',
                '[AB1, B, AB1, A, AB2].XY2', '[AB1, B, AB2, A, AB2].XY2'
            ]
        ]
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          ab1AGG.getRelationalVariableNodes())
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[AB1, A].X', '[AB1, B, AB1, A].X'),
            ('[AB1, A].X', '[AB1, B, AB2, A].X'),
            ('[AB1, B].Y', '[AB1, A, AB1, B].Y'),
            ('[AB1, B].Y', '[AB1, A, AB2, B].Y'),
            ('[AB1, A, AB1].XY1', '[AB1, B, AB1].XY1'),
            ('[AB1, A, AB1].XY1', '[AB1, A, AB2, B, AB1].XY1'),
            ('[AB1, A, AB1].XY1', '[AB1, B, AB1, A, AB1].XY1'),
            ('[AB1, A, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1'),
            ('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2'),
            ('[AB1, A, AB2].XY2', '[AB1, B, AB2, A, AB2].XY2'),
            ('[AB1, A, AB2].XY2', '[AB1, B, AB1, A, AB2].XY2'),
            ('[AB1, A, AB2].XY2', '[AB1, A, AB1, B, AB2].XY2'),
            ('[AB1, B, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1'),
            ('[AB1, B, AB1].XY1', '[AB1, A, AB1, B, AB1].XY1'),
            ('[AB1, B, AB1].XY1', '[AB1, A, AB2, B, AB1].XY1'),
            ('[AB1, B, AB2].XY2', '[AB1, A, AB2, B, AB2].XY2'),
            ('[AB1, B, AB2].XY2', '[AB1, A, AB1, B, AB2].XY2'),
            ('[AB1, B, AB2].XY2', '[AB1, B, AB1, A, AB2].XY2'),
            ('[AB1, A, AB1, B].Y', '[AB1, A, AB2, B].Y'),
            ('[AB1, B, AB1, A].X', '[AB1, B, AB2, A].X'),
            ('[AB1, A, AB1, B, AB1].XY1', '[AB1, A, AB2, B, AB1].XY1'),
            ('[AB1, A, AB1, B, AB1].XY1', '[AB1, B, AB1, A, AB1].XY1'),
            ('[AB1, A, AB1, B, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1'),
            ('[AB1, A, AB2, B, AB1].XY1', '[AB1, B, AB1, A, AB1].XY1'),
            ('[AB1, A, AB2, B, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1'),
            ('[AB1, B, AB1, A, AB1].XY1', '[AB1, B, AB2, A, AB1].XY1'),
            ('[AB1, A, AB1, B, AB2].XY2', '[AB1, A, AB2, B, AB2].XY2'),
            ('[AB1, A, AB1, B, AB2].XY2', '[AB1, B, AB1, A, AB2].XY2'),
            ('[AB1, A, AB1, B, AB2].XY2', '[AB1, B, AB2, A, AB2].XY2'),
            ('[AB1, A, AB2, B, AB2].XY2', '[AB1, B, AB1, A, AB2].XY2'),
            ('[AB1, A, AB2, B, AB2].XY2', '[AB1, B, AB2, A, AB2].XY2'),
            ('[AB1, B, AB1, A, AB2].XY2', '[AB1, B, AB2, A, AB2].XY2')
        ])
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            ab1AGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], aAGG)

        # test multiple relationships with two dependencies
        model = Model(schema, [
            '[AB2, B, AB1, A].X -> [AB2].XY2', '[AB1, B, AB2].XY2 -> [AB1].XY1'
        ])
        ab1AGG = AbstractGroundGraph(model, 'AB1', 3)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[AB1].XY1', '[AB1, A].X', '[AB1, B].Y', '[AB1, A, AB1].XY1',
                '[AB1, A, AB2].XY2', '[AB1, B, AB1].XY1', '[AB1, B, AB2].XY2',
                '[AB1, A, AB1, B].Y', '[AB1, A, AB2, B].Y',
                '[AB1, B, AB1, A].X', '[AB1, B, AB2, A].X'
            ]
        ]
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          ab1AGG.getRelationalVariableNodes())
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[AB1, A].X', '[AB1, B, AB1, A].X'),
            ('[AB1, A].X', '[AB1, B, AB2, A].X'),
            ('[AB1, B].Y', '[AB1, A, AB1, B].Y'),
            ('[AB1, B].Y', '[AB1, A, AB2, B].Y'),
            ('[AB1, A, AB1].XY1', '[AB1, B, AB1].XY1'),
            ('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2'),
            ('[AB1, A, AB1, B].Y', '[AB1, A, AB2, B].Y'),
            ('[AB1, B, AB1, A].X', '[AB1, B, AB2, A].X')
        ])
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            ab1AGG.getRelationalVariableIntersectionNodes())
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[AB1, B, AB2].XY2', '[AB1].XY1'),
            ('[AB1, B, AB2].XY2', '[AB1, B, AB1].XY1'),
            ('[AB1, A].X', '[AB1, B, AB2].XY2'),
            ('[AB1, B, AB1, A].X', '[AB1, B, AB2].XY2'),
            (('[AB1, A].X', '[AB1, B, AB1, A].X'), '[AB1, B, AB2].XY2'),
            (('[AB1, A].X', '[AB1, B, AB2, A].X'), '[AB1, B, AB2].XY2'),
            ('[AB1, B, AB2].XY2', ('[AB1, A, AB1].XY1', '[AB1, B, AB1].XY1')),
            ('[AB1, A].X', ('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2')),
            ('[AB1, B, AB1, A].X', ('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2')),
            (('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2'), '[AB1].XY1'),
            (('[AB1, A, AB2].XY2', '[AB1, B, AB2].XY2'), '[AB1, B, AB1].XY1'),
            (('[AB1, B, AB1, A].X', '[AB1, B, AB2, A].X'), '[AB1, B, AB2].XY2')
        ])
        self.assertAGGEdgesEqual(expectedEdges, ab1AGG)
예제 #2
0
    def testThreeEntityTwoRelationshipsAGG(self):
        schema = Schema()
        schema.addEntity('A')
        schema.addEntity('B')
        schema.addEntity('C')
        schema.addRelationship('AB', ('A', Schema.MANY), ('B', Schema.MANY))
        schema.addRelationship('BC', ('B', Schema.ONE), ('C', Schema.MANY))
        schema.addAttribute('A', 'X')
        schema.addAttribute('B', 'Y')
        schema.addAttribute('C', 'Z')
        schema.addAttribute('AB', 'XY')
        schema.addAttribute('BC', 'YZ')
        model = Model(schema, [])
        aAGG = AbstractGroundGraph(model, 'A', 6)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[A].X', '[A, AB].XY', '[A, AB, B].Y', '[A, AB, B, AB].XY',
                '[A, AB, B, BC].YZ', '[A, AB, B, AB, A].X',
                '[A, AB, B, BC, C].Z', '[A, AB, B, AB, A, AB].XY',
                '[A, AB, B, BC, C, BC].YZ', '[A, AB, B, AB, A, AB, B].Y',
                '[A, AB, B, BC, C, BC, B].Y'
            ]
        ]
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          aAGG.getRelationalVariableNodes())
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[A, AB, B, AB, A, AB, B].Y', '[A, AB, B, BC, C, BC, B].Y')
        ])
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            aAGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], aAGG)

        bcAGG = AbstractGroundGraph(model, 'BC', 4)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[BC].YZ', '[BC, B].Y', '[BC, C].Z', '[BC, B, AB].XY',
                '[BC, C, BC].YZ', '[BC, B, AB, A].X', '[BC, C, BC, B].Y',
                '[BC, B, AB, A, AB].XY', '[BC, C, BC, B, AB].XY'
            ]
        ]
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          bcAGG.getRelationalVariableNodes())
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[BC, B].Y', '[BC, C, BC, B].Y'),
            ('[BC, B, AB].XY', '[BC, C, BC, B, AB].XY'),
            ('[BC, B, AB, A, AB].XY', '[BC, C, BC, B, AB].XY')
        ])
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            bcAGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], bcAGG)

        model = Model(schema, [
            '[BC, B, AB, A].X -> [BC].YZ', '[AB, B, BC, C].Z -> [AB].XY',
            '[AB, B, AB, A, AB, B].Y -> [AB].XY'
        ])
        aAGG = AbstractGroundGraph(model, 'A', 6)
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[A].X', '[A, AB, B, BC].YZ'),
            ('[A, AB, B, AB, A].X', '[A, AB, B, BC].YZ'),
            ('[A, AB, B, BC, C].Z', '[A, AB].XY'),
            ('[A, AB, B, BC, C].Z', '[A, AB, B, AB].XY'),
            ('[A, AB, B, AB, A, AB, B].Y', '[A, AB].XY'),
            ('[A, AB, B].Y', '[A, AB, B, AB].XY'),
            ('[A, AB, B, AB, A, AB, B].Y', '[A, AB, B, AB].XY'),
            (('[A, AB, B, AB, A, AB, B].Y', '[A, AB, B, BC, C, BC, B].Y'),
             '[A, AB].XY'),
            (('[A, AB, B, AB, A, AB, B].Y', '[A, AB, B, BC, C, BC, B].Y'),
             '[A, AB, B, AB].XY')
        ])
        self.assertAGGEdgesEqual(expectedEdges, aAGG)
예제 #3
0
    def testOneToManyTwoEntityAGG(self):
        schema = Schema()
        schema.addEntity('A')
        schema.addEntity('B')
        schema.addRelationship('AB', ('A', Schema.MANY), ('B', Schema.ONE))
        model = Model(schema, [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'A', 0),
                                          [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'B', 0),
                                          [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'AB', 0),
                                          [])

        schema.addAttribute('A', 'X')
        model = Model(schema, [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'A', 2),
                                          [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'B', 2),
                                          [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'AB', 2),
                                          [])

        schema.addAttribute('B', 'Y')
        model = Model(schema, [])
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'A', 2),
                                          [])  # putting in max hop threshold
        self.assertAGGEqualNoIntersection(schema,
                                          AbstractGroundGraph(model, 'B', 4),
                                          [])
        abAGG = AbstractGroundGraph(model, 'AB', 3)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr)
            for relVarStr in ['[AB, A].X', '[AB, B].Y', '[AB, A, AB, B].Y']
        ]
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[AB, B].Y', '[AB, A, AB, B].Y')
        ])
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          abAGG.getRelationalVariableNodes())
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            abAGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], abAGG)
        # test that order of relVar1, relVar2 for RelationalVariableIntersection doesn't matter
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[AB, A, AB, B].Y', '[AB, B].Y')
        ])
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            abAGG.getRelationalVariableIntersectionNodes())

        model = Model(schema, ['[A, AB, B].Y -> [A].X'])
        aAGG = AbstractGroundGraph(model, 'A', 2)
        expectedEdges = self.relVarStrPairsToRelVarPairs([('[A, AB, B].Y',
                                                           '[A].X')])
        self.assertAGGEdgesEqual(expectedEdges, aAGG)

        # test that extended dependencies are only added among nodes that exist in the AGG (have an appropriate number of hops)
        bAGG = AbstractGroundGraph(model, 'B', 2)
        expectedEdges = self.relVarStrPairsToRelVarPairs([('[B].Y',
                                                           '[B, AB, A].X')])
        self.assertAGGEdgesEqual(expectedEdges, bAGG)

        bAGG = AbstractGroundGraph(model, 'B', 4)
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[B].Y', '[B, AB, A].X'), ('[B, AB, A, AB, B].Y', '[B, AB, A].X')
        ])
        self.assertAGGEdgesEqual(expectedEdges, bAGG)

        # test dependencies get inherited for intersection nodes
        abAGG = AbstractGroundGraph(model, 'AB', 3)
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[AB, B].Y', '[AB, A].X'), ('[AB, A, AB, B].Y', '[AB, A].X'),
            (('[AB, A, AB, B].Y', '[AB, B].Y'), '[AB, A].X')
        ])
        self.assertAGGEdgesEqual(expectedEdges, abAGG)

        schema.addAttribute('B', 'Z')
        model = Model(schema, [])
        abAGG = AbstractGroundGraph(model, 'AB', 3)
        expectedRelVarNodes = [
            ParserUtil.parseRelVar(relVarStr) for relVarStr in [
                '[AB, A].X', '[AB, B].Y', '[AB, A, AB, B].Y', '[AB, B].Z',
                '[AB, A, AB, B].Z'
            ]
        ]
        expectedRelVarIntNodes = self.relVarStrPairsToRelVarInts([
            ('[AB, B].Y', '[AB, A, AB, B].Y'),
            ('[AB, B].Z', '[AB, A, AB, B].Z')
        ])
        TestUtil.assertUnorderedListEqual(self, expectedRelVarNodes,
                                          abAGG.getRelationalVariableNodes())
        TestUtil.assertUnorderedListEqual(
            self, expectedRelVarIntNodes,
            abAGG.getRelationalVariableIntersectionNodes())
        self.assertAGGEdgesEqual([], abAGG)

        model = Model(schema, [
            '[A, AB, B].Y -> [A].X', '[A, AB, B].Z -> [A].X', '[B].Y -> [B].Z'
        ])
        aAGG = AbstractGroundGraph(model, 'A', 2)
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[A, AB, B].Y', '[A].X'), ('[A, AB, B].Z', '[A].X'),
            ('[A, AB, B].Y', '[A, AB, B].Z')
        ])
        self.assertAGGEdgesEqual(expectedEdges, aAGG)

        abAGG = AbstractGroundGraph(model, 'AB', 3)
        expectedEdges = self.relVarStrPairsToRelVarPairs([
            ('[AB, A, AB, B].Y', '[AB, A, AB, B].Z'),
            ('[AB, A, AB, B].Y', '[AB, A].X'), ('[AB, B].Y', '[AB, B].Z'),
            ('[AB, A, AB, B].Z', '[AB, A].X'), ('[AB, B].Y', '[AB, A].X'),
            ('[AB, B].Z', '[AB, A].X'),
            (('[AB, B].Y', '[AB, A, AB, B].Y'), '[AB, A].X'),
            (('[AB, B].Y', '[AB, A, AB, B].Y'), '[AB, B].Z'),
            (('[AB, B].Y', '[AB, A, AB, B].Y'), '[AB, A, AB, B].Z'),
            (('[AB, B].Z', '[AB, A, AB, B].Z'), '[AB, A].X'),
            ('[AB, A, AB, B].Y', ('[AB, B].Z', '[AB, A, AB, B].Z')),
            ('[AB, B].Y', ('[AB, B].Z', '[AB, A, AB, B].Z'))
        ])
        self.assertAGGEdgesEqual(expectedEdges, abAGG)