Skip to content

Commit cc2316a

Browse files
committed
Merge branch 'develop' of github.com:elasticsearch/elasticsearch-net into develop
2 parents 4cfc3fe + 0586087 commit cc2316a

File tree

14 files changed

+277
-19
lines changed

14 files changed

+277
-19
lines changed

src/Nest/DSL/Query/QueryDescriptor.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ private QueryDescriptor<T> New(IQuery query, Action<IQueryContainer> fillPropert
5757

5858
if (fillProperty != null)
5959
fillProperty(q);
60+
6061
return q;
6162
}
6263

@@ -463,6 +464,14 @@ public QueryContainer Filtered(Action<FilteredQueryDescriptor<T>> selector)
463464
var query = new FilteredQueryDescriptor<T>();
464465
selector(query);
465466

467+
var filtered = query as IFilteredQuery;
468+
469+
if (filtered.Query != null && filtered.Query.IsConditionless)
470+
filtered.Query = null;
471+
472+
if (filtered.Filter != null && filtered.Filter.IsConditionless)
473+
filtered.Filter = null;
474+
466475
return this.New(query, q => q.Filtered = query);
467476
}
468477

src/Nest/DSL/SearchDescriptor.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ public interface ISearchRequest : IQueryPath<SearchRequestParameters>
8282
string Preference { get; }
8383

8484
string Routing { get; }
85-
85+
8686
SearchType? SearchType { get; }
87-
87+
88+
bool? IgnoreUnavalable { get; }
89+
8890
Func<dynamic, Hit<dynamic>, Type> TypeSelector { get; set;}
8991

9092
SearchRequestParameters QueryString { get; set; }
@@ -172,6 +174,12 @@ string ISearchRequest.Routing
172174
: string.Join(",", routing);
173175
}
174176
}
177+
178+
bool? ISearchRequest.IgnoreUnavalable
179+
{
180+
get { return this.QueryString == null ? null : this.QueryString.GetQueryStringValue<bool?>("ignore_unavailable"); }
181+
}
182+
175183
public Func<dynamic, Hit<dynamic>, Type> TypeSelector { get; set; }
176184

177185
public SearchRequestParameters QueryString { get; set; }
@@ -233,6 +241,12 @@ string ISearchRequest.Routing
233241
: string.Join(",", routing);
234242
}
235243
}
244+
245+
bool? ISearchRequest.IgnoreUnavalable
246+
{
247+
get { return this.QueryString == null ? null : this.QueryString.GetQueryStringValue<bool?>("ignore_unavailable"); }
248+
}
249+
236250
public Func<dynamic, Hit<dynamic>, Type> TypeSelector { get; set; }
237251
public SearchRequestParameters QueryString { get; set; }
238252
}
@@ -273,6 +287,11 @@ string ISearchRequest.Routing
273287
}
274288
}
275289

290+
bool? ISearchRequest.IgnoreUnavalable
291+
{
292+
get { return this.Request.RequestParameters.GetQueryStringValue<bool?>("ignore_unavailable"); }
293+
}
294+
276295
Type ISearchRequest.ClrType { get { return typeof(T); } }
277296

