Example #1
0
        private async Task <DiscoveredPlace[]> DiscoverOnFoursquareForExploring(IReadOnlyList <KmlPlacemark> placemarks, string language, IDiscoveringProgress progressTracker, CancellationToken cancellationToken)
        {
            var result = new ConcurrentBag <DiscoveredPlace>();

            var placemarksToExplore = new List <KmlPlacemark> {
                placemarks.First()
            };

            foreach (var placemark in placemarks.Skip(1))
            {
                if (!placemarksToExplore.Any(p => _kmlCalculator.GetDistanceInMeters(p, placemark) < EXPLORE_ON_PLACEMARKS_AFTER_METERS))
                {
                    placemarksToExplore.Add(placemark);
                }
                else
                {
                    progressTracker.ReportItemProcessed();
                }
            }

            await placemarksToExplore.ForEachAsync(DEGREE_OF_PARALLELISM_PER_SERVICE, async (placemark) =>
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                var venues = await _foursquare.ExplorePopular(placemark, language, cancellationToken);
                if (venues != null)
                {
                    foreach (var venue in venues)
                    {
                        if (placemarks.Any(p => p.Name.Equals(venue.Title, StringComparison.OrdinalIgnoreCase)))
                        {
                            continue;
                        }

                        result.Add(new DiscoveredPlace
                        {
                            Venue = venue
                        });
                        _logger.Info($"Explored a recommended venue on Foursquare: {venue.Title}");
                    }
                }

                progressTracker.ReportItemProcessed();
            });

            return(result.ToArray());
        }
Example #2
0
        public virtual async Task <List <DiscoveredPlace> > DiscoverOnFoursquare(List <KmlPlacemark> placemarks, string language, IDiscoveringProgress progressTracker, CancellationToken cancellationToken)
        {
            var matchings = await DiscoverOnFoursquareForMatching(placemarks, language, progressTracker, cancellationToken);

            var explored = await DiscoverOnFoursquareForExploring(placemarks, language, progressTracker, cancellationToken);

            return(matchings
                   .Concat(explored)
                   .GroupBy(x => x.Venue.Id)
                   .Select(x => x.FirstOrDefault(dp => dp.IsForPlacemark) ?? x.First())
                   .ToList());
        }
Example #3
0
        public async Task <List <DiscoveredPlace> > Discover(KmlDocument document, string language, IDiscoveringProgress progressTracker, CancellationToken cancellationToken)
        {
            var placemarks = document.Folders.Where(x => !x.ContainsRoute).SelectMany(x => x.Placemarks).ToList();

            const int loopsCount = 3;

            progressTracker.ReportNumberOfIterations(placemarks.Count * loopsCount);

            var hereTask       = DiscoverOnHere(placemarks, language, progressTracker, cancellationToken);
            var foursquareTask = DiscoverOnFoursquare(placemarks, language, progressTracker, cancellationToken);

            var result = await Task.WhenAll(hereTask, foursquareTask);

            progressTracker.ReportDone();

            return(result.SelectMany(x => x).ToList());
        }
Example #4
0
        public virtual async Task <List <DiscoveredPlace> > DiscoverOnHere(IEnumerable <KmlPlacemark> placemarks, string language, IDiscoveringProgress progressTracker, CancellationToken cancellationToken)
        {
            var result = new ConcurrentBag <DiscoveredPlace>();

            await placemarks.ForEachAsync(DEGREE_OF_PARALLELISM_PER_SERVICE, async (placemark) => {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                var venue = await _here.LookupMatchingVenue(placemark, language, cancellationToken);
                if (venue != null)
                {
                    result.Add(new DiscoveredPlace {
                        Venue = venue,
                        AttachedToPlacemark = placemark
                    });
                    _logger.Info($"Found a matching venue on HERE: {venue.Title}");
                }

                progressTracker.ReportItemProcessed();
            });

            return(result
                   .GroupBy(x => x.Venue.Id)
                   .Select(x => x.FirstOrDefault(dp => dp.IsForPlacemark) ?? x.First())
                   .ToList());
        }
Example #5
0
        private async Task <DiscoveredPlace[]> DiscoverOnFoursquareForMatching(IEnumerable <KmlPlacemark> placemarks, string language, IDiscoveringProgress progressTracker, CancellationToken cancellationToken)
        {
            var result = new ConcurrentBag <DiscoveredPlace>();

            await placemarks.ForEachAsync(DEGREE_OF_PARALLELISM_PER_SERVICE, async (placemark) =>
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                var venue = await _foursquare.LookupMatchingVenue(placemark, language, cancellationToken);
                if (venue != null)
                {
                    result.Add(new DiscoveredPlace
                    {
                        Venue = venue,
                        AttachedToPlacemark = placemark
                    });
                    _logger.Info($"Found a matching venue on Foursquare: {venue.Title}");
                }

                progressTracker.ReportItemProcessed();
            });

            return(result.ToArray());
        }