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);
        }
Exemple #3
0
        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);
        }
Exemple #6
0
        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);
        }