278297
/// <summary>
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace Nest
8+
{
9+
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
10+
public interface IPhraseSuggestCollate
11+
{
12+
[JsonProperty(PropertyName = "query")]
13+
IQueryContainer Query { get; set; }
14+
15+
[JsonProperty(PropertyName = "filter")]
16+
IFilterContainer Filter { get; set; }
17+
18+
[JsonProperty(PropertyName = "params")]
19+
IDictionary<string, object> Params { get; set; }
20+
21+
[JsonProperty(PropertyName = "preference")]
22+
string Preference { get; set; }
23+
}
24+
25+
public class PhraseSuggestCollate : IPhraseSuggestCollate
26+
{
27+
public IQueryContainer Query { get; set; }
28+
29+
public IFilterContainer Filter { get; set; }
30+
31+
public IDictionary<string, object> Params { get; set; }
32+
33+
public string Preference { get; set; }
34+
}
35+
36+
public class PhraseSuggestCollateDescriptor<T> : IPhraseSuggestCollate
37+
where T : class
38+
{
39+
internal IPhraseSuggestCollate Collate = new PhraseSuggestCollate();
40+
41+
IQueryContainer IPhraseSuggestCollate.Query { get; set; }
42+
43+
IFilterContainer IPhraseSuggestCollate.Filter { get; set; }
44+
45+
IDictionary<string, object> IPhraseSuggestCollate.Params { get; set; }
46+
47+
string IPhraseSuggestCollate.Preference { get; set; }
48+
49+
public PhraseSuggestCollateDescriptor<T> Query(Func<QueryDescriptor<T>, QueryContainer> query)
50+
{
51+
this.Collate.Query = query(new QueryDescriptor<T>());
52+
return this;
53+
}
54+
55+
public PhraseSuggestCollateDescriptor<T> Filter(Func<FilterDescriptor<T>, FilterContainer> filter)
56+
{
57+
this.Collate.Filter = filter(new FilterDescriptor<T>());
58+
return this;
59+
}
60+
61+
public PhraseSuggestCollateDescriptor<T> Params(IDictionary<string, object> paramsDictionary)
62+
{
63+
this.Collate.Params = paramsDictionary;
64+
return this;
65+
}
66+
67+
public PhraseSuggestCollateDescriptor<T> Params(Func<FluentDictionary<string, object>, FluentDictionary<string, object>> paramsDictionary)
68+
{
69+
this.Collate.Params = paramsDictionary(new FluentDictionary<string, object>());
70+
return this;
71+
}
72+
73+
public PhraseSuggestCollateDescriptor<T> Preference(string preference)
74+
{
75+
this.Collate.Preference = preference;
76+
return this;
77+
}
78+
}
79+
80+
}

src/Nest/DSL/Suggest/PhraseSuggestDescriptor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public interface IPhraseSuggester : ISuggester
2828

2929
[JsonProperty(PropertyName = "direct_generator")]
3030
IEnumerable<IDirectGenerator> DirectGenerator { get; set; }
31+
32+
[JsonProperty("collate")]
33+
IPhraseSuggestCollate Collate { get; set; }
3134
}
3235

3336
public class PhraseSuggester : Suggester, IPhraseSuggester
@@ -38,6 +41,8 @@ public class PhraseSuggester : Suggester, IPhraseSuggester
3841
public decimal? MaxErrors { get; set; }
3942
public char? Separator { get; set; }
4043
public IEnumerable<IDirectGenerator> DirectGenerator { get; set; }
44+
45+
public IPhraseSuggestCollate Collate { get; set; }
4146
}
4247

4348
public class PhraseSuggestDescriptor<T> : BaseSuggestDescriptor<T>, IPhraseSuggester where T : class
@@ -56,6 +61,8 @@ public class PhraseSuggestDescriptor<T> : BaseSuggestDescriptor<T>, IPhraseSugge
5661

5762
IEnumerable<IDirectGenerator> IPhraseSuggester.DirectGenerator { get; set; }
5863

64+
IPhraseSuggestCollate IPhraseSuggester.Collate { get; set; }
65+
5966
public PhraseSuggestDescriptor<T> Text(string text)
6067
{
6168
Self.Text = text;
@@ -121,5 +128,12 @@ public PhraseSuggestDescriptor<T> DirectGenerator(params Func<DirectGeneratorDes
121128
Self.DirectGenerator = generators.Select(g => g(new DirectGeneratorDescriptor<T>())).ToList();
122129
return this;
123130
}
131+
132+
public PhraseSuggestDescriptor<T> Collate(Func<PhraseSuggestCollateDescriptor<T>, PhraseSuggestCollateDescriptor<T>> collateDescriptor)
133+
{
134+
var selector = collateDescriptor(new PhraseSuggestCollateDescriptor<T>());
135+
Self.Collate = selector.Collate;
136+
return this;
137+
}
124138
}
125139
}

