Beispiel #1
0
        public static IEnumerable <long[]> AuIdToAuId(long start, long end,
                                                      MagEntityAuId[] startEntityAuIds, MagEntityAuId[] endEntityAuIds)
        {
            var result = new ConcurrentBag <long[]>();

            var startIds = startEntityAuIds.Select(sau => sau.Id).ToArray();
            var endIds   = endEntityAuIds.Select(eau => eau.Id).ToArray();

            var calcActions = new Action[2];

            calcActions[0] = () =>
            {
                foreach (var singleResult in startIds
                         .Intersect(endIds)
                         .Select(id => new[] { start, id, end }))
                {
                    // AuId - Id - AuId
                    result.Add(singleResult);
                }
            };

            calcActions[1] = () =>
            {
                foreach (
                    var singleResult in startEntityAuIds.SelectMany(sau => sau.Authors).Select(au => au.AffiliationId)
                    .Intersect(endEntityAuIds.SelectMany(eau => eau.Authors).Select(au => au.AffiliationId))
                    .Where(afId => afId != 0).Select(id => new[] { start, id, end }))
                {
                    // AuId - AfId - AuId
                    result.Add(singleResult);
                }
            };
            Parallel.Invoke(calcActions);

            Parallel.ForEach(startIds, startId =>
            {
                var startIdRIds = MagHelper.QueryRId(startId);

                foreach (var singleResult in startIdRIds.Intersect(endIds)
                         .Select(id => new[] { start, startId, id, end }))
                {
                    // AuId - Id - Id - AuId
                    result.Add(singleResult);
                }
            });
            return(result);
        }
Beispiel #2
0
        public static IEnumerable <long[]> AuIdToId(long start, long end,
                                                    MagEntityAuId[] startEntityAuIds, MagEntity endEntity)
        {
            var result = new ConcurrentBag <long[]>();

            if (endEntity == null)
            {
                return(new long[0][]);
            }

            if (endEntity.Authors != null)
            {
                if (endEntity.Authors.Any(au => au.Id == start))
                {
                    // AuId - Id
                    result.Add(new[] { start, end });
                }
                var afIds = startEntityAuIds.SelectMany(auId => auId.Authors
                                                        .Select(afId => afId.AffiliationId)).ToArray();
                Parallel.ForEach(endEntity.Authors, author =>
                {
                    if (author.AffiliationId != 0 && afIds.Contains(author.AffiliationId))
                    {
                        // AuId - AfId - AuId - Id
                        result.Add(new[] { start, author.AffiliationId, author.Id, end });
                    }
                });
            }

            var middleIds = startEntityAuIds.Select(entity => entity.Id).Distinct().ToArray();

            Parallel.ForEach(middleIds, middleId =>
            {
                var middleEntity = MagHelper.GetEntityById(middleId);

                if (middleEntity.ReferenceIds != null)
                {
                    if (middleEntity.ReferenceIds.Contains(end))
                    {
                        // AuId - Id - Id
                        result.Add(new[] { start, middleId, end });
                    }

                    foreach (var rId in middleEntity.ReferenceIds)
                    {
                        var ridRids = MagHelper.QueryRId(rId);
                        if (ridRids == null)
                        {
                            continue;
                        }
                        if (ridRids.Contains(middleId))
                        {
                            // AuId - Id - Id - Id
                            result.Add(new[] { start, middleId, rId, end });
                        }
                    }
                }

                var possibleIds = new List <long>();
                if (middleEntity.Fields != null && endEntity.Fields != null)
                {
                    possibleIds.AddRange(middleEntity.Fields.Select(mf => mf.Id).Intersect(
                                             endEntity.Fields.Select(ef => ef.Id)));
                }
                if (middleEntity.Authors != null && endEntity.Authors != null)
                {
                    possibleIds.AddRange(middleEntity.Authors.Select(mau => mau.Id).Intersect(
                                             endEntity.Authors.Select(eau => eau.Id)));
                }
                if (middleEntity.Conference != null && endEntity.Conference != null)
                {
                    if (middleEntity.Conference.Id == endEntity.Conference.Id)
                    {
                        possibleIds.Add(middleEntity.Conference.Id);
                    }
                }
                if (middleEntity.Journal != null && endEntity.Journal != null)
                {
                    if (middleEntity.Journal.Id == endEntity.Journal.Id)
                    {
                        possibleIds.Add(middleEntity.Journal.Id);
                    }
                }
                foreach (var singleResult in possibleIds.Where(id => id != 0)
                         .Select(id => new[] { start, middleId, id, end }))
                {
                    // AuId - Id - FId/AuId/CId/JId - Id
                    result.Add(singleResult);
                }
            });
            return(result);
        }