예제 #1
0
 private IEnumerable <Point> GetResultsFromQuery(GeoQueryResult result)
 {
     return(from item in result.Items
            let geoJsonString = item["geoJson"].S
                                let point = JsonConvert.DeserializeObject <GeoPoint>(geoJsonString)
                                            select new Point
     {
         lat = point.lat,
         lng = point.lng
     });
 }
        private IEnumerable <SchoolSearchResult> GetResultsFromQuery(GeoQueryResult result)
        {
            var dtos = from item in result.Items
                       let geoJsonString                         = item[_config.GeoJsonAttributeName].S
                                                       let point = JsonConvert.DeserializeObject <GeoPoint>(geoJsonString)
                                                                   select new SchoolSearchResult
            {
                Latitude   = point.Latitude,
                Longitude  = point.Longitude,
                RangeKey   = item[_config.RangeKeyAttributeName].S,
                SchoolName = item.ContainsKey("schoolName") ? item["schoolName"].S : string.Empty
            };

            return(dtos);
        }
예제 #3
0
        private async Task <GeoQueryResult> DispatchQueries(IEnumerable <GeohashRange> ranges, GeoQueryRequest geoQueryRequest, CancellationToken cancellationToken)
        {
            var geoQueryResult = new GeoQueryResult();


            var futureList = new List <Task>();

            var internalSource = new CancellationTokenSource();
            var internalToken  = internalSource.Token;
            var cts            = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, internalToken);


            foreach (var outerRange in ranges)
            {
                foreach (var range in outerRange.TrySplit(_config.HashKeyLength))
                {
                    var task = RunGeoQuery(geoQueryRequest, geoQueryResult, range, cts.Token);
                    futureList.Add(task);
                }
            }

            Exception inner = null;

            try
            {
                for (var i = 0; i < futureList.Count; i++)
                {
                    try
                    {
                        await futureList[i].ConfigureAwait(false);
                    }
                    catch (Exception e)
                    {
                        inner = e;
                        // cancel the others
                        internalSource.Cancel(true);
                    }
                }
            }
            catch (Exception ex)
            {
                inner = inner ?? ex;
                throw new ClientException("Querying Amazon DynamoDB failed.", inner);
            }


            return(geoQueryResult);
        }
예제 #4
0
        private IEnumerable <PhotoData> GetResultsFromQuery(GeoQueryResult result)
        {
            var dtos = from item in result.Items
                       let geoJsonString                         = item[_config.GeoJsonAttributeName].S
                                                       let point = JsonConvert.DeserializeObject <GeoPoint>(geoJsonString)
                                                                   select new PhotoDataModel
            {
                rangeKey    = item[_config.RangeKeyAttributeName].S,
                lat         = point.Latitude,
                lng         = point.Longitude,
                imgUrl      = item.ContainsKey("imgUrl") ? item["imgUrl"].S : string.Empty,
                imgUrlLarge = item.ContainsKey("imgUrlLarge") ? item["imgUrlLarge"].S : string.Empty
            };

            return(dtos);
        }
예제 #5
0
        private IEnumerable <resultsModel> GetResultsFromQuery(GeoQueryResult result)
        {
            var dtos = from item in result.Items
                       let geoJsonString                         = item[_config.GeoJsonAttributeName].S
                                                       let point = JsonConvert.DeserializeObject <GeoPoint>(geoJsonString)
                                                                   select new resultsModel
            {
                Latitude  = point.Latitude,
                Longitude = point.Longitude,
                RangeKey  = item[_config.RangeKeyAttributeName].S,
                //           zipcode = item.ContainsKey("zipcode") ? item["zipcode"].S : string.Empty,
                //           Title = item.ContainsKey("Title") ? item["Title"].S : string.Empty
            };

            return(dtos);
        }
예제 #6
0
        private async Task RunGeoQuery(GeoQueryRequest request, GeoQueryResult geoQueryResult, GeohashRange range, CancellationToken cancellationToken)
        {
            var queryRequest = request.QueryRequest.CopyQueryRequest();
            var hashKey      = S2Manager.GenerateHashKey(range.RangeMin, _config.HashKeyLength);

            var results = await _dynamoDBManager.QueryGeohashAsync(queryRequest, hashKey, range, cancellationToken).ConfigureAwait(false);

            foreach (var queryResult in results)
            {
                cancellationToken.ThrowIfCancellationRequested();

                // This is a concurrent collection
                geoQueryResult.QueryResults.Add(queryResult);

                var filteredQueryResult = Filter(queryResult.Items, request);

                // this is a concurrent collection
                foreach (var r in filteredQueryResult)
                {
                    geoQueryResult.Items.Add(r);
                }
            }
        }