src/Nest/ExposedInternals/NestSerializer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ public string SerializeMultiSearch(IMultiSearchRequest multiSearchRequest)
288288
type = path.Type,
289289
search_type = this.GetSearchType(operation, multiSearchRequest),
290290
preference = operation.Preference,
291-
routing = operation.Routing
291+
routing = operation.Routing,
292+
ignore_unavailable = operation.IgnoreUnavalable
292293
};
293294
var opJson = this.Serialize(op, SerializationFormatting.None).Utf8String();
294295

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@
238238
<Compile Include="DSL\Paths\RepositorySnapshotOptionalPathDescriptor.cs" />
239239
<Compile Include="DSL\SnapshotStatusDescriptor.cs" />
240240
<Compile Include="DSL\RecoveryStatusDescriptor.cs" />
241+
<Compile Include="DSL\Suggest\PhraseSuggestCollateDescriptor.cs" />
241242
<Compile Include="DSL\TemplateExistsDescriptor.cs" />
242243
<Compile Include="Domain\Responses\PingResponse.cs" />
243244
<Compile Include="Domain\Responses\NodesShutdownResponse.cs" />

src/Tests/Nest.Tests.Integration/Core/MultiSearch/MultiSearchTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public void MultipleComplexSearches()
5858
{
5959
var result = this.Client.MultiSearch(b => b
6060
.Search<ElasticsearchProject>(s => s
61+
.IgnoreUnavailable()
6162
.Query(q=>q.Term(p=>p.Name, "NEST"))
6263
.Filter(f => f.Term(p => p.Name, "NEST"))
6364
.FacetTerm(tf=>tf.OnField(p=>p.Name).Global())

src/Tests/Nest.Tests.Integration/Nest.Tests.Integration.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@
180180
<Compile Include="Search\Filter\PrefixFilterTests.cs" />
181181
<Compile Include="Search\Filter\RangeFilterTests.cs" />
182182
<Compile Include="Search\Query\BoolQueryResults.cs" />
183+
<Compile Include="Search\Query\FilteredQueryTests.cs" />
183184
<Compile Include="Search\Query\SpanQueryTests.cs" />
184185
<Compile Include="Search\Query\TermToString.cs" />
185186
<Compile Include="Core\UpdateTests.cs" />
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using Nest.Tests.MockData.Domain;
2+
using NUnit.Framework;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using FluentAssertions;
9+
10+
namespace Nest.Tests.Integration.Search.Query
11+
{
12+
[TestFixture]
13+
public class FilteredQueryTests : IntegrationTests
14+
{
15+
[Test]
16+
public void QueryIsConditionless()
17+
{
18+
var response = this.Client.Search<ElasticsearchProject>(s => s
19+
.Query(q => q
20+
.Filtered(ff => ff
21+
.Query(qq => qq
22+
.Match(m => m
23+
.OnField(p => p.Name)
24+
.Query(null)
25+
)
26+
)
27+
.Filter(f => f
28+
.Term(p => p.Id, 1)
29+
)
30+
)
31+
)
32+
);
33+
34+
response.IsValid.Should().BeTrue();
35+
response.Total.ShouldBeEquivalentTo(1);
36+
}
37+
38+
[Test]
39+
public void FilterIsConditionless()
40+
{
41+
var response = this.Client.Search<ElasticsearchProject>(s => s
42+
.Query(q => q
43+
.Filtered(ff => ff
44+
.Query(qq => qq
45+
.Match(m => m
46+
.OnField(p => p.Name)
47+
.Query("elasticsearch")
48+
)
49+
)
50+
.Filter(f => f
51+
.Term(p => p.Id, null)
52+
)
53+
)
54+
)
55+
);
56+
57+
response.IsValid.Should().BeTrue();
58+
response.Total.Should().BeGreaterThan(1);
59+
}
60+
61+
[Test]
62+
public void QueryAndFilterAreConditionless()
63+
{
64+
var response = this.Client.Search<ElasticsearchProject>(s => s
65+
.Query(q => q
66+
.Filtered(ff => ff
67+
.Query(qq => qq
68+
.Match(m => m
69+
.OnField(p => p.Name)
70+
.Query(null)
71+
)
72+
)
73+
.Filter(f => f
74+
.Term(p => p.Id, null)
75+
)
76+
)
77+
)
78+
);
79+
80+
response.IsValid.Should().BeTrue();
81+
response.Total.Should().BeGreaterThan(10);
82+
}
83+
}
84+
}

src/Tests/Nest.Tests.Unit/Core/MultiSearch/MultiSearchRespectsSearchTypePreferenceAndRouting.json

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)