def test_join_two_separate_relations(self): instring = 'alpha \\theta_join_{a1 = b1} beta;' forest = self.build(instring) left = RelationNode('alpha', self.schema) right = RelationNode('beta', self.schema) expected = ThetaJoinNode(left, right, 'a1 = b1') self.assertEqual(expected, forest[0])
def test_join_two_separate_relations(self): instring = 'alpha \\natural_join beta;' forest = self.build(instring) left = RelationNode('alpha', self.schema) right = RelationNode('beta', self.schema) expected = NaturalJoinNode(left, right) self.assertEqual(expected, forest[0])
def test_build_when_instring_has_multiple_relations(self): instring = 'numbers; letters;' forest = self.build(instring) self.assertEqual(2, len(forest)) first = RelationNode('numbers', self.schema) second = RelationNode('letters', self.schema) self.assertEqual(first, forest[0]) self.assertEqual(second, forest[1])
def test_join_three_separate_relations(self): instring = 'alpha \\join beta \\join gamma;' forest = self.build(instring) left = RelationNode('alpha', self.schema) middle = RelationNode('beta', self.schema) right = RelationNode('gamma', self.schema) intermediate = CrossJoinNode(left, middle) expected = CrossJoinNode(intermediate, right) self.assertEqual(expected, forest[0])
def test_theta_join_with_join(self): instring = 'alpha \\theta_join_{a1 = b1} beta \\join gamma;' forest = self.build(instring) left = RelationNode('alpha', self.schema) middle = RelationNode('beta', self.schema) right = RelationNode('gamma', self.schema) intermediate = ThetaJoinNode(left, middle, 'a1 = b1') expected = CrossJoinNode(intermediate, right) self.assertEqual(expected, forest[0])
def test_natural_join_with_join(self): instring = 'alpha \\natural_join beta \\join gamma;' forest = self.build(instring) left = RelationNode('alpha', self.schema) middle = RelationNode('beta', self.schema) right = RelationNode('gamma', self.schema) intermediate = NaturalJoinNode(left, middle) expected = CrossJoinNode(intermediate, right) self.assertEqual(expected, forest[0])
def test_join_three_separate_relations(self): instring = 'alpha \\theta_join_{a1 = b1} beta ' \ '\\theta_join_{a1 = b1} gamma;' forest = self.build(instring) left = RelationNode('alpha', self.schema) middle = RelationNode('beta', self.schema) right = RelationNode('gamma', self.schema) intermediate = ThetaJoinNode(left, middle, 'a1 = b1') expected = ThetaJoinNode(intermediate, right, 'a1 = b1') self.assertEqual(expected, forest[0])
def test_project_with_all_attr(self): attr = self.schema.get_attributes('magic_wand') instring = '\\project_{' + ', '.join(attr) + '} magic_wand;' forest = self.build(instring) child = RelationNode('magic_wand', self.schema) expected = ProjectNode(child, attr) self.assertEqual(expected, forest[0])
def setUp(self): self.schema = Schema({ 'alpha': ['a1'], 'beta': ['b1', 'b2'], 'gamma': ['c1', 'c2', 'c3'], 'twin': ['t1', 't2', 't3'], 'twin_prime': ['t1', 't2', 't3'], 'ambiguous': ['d1', 'd1'] }) self.alpha = RelationNode('alpha', self.schema) self.beta = RelationNode('beta', self.schema) self.gamma = RelationNode('gamma', self.schema) self.twin = RelationNode('twin', self.schema) self.twin_prime = RelationNode('twin_prime', self.schema) self.ambiguous = RelationNode('ambiguous', self.schema)
def test_project_with_two_attr(self): instring = '\project_{owner, wood} magic_wand;' forest = self.build(instring) child = RelationNode('magic_wand', self.schema) expected = ProjectNode(child, ['owner', 'wood']) self.assertEqual(expected, forest[0])
def test_build_when_instring_is_single_relation(self): forest = self.build('letters;') self.assertEqual(1, len(forest)) expected = RelationNode('letters', self.schema) self.assertEqual(expected, forest[0])
def test_exception_when_join_two_identical_relations(self): left = RelationNode('alpha', self.schema) right = RelationNode('alpha', self.schema) self.assertRaises(RelationReferenceError, NaturalJoinNode, left, right)
def test_attributes_when_name_is_in_schema(self): expected = AttributeList(self.schema.get_attributes('alpha'), 'alpha').to_list() node = RelationNode('alpha', self.schema) self.assertEqual(expected, node.attributes.to_list())
def test_operator_from_init(self): expected = Operator.relation actual = RelationNode('alpha', self.schema).operator self.assertEqual(expected, actual)