Skip to content

Commit 58b082c

Browse files
committed
Align top level inner hits with ES 5.0
- Type and Path are now at the inner_hits level - Renamed NamedInnerHits => TopLevelInnerHits - Renamed GlobalInnerHit => TopLevelInnerHit
1 parent e28c6a5 commit 58b082c

11 files changed

+283
-418
lines changed

Diff for: src/Nest/Nest.csproj

+2-5
Original file line numberDiff line numberDiff line change
@@ -1095,12 +1095,9 @@
10951095
<Compile Include="Search\Search\Hits\HitsMetaData.cs" />
10961096
<Compile Include="Search\Search\Hits\InnerHitsMetaData.cs" />
10971097
<Compile Include="Search\Search\Hits\InnerHitsResult.cs" />
1098-
<Compile Include="Search\Search\InnerHits\GlobalInnerHit.cs" />
1098+
<Compile Include="Search\Search\InnerHits\TopLevelInnerHit.cs" />
10991099
<Compile Include="Search\Search\InnerHits\InnerHits.cs" />
1100-
<Compile Include="Search\Search\InnerHits\InnerHitsContainer.cs" />
1101-
<Compile Include="Search\Search\InnerHits\NamedInnerHits.cs" />
1102-
<Compile Include="Search\Search\InnerHits\PathInnerHit.cs" />
1103-
<Compile Include="Search\Search\InnerHits\TypeInnerHit.cs" />
1100+
<Compile Include="Search\Search\InnerHits\TopLevelInnerHits.cs" />
11041101
<Compile Include="Search\Search\Profile\Collector.cs" />
11051102
<Compile Include="Search\Search\Profile\Profile.cs" />
11061103
<Compile Include="Search\Search\Profile\QueryBreakdown.cs" />

Diff for: src/Nest/Search/Search/InnerHits/GlobalInnerHit.cs

-79
This file was deleted.

Diff for: src/Nest/Search/Search/InnerHits/InnerHitsContainer.cs

-42
This file was deleted.

Diff for: src/Nest/Search/Search/InnerHits/NamedInnerHits.cs

-49
This file was deleted.

Diff for: src/Nest/Search/Search/InnerHits/PathInnerHit.cs

-49
This file was deleted.

