Exemplo n.º 1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var item      = JObject.Load(reader);
            var typeToken = item.SelectToken("Data.@type") ?? item.SelectToken("data.@type");

            IAggregate value = null;

            if (typeToken != null)
            {
                string type = typeToken.Value <string>();
                switch (type)
                {
                case "bucket":
                    value = new BucketAggregate();
                    break;

                case "exstats":
                    value = new ExtendedStatsAggregate();
                    break;

                case "ovalue":
                    value = new ObjectValueAggregate();
                    break;

                case "percentiles":
                    value = new PercentilesAggregate();
                    break;

                case "sbucket":
                    value = new SingleBucketAggregate();
                    break;

                case "stats":
                    value = new StatsAggregate();
                    break;

                case "tophits":
                    // TODO: Have to get all the docs as JToken and
                    //value = new TopHitsAggregate();
                    break;

                case "value":
                    value = new ValueAggregate();
                    break;

                case "dvalue":
                    value = new ValueAggregate <DateTime>();
                    break;
                }
            }

            if (value == null)
            {
                value = new ValueAggregate();
            }

            serializer.Populate(item.CreateReader(), value);

            return(value);
        }
Exemplo n.º 2
0
 private static List <FacetFilter> GetFacetFilter(SingleBucketAggregate source, IEnumerable <KeyValuePair <string, List <string> > > facetList, string key)
 {
     return(source.Terms(key).Buckets.Select(item => item).Select(facetitem => new FacetFilter()
     {
         Count = int.Parse(facetitem.DocCount.ToString()),
         Value = facetitem.Key,
         IsSelected = IsFacetTermExists(facetList, facetitem.Key)
     }).ToList());
 }
Exemplo n.º 3
0
        private static List <FacetFilter> GetOwnershipFacetFilter(SingleBucketAggregate source, IEnumerable <KeyValuePair <string, List <string> > > facetList)
        {
            var facetFilters = new List <FacetFilter>();

            foreach (var aggregation in source.Aggregations)
            {
                var facet = new FacetFilter();
                facet.Count      = int.Parse((aggregation.Value as SingleBucketAggregate).DocCount.ToString(CultureInfo.InvariantCulture));
                facet.Value      = aggregation.Key;
                facet.IsSelected = IsFacetTermExists(facetList, aggregation.Key);
                facetFilters.Add(facet);
            }
            return(facetFilters);
        }
Exemplo n.º 4
0
        private static List <FacetFilter> GetListPriceFacetFilter(SingleBucketAggregate source, IEnumerable <KeyValuePair <string, List <string> > > facetList, string key)
        {
            var facetFilters = new List <FacetFilter>();

            foreach (var aggregation in source.Aggregations)
            {
                var priceList = (aggregation.Value).Meta.ToList();
                for (int i = 0; i < priceList.Count; i++)
                {
                    var priceItem = priceList[i];
                    var facet     = new FacetFilter();
                    //facet.Count = int.Parse(priceItem.DocCount.ToString());
                    facet.Value      = priceItem.Key;
                    facet.IsSelected = IsFacetTermExists(facetList, priceItem.Key);
                    facetFilters.Add(facet);
                }
            }
            return(facetFilters);
        }
