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); }
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()); }
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); }
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()); }
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); }
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; }