Diff for: src/Nest/Search/Search/InnerHits/TopLevelInnerHit.cs

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using Newtonsoft.Json;
6+
7+
namespace Nest
8+
{
9+
[JsonConverter(typeof(ReadAsTypeJsonConverter<TopLevelInnerHit>))]
10+
public interface ITopLevelInnerHit : IInnerHits
11+
{
12+
[JsonProperty("query")]
13+
QueryContainer Query { get; set; }
14+
15+
[JsonProperty("inner_hits")]
16+
ITopLevelInnerHits InnerHits { get; set; }
17+
18+
[JsonProperty("type")]
19+
TypeName Type { get; set; }
20+
21+
[JsonProperty("path")]
22+
Field Path { get; set; }
23+
}
24+
25+
public class TopLevelInnerHit : InnerHits, ITopLevelInnerHit
26+
{
27+
public QueryContainer Query { get; set; }
28+
public ITopLevelInnerHits InnerHits { get; set; }
29+
public TypeName Type { get; set; }
30+
public Field Path { get; set; }
31+
}
32+
33+
public class TopLevelInnerHit<T> : DescriptorBase<TopLevelInnerHit<T>, ITopLevelInnerHit>, ITopLevelInnerHit
34+
where T : class
35+
{
36+
QueryContainer ITopLevelInnerHit.Query { get; set; }
37+
ITopLevelInnerHits ITopLevelInnerHit.InnerHits { get; set; }
38+
TypeName ITopLevelInnerHit.Type { get; set; }
39+
Field ITopLevelInnerHit.Path { get; set; }
40+
string IInnerHits.Name { get; set; }
41+
int? IInnerHits.From { get; set; }
42+
int? IInnerHits.Size { get; set; }
43+
IList<ISort> IInnerHits.Sort { get; set; }
44+
IHighlight IInnerHits.Highlight { get; set; }
45+
bool? IInnerHits.Explain { get; set; }
46+
ISourceFilter IInnerHits.Source { get; set; }
47+
bool? IInnerHits.Version { get; set; }
48+
IList<Field> IInnerHits.FielddataFields { get; set; }
49+
IScriptFields IInnerHits.ScriptFields { get; set; }
50+
51+
public TopLevelInnerHit<T> Query(Func<QueryContainerDescriptor<T>, QueryContainer> querySelector) =>
52+
Assign(a => a.Query = querySelector?.InvokeQuery(new QueryContainerDescriptor<T>()));
53+
54+
public TopLevelInnerHit<T> InnerHits(Func<TopLevelInnerHitsDescriptor<T>, IPromise<ITopLevelInnerHits>> selector) =>
55+
Assign(a => a.InnerHits = selector?.Invoke(new TopLevelInnerHitsDescriptor<T>())?.Value);
56+
57+
public TopLevelInnerHit<T> Type(TypeName type) => Assign(a => a.Type = type);
58+
59+
public TopLevelInnerHit<T> Type<TOther>() where TOther : class => Assign(a => a.Type = typeof(TOther));
60+
61+
public TopLevelInnerHit<T> Path(Field path) => Assign(a => a.Path = path);
62+
63+
public TopLevelInnerHit<T> Path(Expression<Func<T, object>> path) => Assign(a => a.Path = path);
64+
65+
public TopLevelInnerHit<T> From(int? from) => Assign(a => a.From = from);
66+
67+
public TopLevelInnerHit<T> Size(int? size) => Assign(a => a.Size = size);
68+
69+
public TopLevelInnerHit<T> Name(string name) => Assign(a => a.Name = name);
70+
71+
public TopLevelInnerHit<T> FielddataFields(params Field[] fielddataFields) =>
72+
Assign(a => a.FielddataFields = fielddataFields?.ToListOrNullIfEmpty());
73+
74+
public TopLevelInnerHit<T> FielddataFields(params Expression<Func<T, object>>[] fielddataFields) =>
75+
Assign(a => a.FielddataFields = fielddataFields?.Select(f => (Field) f).ToListOrNullIfEmpty());
76+
77+
public TopLevelInnerHit<T> Explain(bool explain = true) => Assign(a => a.Explain = explain);
78+
79+
public TopLevelInnerHit<T> Version(bool version = true) => Assign(a => a.Version = version);
80+
81+
public TopLevelInnerHit<T> Sort(Func<SortDescriptor<T>, IPromise<IList<ISort>>> sortSelector) => Assign(a => a.Sort = sortSelector?.Invoke(new SortDescriptor<T>())?.Value);
82+
83+
/// <summary>
84+
/// Allow to highlight search results on one or more fields. The implementation uses the either lucene fast-vector-highlighter or highlighter.
85+
/// </summary>
86+
public TopLevelInnerHit<T> Highlight(Func<HighlightDescriptor<T>, IHighlight> highlightSelector) =>
87+
Assign(a => a.Highlight = highlightSelector?.Invoke(new HighlightDescriptor<T>()));
88+
89+
public TopLevelInnerHit<T> Source(bool include = true)=> Assign(a => a.Source = !include ? SourceFilter.ExcludeAll : null);
90+
91+
public TopLevelInnerHit<T> Source(Func<SourceFilterDescriptor<T>, ISourceFilter> sourceSelector) =>
92+
Assign(a => a.Source = sourceSelector?.Invoke(new SourceFilterDescriptor<T>()));
93+
94+
public TopLevelInnerHit<T> ScriptFields(Func<ScriptFieldsDescriptor, IPromise<IScriptFields>> selector) =>
95+
Assign(a => a.ScriptFields = selector?.Invoke(new ScriptFieldsDescriptor())?.Value);
96+
}
97+
}
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using Newtonsoft.Json;
6+
7+
namespace Nest
8+
{
9+
[JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter<TopLevelInnerHits, string, ITopLevelInnerHit>))]
10+
public interface ITopLevelInnerHits : IIsADictionary<string, ITopLevelInnerHit> { }
11+
12+
public class TopLevelInnerHits : IsADictionaryBase<string, ITopLevelInnerHit>, ITopLevelInnerHits
13+
{
14+
public TopLevelInnerHits() : base() { }
15+
public TopLevelInnerHits(IDictionary<string, ITopLevelInnerHit> container) : base(container) { }
16+
public TopLevelInnerHits(Dictionary<string, ITopLevelInnerHit> container)
17+
: base(container.Select(kv => kv).ToDictionary(kv => kv.Key, kv => kv.Value))
18+
{ }
19+
20+
public void Add(string name, ITopLevelInnerHit innerHit) => this.BackingDictionary.Add(name, innerHit);
21+
}
22+
23+
public class TopLevelInnerHitsDescriptor<T>
24+
: IsADictionaryDescriptorBase<TopLevelInnerHitsDescriptor<T>, ITopLevelInnerHits, string, ITopLevelInnerHit>
25+
where T : class
26+
{
27+
public TopLevelInnerHitsDescriptor() : base(new TopLevelInnerHits()) { }
28+
29+
public TopLevelInnerHitsDescriptor<T> Type(string name, TypeName type, Func<TopLevelInnerHit<T>, ITopLevelInnerHit> selector = null) =>
30+
Assign(name, selector.InvokeOrDefault(new TopLevelInnerHit<T>().Type(type)));
31+
32+
public TopLevelInnerHitsDescriptor<T> Type<TOther>(string name, Func<TopLevelInnerHit<T>, ITopLevelInnerHit> selector = null) where TOther : class =>
33+
Assign(name, selector.InvokeOrDefault(new TopLevelInnerHit<T>().Type<TOther>()));
34+
35+
public TopLevelInnerHitsDescriptor<T> Path(string name, Field path, Func<TopLevelInnerHit<T>, ITopLevelInnerHit> selector = null) =>
36+
Assign(name, selector.InvokeOrDefault(new TopLevelInnerHit<T>().Path(path)));
37+
38+
public TopLevelInnerHitsDescriptor<T> Path(string name, Expression<Func<T, object>> path, Func<TopLevelInnerHit<T>, ITopLevelInnerHit> selector = null) =>
39+
Assign(name, selector.InvokeOrDefault(new TopLevelInnerHit<T>().Path(path)));
40+
}
41+
}

0 commit comments

Comments
 (0)