Exemplo n.º 5
0
        public SearchResult Search(SearchParameters searchParameters)
        {
            int            size     = 10000;
            List <Dataset> datasets = new List <Dataset>();
            string         text     = searchParameters.text;

            string[] coverageTypes = searchParameters.coveragetypes;
            string[] areas         = searchParameters.areas;
            string[] projections   = searchParameters.projections;
            string[] formats       = searchParameters.formats;

            var filters = new List <Func <QueryContainerDescriptor <Dataset>, QueryContainer> >();

            if (coverageTypes != null && coverageTypes.Length > 0)
            {
                filters.Add(nq => nq.Terms(m0 => m0.Field("file.coverageType").Terms(coverageTypes)));
            }

            if (areas != null && areas.Length > 0)
            {
                filters.Add(nq => nq.Terms(m1 => m1.Field("file.area").Terms(areas)));
            }

            if (projections != null && projections.Length > 0)
            {
                filters.Add(nq => nq.Terms(m2 => m2.Field("file.projection").Terms(projections)));
            }

            if (formats != null && formats.Length > 0)
            {
                filters.Add(nq => nq.Terms(m3 => m3.Field("file.format").Terms(formats)));
            }

            if (!string.IsNullOrEmpty(text))
            {
                text = "*" + text + "*";
            }

            var searchResponse = _client.Search <Dataset>(s => s
                                                          .Size(size)
                                                          .Query(q => q
                                                                 .Wildcard(m => m
                                                                           .Field(t => t.Title)
                                                                           .Value(text)
                                                                           ) &&
                                                                 q.Nested(n => n
                                                                          .InnerHits(ih => ih.From(0).Size(size))
                                                                          .Path(b => b.Files)
                                                                          .Query(nq => nq.Bool(bq => bq.Filter(filters))

                                                                                 )
                                                                          )
                                                                 )

                                                          .Aggregations(a => a
                                                                        .Nested("facets", n => n
                                                                                .Path(p => p.Files)
                                                                                .Aggregations(a => a
                                                                                              .Terms("coverageType", t => t.Field("file.coverageType").Size(size))
                                                                                              .Terms("area", t => t.Field("file.area").Size(size))
                                                                                              .Terms("projection", t => t.Field("file.projection").Size(size))
                                                                                              .Terms("format", t => t.Field("file.format").Size(size))
                                                                                              )
                                                                                )
                                                                        )
                                                          );

            List <Facet> facetResult = new List <Facet>();

            if (areas == null && coverageTypes == null && projections == null && formats == null)
            {
                SingleBucketAggregate facets = (SingleBucketAggregate)searchResponse.Aggregations["facets"];


                for (int f = 0; f < facets.Keys.Count(); f++)
                {
                    string key = facets.Keys.ElementAt(f);


                    Facet facet = new Facet(key);

                    BucketAggregate bucketAggregate = facets.Values.ElementAt(f) as BucketAggregate;
                    if (bucketAggregate != null)
                    {
                        var items = bucketAggregate.Items;
                        foreach (KeyedBucket <object> bucked in items)
                        {
                            var facetCount = (int)bucked.DocCount;
                            var facetValue = bucked.Key.ToString();

                            facet.FacetResults.Add(new Facet.FacetValue(facetValue, facetCount));
                        }

                        facetResult.Add(facet);
                    }
                }
            }

            SearchResult searchResult = new SearchResult();

            foreach (var hit in searchResponse.Hits)
            {
                Dataset dataset = new Dataset();
                dataset.Files        = new List <File>();
                dataset.MetadataUuid = hit.Source.MetadataUuid;
                dataset.Title        = hit.Source.Title;

                if (hit.InnerHits.Count > 0)
                {
                    if (facetResult.Count == 0)
                    {
                        facetResult.Add(new Facet("area"));
                        facetResult.Add(new Facet("coverageType"));
                        facetResult.Add(new Facet("format"));
                        facetResult.Add(new Facet("projection"));
                    }

                    var innerhits = hit.InnerHits["file"].Documents <File>();

                    foreach (var innerhit in innerhits)
                    {
                        var coverageType  = innerhit.CoverageType;
                        var facetCoverage = facetResult[1].FacetResults.Where(f => f.Name == coverageType).FirstOrDefault();
                        if (facetCoverage == null)
                        {
                            facetResult[1].FacetResults.Add(new Facet.FacetValue {
                                Name = coverageType, Count = 1
                            });
                        }
                        else
                        {
                            facetResult[1].FacetResults.Where(p => p.Name == coverageType).Select(u => { u.Count = u.Count + 1; return(u); }).ToList();
                        }


                        var area      = innerhit.Area;
                        var facetArea = facetResult[0].FacetResults.Where(f => f.Name == area).FirstOrDefault();
                        if (facetArea == null)
                        {
                            facetResult[0].FacetResults.Add(new Facet.FacetValue {
                                Name = area, Count = 1
                            });
                        }
                        else
                        {
                            facetResult[0].FacetResults.Where(p => p.Name == area).Select(u => { u.Count = u.Count + 1; return(u); }).ToList();
                        }

                        var format      = innerhit.Format;
                        var facetFormat = facetResult[2].FacetResults.Where(f => f.Name == format).FirstOrDefault();
                        if (facetFormat == null)
                        {
                            facetResult[2].FacetResults.Add(new Facet.FacetValue {
                                Name = format, Count = 1
                            });
                        }
                        else
                        {
                            facetResult[2].FacetResults.Where(p => p.Name == format).Select(u => { u.Count = u.Count + 1; return(u); }).ToList();
                        }

                        var projection      = innerhit.Projection;
                        var facetProjection = facetResult[3].FacetResults.Where(f => f.Name == projection).FirstOrDefault();
                        if (facetProjection == null)
                        {
                            facetResult[3].FacetResults.Add(new Facet.FacetValue {
                                Name = projection, Count = 1
                            });
                        }
                        else
                        {
                            facetResult[3].FacetResults.Where(p => p.Name == projection).Select(u => { u.Count = u.Count + 1; return(u); }).ToList();
                        }
                    }

                    dataset.Files.AddRange(hit.InnerHits["file"].Documents <File>());
                }
                else
                {
                    dataset.Files.AddRange(hit.Source.Files);
                }

                datasets.Add(dataset);
            }

            searchResult.Datasets = datasets;
            searchResult.Facets   = facetResult;

            return(searchResult);
        }
		private IAggregate GetDocCountBucket(JsonReader reader, JsonSerializer serializer)
		{
			reader.Read();
			var docCount = (reader.Value as long?).GetValueOrDefault(0);
			var bucket = new SingleBucketAggregate { DocCount = docCount };
			reader.Read();
			if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "buckets")
			{
				var b = this.GetBucket(reader, serializer) as BucketAggregateData;
				return new BucketAggregateData
				{
					DocCount = docCount,
					Items = b.Items
				};
			}

			bucket.Aggregations = this.GetNestedAggregations(reader, serializer);

			return bucket;
		}