Exemplo n.º 1
0
        public ResultSet Join(ResultSet table, string leftTableIdentifier, string leftColumnName, string rightTableIdentifier, string rightColumnName)
        {
            var joinedRows = new List<Row>();

            foreach (var row in Rows)
            {
                var matchingRows = GetMatchingRows(row, table, leftTableIdentifier, leftColumnName, rightTableIdentifier, rightColumnName);

                if (matchingRows.IsEmpty())
                    joinedRows.Add(row);

                foreach (var matchingRow in matchingRows)
                {
                    var combinedColumnValues = row.ColumnValues.Concat(matchingRow.ColumnValues);
                    joinedRows.Add(new Row(combinedColumnValues));
                }
            }

            return new ResultSet(joinedRows);
        }
Exemplo n.º 2
0
        public void Creating_child_instances_from_two_rows_with_two_children_referencing_same_parent_gives_two_children_referencing_same_parent_instance()
        {
            var resultSet = new ResultSet();

            resultSet.AddRow(new ColumnValue("Child Id", 1), new ColumnValue("Parent Id", _guid1));
            resultSet.AddRow(new ColumnValue("Child Id", 2), new ColumnValue("Parent Id", _guid1));

            var children = _mapper.CreateInstanceGraphs<Child>(resultSet, _childParentRelation);

            Assert.AreEqual(2, children.Count);

            var parent = children.First().Parent;

            Assert.AreEqual(1, children.First().Id);
            Assert.AreEqual(2, children.Last().Id);
            Assert.AreEqual(_guid1, parent.Id);

            Assert.AreSame(parent, children.Last().Parent);

            Assert.AreEqual(2, parent.Children.Count);
            CollectionAssert.Contains(parent.Children, children.First());
            CollectionAssert.Contains(parent.Children, children.Last());
        }
Exemplo n.º 3
0
        public void Creating_instances_from_two_rows_with_single_parent_with_two_children_gives_single_parent_with_two_children()
        {
            var resultSet = new ResultSet();

            resultSet.AddRow(new ColumnValue("Child Id", 1), new ColumnValue("Parent Id", _guid1));
            resultSet.AddRow(new ColumnValue("Child Id", 2), new ColumnValue("Parent Id", _guid1));

            var parents = _mapper.CreateInstanceGraphs<Parent>(resultSet, _parentChildRelation);

            Assert.AreEqual(1, parents.Count);

            var parent = parents.First();
            var children = parent.Children;

            Assert.AreEqual(1, children.First().Id);
            Assert.AreEqual(2, children.Last().Id);
            Assert.AreSame(parent, children.First().Parent);
            Assert.AreSame(parent, children.Last().Parent);
        }
Exemplo n.º 4
0
        public void Two_rows_sharing_some_entities_are_mapped_to_two_hierachies_sharing_instances()
        {
            var resultSet = new ResultSet();

            resultSet.AddRow(new ColumnValue("Parent Id", _guid1), new ColumnValue("Child Id", 1), new ColumnValue("GrandChild Id", 2));
            resultSet.AddRow(new ColumnValue("Parent Id", _guid2), new ColumnValue("Child Id", 3), new ColumnValue("GrandChild Id", 2));
            resultSet.AddRow(new ColumnValue("Parent Id", _guid1), new ColumnValue("Child Id", 2), new ColumnValue("GrandChild Id", 4));
            resultSet.AddRow(new ColumnValue("Parent Id", _guid1), new ColumnValue("Child Id", 2), new ColumnValue("GrandChild Id", 5));

            var parents = _mapper.CreateInstanceGraphs<Parent>(resultSet, new [] { _parentChildRelation, _childGrandChildRelation });

            Assert.AreEqual(2, parents.Count);

            var firstParent = parents.First();
            var secondParent = parents.Last();
            var firstParentChild1 = firstParent.Children.FirstOrDefault();
            var firstParentChild2 = firstParent.Children.LastOrDefault();
            var secondParentChild = secondParent.Children.FirstOrDefault();

            Assert.AreEqual(2, firstParent.Children.Count);
            Assert.AreEqual(1, firstParentChild1.GrandChildren.Count);
            Assert.AreEqual(2, firstParentChild2.GrandChildren.Count);

            Assert.AreEqual(_guid1, firstParent.Id);
            Assert.AreEqual(1, firstParentChild1.Id);
            Assert.AreEqual(2, firstParentChild1.GrandChildren.First().Id);
            Assert.AreEqual(2, firstParentChild2.Id);
            Assert.AreEqual(4, firstParentChild2.GrandChildren.First().Id);
            Assert.AreEqual(5, firstParentChild2.GrandChildren.Last().Id);

            Assert.AreEqual(_guid2, secondParent.Id);
            Assert.AreEqual(3, secondParentChild.Id);
            Assert.AreEqual(2, secondParentChild.GrandChildren.First().Id);

            Assert.AreSame(firstParentChild1.GrandChildren.First(), secondParentChild.GrandChildren.First());
        }
