public Person Map(EntityMapContext context) { Person person = null; foreach (var obj in context.Items) { switch (obj) { case Person p: person = p; break; case Address address: person.Address = address; break; case City city: person.Address.City = city; break; case Country country: person.Address.City.Country = country; break; } } return(person); }
public override Company Map(EntityMapContext context) { // NOTE: Order is very important here. We must map the objects in // the same order they were queried in the QueryBuilder. var company = Deduplicate(context.Start <Company>()); var email = context.Next <Email>("emails"); var phone = context.Next <Phone>("phones"); if (company != null) { if (email != null && // Eliminate duplicates !company.Emails.Any(e => e.Address == email.Address)) { company.Emails.Add(email); } if (phone != null && // Eliminate duplicates !company.Phones.Any(p => p.Number == phone.Number)) { company.Phones.Add(phone); } } return(company); }
public override Person Map(EntityMapContext context) { // NOTE: Order is very important here. We must map the objects in // the same order they were queried in the QueryBuilder. var person = context.Start <Person>(); var company = context.Next <Company>("companies", companyEntityMapper); var email = context.Next <Email>("emails"); var phone = context.Next <Phone>("phones"); var supervisor = context.Next <Person>("supervisor", personEntityMapper); var careerCounselor = context.Next <Person>("careerCounselor", personEntityMapper); if (person != null) { if (email != null && // Eliminate duplicates !person.Emails.Any(e => e.Address == email.Address)) { person.Emails.Add(email); } if (phone != null && // Eliminate duplicates !person.Phones.Any(p => p.Number == phone.Number)) { person.Phones.Add(phone); } person.Supervisor = supervisor; person.CareerCounselor = careerCounselor; } return(person); }
public override Person Map(EntityMapContext context) { // Avoid creating the mappers until they're used // NOTE: this avoids an infinite loop (had these been created in the ctor) if (companyEntityMapper == null) { companyEntityMapper = new CompanyEntityMapper(); } if (personEntityMapper == null) { personEntityMapper = new PersonEntityMapper(); } // NOTE: Order is very important here. We must map the objects in // the same order they were queried in the QueryBuilder. // Start with the person, and deduplicate var person = Deduplicate(context.Start <Person>()); var company = context.Next <Company>("companies", companyEntityMapper); var email = context.Next <Email>("emails"); var phone = context.Next <Phone>("phones"); var supervisor = context.Next <Person>("supervisor", personEntityMapper); var careerCounselor = context.Next <Person>("careerCounselor", personEntityMapper); if (person != null) { if (company != null && // Eliminate duplicates !person.Companies.Any(c => c.Id == company.Id)) { person.Companies.Add(company); } if (email != null && // Eliminate duplicates !person.Emails.Any(e => e.Address == email.Address)) { person.Emails.Add(email); } if (phone != null && // Eliminate duplicates !person.Phones.Any(p => p.Number == phone.Number)) { person.Phones.Add(phone); } person.Supervisor = person.Supervisor ?? supervisor; person.CareerCounselor = person.CareerCounselor ?? careerCounselor; } return(person); }
public void EntityMapSucceeds() { var person1 = new Person { FirstName = "Doug", Id = 2, LastName = "Day", MergedToPersonId = 2, }; var person2 = new Person { FirstName = "Douglas", Id = 2, LastName = "Day", MergedToPersonId = 2, }; var email1 = new Email { Address = "*****@*****.**", Id = 2, }; var email2 = new Email { Address = "*****@*****.**", Id = 3, }; var phone = new Phone { Id = 1, Number = "8011234567", Type = PhoneType.Mobile, }; var splitOn = new[] { typeof(Person), typeof(Email), typeof(Phone), }; var personEntityMapper = new PersonEntityMapper(); var graphql = @" { query { firstName lastName id emails { id address } phones { id number type } } }"; var selectionSet = fixture.BuildGraphQLSelection(graphql); var context1 = new EntityMapContext { Items = new object[] { person1, email1, phone, }, SelectionSet = selectionSet, SplitOn = splitOn, }; person1 = personEntityMapper.Map(context1); Assert.Equal(3, context1.MappedCount); Assert.Equal(2, person1.Id); Assert.Equal("Doug", person1.FirstName); Assert.Equal(1, person1.Emails.Count); Assert.Equal(1, person1.Phones.Count); var context2 = new EntityMapContext { Items = new object[] { person2, email2, null, }, SelectionSet = selectionSet, SplitOn = splitOn, }; person2 = personEntityMapper.Map(context2); Assert.Equal(3, context2.MappedCount); // The same reference should have been returned Assert.Same(person1, person2); // A 2nd email was added to person Assert.Equal(2, person1.Emails.Count); }
public void EntityMapSucceeds() { var person1 = new Person { FirstName = "Doug", Id = 2, LastName = "Day", }; var person2 = new Person { FirstName = "Douglas", Id = 2, LastName = "Day", }; var email1 = new Email { Address = "*****@*****.**", Id = 2, }; var email2 = new Email { Address = "*****@*****.**", Id = 3, }; var phone = new Phone { Id = 1, Number = "8011234567", Type = PhoneType.Mobile, }; var splitOn = new[] { typeof(Person), typeof(Email), typeof(Phone), }; var deduplicatingPersonMapper = new DeduplicatingEntityMapper <Person> { Mapper = new PersonEntityMapper(), PrimaryKey = p => p.Id, }; var graphql = @" { query { firstName lastName id emails { id address } phones { id number type } } }"; var selectionSet = fixture.BuildGraphQLSelection(graphql); var context1 = new EntityMapContext { Items = new object[] { person1, email1, phone, }, SelectionSet = selectionSet, SplitOn = splitOn, }; person1 = deduplicatingPersonMapper.Map(context1); Assert.Equal(3, context1.MappedCount); Assert.Equal(2, person1.Id); Assert.Equal("Doug", person1.FirstName); Assert.Equal(1, person1.Emails.Count); Assert.Equal(1, person1.Phones.Count); var context2 = new EntityMapContext { Items = new object[] { person2, email2, null, }, SelectionSet = selectionSet, SplitOn = splitOn, }; person2 = deduplicatingPersonMapper.Map(context2); Assert.Equal(3, context2.MappedCount); // Duplicate is detected Assert.Null(person2); // 2nd email added to person Assert.Equal(2, person1.Id); Assert.Equal("Doug", person1.FirstName); Assert.Equal(2, person1.Emails.Count); }