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)
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)
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)