Exemplo n.º 5
0
        public void Rows_in_result_set_without_id_column_values_are_mapped_to_separate_entities_even_though_columns_values_match()
        {
            var resultSet = new ResultSet();

            resultSet.AddRow(new ColumnValue("ParentWithoutId Name", "First name"), new ColumnValue("ChildWithoutId Name", "child name 0"));
            resultSet.AddRow(new ColumnValue("ParentWithoutId Name", "Another first name"), new ColumnValue("ChildWithoutId Name", "child name 1"));
            resultSet.AddRow(new ColumnValue("ParentWithoutId Name", "First name"), new ColumnValue("ChildWithoutId Name", "child name 2"));

            var parents = _mapper.CreateInstanceGraphs<ParentWithoutId>(resultSet, new[] { _idLessRelation });

            Assert.AreEqual(3, parents.Count);

            Assert.AreEqual(1, parents[0].Children.Count);
            Assert.AreEqual(1, parents[1].Children.Count);
            Assert.AreEqual(1, parents[2].Children.Count);

            Assert.AreEqual("First name", parents[0].Name);
            Assert.AreEqual("Another first name", parents[1].Name);
            Assert.AreEqual("First name", parents[2].Name);

            Assert.AreEqual("child name 0", parents[0].Children[0].Name);
            Assert.AreEqual("child name 1", parents[1].Children[0].Name);
            Assert.AreEqual("child name 2", parents[2].Children[0].Name);

            Assert.AreEqual(parents[0], parents[0].Children[0].Parent);
            Assert.AreEqual(parents[1], parents[1].Children[0].Parent);
            Assert.AreEqual(parents[2], parents[2].Children[0].Parent);
        }
Exemplo n.º 6
0
        private static IEnumerable<Row> GetMatchingRows(Row row, ResultSet joinedTable, string leftTableIdentifier, string leftColumnName, string rightTableIdentifier, string rightColumnName)
        {
            // This code is messy... The deal is that we don't know if the left table identifier + column name
            // is found in the joined table or the original table, and the same for the right.
            // TODO: This should be refactored when I have the energy.

            ColumnValue leftValue = null, rightValue = null;

            var matchingRows = new List<Row>();

            var isJoinedTableRight = row.HasValuesForTable(leftTableIdentifier);

            if (isJoinedTableRight)
            {
                leftValue = row.GetColumnValue(leftTableIdentifier, leftColumnName);
            }
            else
            {
                rightValue = row.GetColumnValue(rightTableIdentifier, rightColumnName);
            }

            foreach (var joinedRow in joinedTable.Rows)
            {
                if (isJoinedTableRight)
                {
                    rightValue = joinedRow.GetColumnValue(rightTableIdentifier, rightColumnName);
                }
                else
                {
                    leftValue = joinedRow.GetColumnValue(leftTableIdentifier, leftColumnName);
                }

                if (Equals(leftValue.Value, rightValue.Value))
                    matchingRows.Add(joinedRow);
            }

            return matchingRows;
        }