diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/DateRangeQuery.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/DateRangeQuery.g.cs index ec4cc81ae68..ec97bb0b44c 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/DateRangeQuery.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/DateRangeQuery.g.cs @@ -24,7 +24,165 @@ #nullable restore namespace Elastic.Clients.Elasticsearch.QueryDsl { - public partial class DateRangeQuery : RangeQueryBase + internal sealed class DateRangeQueryConverter : FieldNameQueryConverterBase + { + internal override DateRangeQuery ReadInternal(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + throw new JsonException("Unexpected JSON detected."); + var variant = new DateRangeQuery(); + while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + var property = reader.GetString(); + if (property == "format") + { + variant.Format = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "from") + { + variant.From = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "gt") + { + variant.Gt = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "gte") + { + variant.Gte = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "lt") + { + variant.Lt = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "lte") + { + variant.Lte = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "time_zone") + { + variant.TimeZone = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "to") + { + variant.To = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "relation") + { + variant.Relation = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "_name") + { + variant.QueryName = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "boost") + { + variant.Boost = JsonSerializer.Deserialize(ref reader, options); + continue; + } + } + } + + reader.Read(); + return variant; + } + + internal override void WriteInternal(Utf8JsonWriter writer, DateRangeQuery value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + if (value.Format is not null) + { + writer.WritePropertyName("format"); + JsonSerializer.Serialize(writer, value.Format, options); + } + + if (value.From is not null) + { + writer.WritePropertyName("from"); + JsonSerializer.Serialize(writer, value.From, options); + } + + if (value.Gt is not null) + { + writer.WritePropertyName("gt"); + JsonSerializer.Serialize(writer, value.Gt, options); + } + + if (value.Gte is not null) + { + writer.WritePropertyName("gte"); + JsonSerializer.Serialize(writer, value.Gte, options); + } + + if (value.Lt is not null) + { + writer.WritePropertyName("lt"); + JsonSerializer.Serialize(writer, value.Lt, options); + } + + if (value.Lte is not null) + { + writer.WritePropertyName("lte"); + JsonSerializer.Serialize(writer, value.Lte, options); + } + + if (value.TimeZone is not null) + { + writer.WritePropertyName("time_zone"); + JsonSerializer.Serialize(writer, value.TimeZone, options); + } + + if (value.To is not null) + { + writer.WritePropertyName("to"); + JsonSerializer.Serialize(writer, value.To, options); + } + + if (value.Relation is not null) + { + writer.WritePropertyName("relation"); + JsonSerializer.Serialize(writer, value.Relation, options); + } + + if (!string.IsNullOrEmpty(value.QueryName)) + { + writer.WritePropertyName("_name"); + writer.WriteStringValue(value.QueryName); + } + + if (value.Boost.HasValue) + { + writer.WritePropertyName("boost"); + writer.WriteNumberValue(value.Boost.Value); + } + + writer.WriteEndObject(); + } + } + + [JsonConverter(typeof(DateRangeQueryConverter))] + public partial class DateRangeQuery : FieldNameQueryBase, IQueryVariant { [JsonInclude] [JsonPropertyName("format")] @@ -57,6 +215,195 @@ public partial class DateRangeQuery : RangeQueryBase [JsonInclude] [JsonPropertyName("to")] public Elastic.Clients.Elasticsearch.DateMath? To { get; set; } + + [JsonInclude] + [JsonPropertyName("relation")] + public Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? Relation { get; set; } + } + + public sealed partial class DateRangeQueryDescriptor : SerializableDescriptorBase> + { + internal DateRangeQueryDescriptor(Action> configure) => configure.Invoke(this); + public DateRangeQueryDescriptor() : base() + { + } + + private string? QueryNameValue { get; set; } + + private float? BoostValue { get; set; } + + private Elastic.Clients.Elasticsearch.Field? FieldValue { get; set; } + + private string? FormatValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? FromValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? GtValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? GteValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? LtValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? LteValue { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? RelationValue { get; set; } + + private string? TimeZoneValue { get; set; } + + private Elastic.Clients.Elasticsearch.DateMath? ToValue { get; set; } + + public DateRangeQueryDescriptor QueryName(string? queryName) + { + QueryNameValue = queryName; + return Self; + } + + public DateRangeQueryDescriptor Boost(float? boost) + { + BoostValue = boost; + return Self; + } + + public DateRangeQueryDescriptor Field(Elastic.Clients.Elasticsearch.Field? field) + { + FieldValue = field; + return Self; + } + + public DateRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + + public DateRangeQueryDescriptor Format(string? format) + { + FormatValue = format; + return Self; + } + + public DateRangeQueryDescriptor From(Elastic.Clients.Elasticsearch.DateMath? from) + { + FromValue = from; + return Self; + } + + public DateRangeQueryDescriptor Gt(Elastic.Clients.Elasticsearch.DateMath? gt) + { + GtValue = gt; + return Self; + } + + public DateRangeQueryDescriptor Gte(Elastic.Clients.Elasticsearch.DateMath? gte) + { + GteValue = gte; + return Self; + } + + public DateRangeQueryDescriptor Lt(Elastic.Clients.Elasticsearch.DateMath? lt) + { + LtValue = lt; + return Self; + } + + public DateRangeQueryDescriptor Lte(Elastic.Clients.Elasticsearch.DateMath? lte) + { + LteValue = lte; + return Self; + } + + public DateRangeQueryDescriptor Relation(Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? relation) + { + RelationValue = relation; + return Self; + } + + public DateRangeQueryDescriptor TimeZone(string? timeZone) + { + TimeZoneValue = timeZone; + return Self; + } + + public DateRangeQueryDescriptor To(Elastic.Clients.Elasticsearch.DateMath? to) + { + ToValue = to; + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + writer.WriteStartObject(); + writer.WritePropertyName(settings.Inferrer.Field(FieldValue)); + writer.WriteStartObject(); + if (!string.IsNullOrEmpty(QueryNameValue)) + { + writer.WritePropertyName("_name"); + writer.WriteStringValue(QueryNameValue); + } + + if (BoostValue.HasValue) + { + writer.WritePropertyName("boost"); + writer.WriteNumberValue(BoostValue.Value); + } + + if (FormatValue is not null) + { + writer.WritePropertyName("format"); + JsonSerializer.Serialize(writer, FormatValue, options); + } + + if (FromValue is not null) + { + writer.WritePropertyName("from"); + JsonSerializer.Serialize(writer, FromValue, options); + } + + if (GtValue is not null) + { + writer.WritePropertyName("gt"); + JsonSerializer.Serialize(writer, GtValue, options); + } + + if (GteValue is not null) + { + writer.WritePropertyName("gte"); + JsonSerializer.Serialize(writer, GteValue, options); + } + + if (LtValue is not null) + { + writer.WritePropertyName("lt"); + JsonSerializer.Serialize(writer, LtValue, options); + } + + if (LteValue is not null) + { + writer.WritePropertyName("lte"); + JsonSerializer.Serialize(writer, LteValue, options); + } + + if (RelationValue is not null) + { + writer.WritePropertyName("relation"); + JsonSerializer.Serialize(writer, RelationValue, options); + } + + if (TimeZoneValue is not null) + { + writer.WritePropertyName("time_zone"); + JsonSerializer.Serialize(writer, TimeZoneValue, options); + } + + if (ToValue is not null) + { + writer.WritePropertyName("to"); + JsonSerializer.Serialize(writer, ToValue, options); + } + + writer.WriteEndObject(); + writer.WriteEndObject(); + } } public sealed partial class DateRangeQueryDescriptor : SerializableDescriptorBase @@ -70,6 +417,8 @@ public DateRangeQueryDescriptor() : base() private float? BoostValue { get; set; } + private Elastic.Clients.Elasticsearch.Field? FieldValue { get; set; } + private string? FormatValue { get; set; } private Elastic.Clients.Elasticsearch.DateMath? FromValue { get; set; } @@ -100,6 +449,24 @@ public DateRangeQueryDescriptor Boost(float? boost) return Self; } + public DateRangeQueryDescriptor Field(Elastic.Clients.Elasticsearch.Field? field) + { + FieldValue = field; + return Self; + } + + public DateRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + + public DateRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + public DateRangeQueryDescriptor Format(string? format) { FormatValue = format; @@ -156,6 +523,8 @@ public DateRangeQueryDescriptor To(Elastic.Clients.Elasticsearch.DateMath? to) protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) { + writer.WriteStartObject(); + writer.WritePropertyName(settings.Inferrer.Field(FieldValue)); writer.WriteStartObject(); if (!string.IsNullOrEmpty(QueryNameValue)) { @@ -224,6 +593,7 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o } writer.WriteEndObject(); + writer.WriteEndObject(); } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/NumberRangeQuery.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/NumberRangeQuery.g.cs index 4dd9f53d7bd..fa839047fdf 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/NumberRangeQuery.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/QueryDsl/NumberRangeQuery.g.cs @@ -24,7 +24,141 @@ #nullable restore namespace Elastic.Clients.Elasticsearch.QueryDsl { - public partial class NumberRangeQuery : RangeQueryBase + internal sealed class NumberRangeQueryConverter : FieldNameQueryConverterBase + { + internal override NumberRangeQuery ReadInternal(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + throw new JsonException("Unexpected JSON detected."); + var variant = new NumberRangeQuery(); + while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + var property = reader.GetString(); + if (property == "from") + { + variant.From = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "gt") + { + variant.Gt = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "gte") + { + variant.Gte = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "lt") + { + variant.Lt = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "lte") + { + variant.Lte = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "to") + { + variant.To = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "relation") + { + variant.Relation = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "_name") + { + variant.QueryName = JsonSerializer.Deserialize(ref reader, options); + continue; + } + + if (property == "boost") + { + variant.Boost = JsonSerializer.Deserialize(ref reader, options); + continue; + } + } + } + + reader.Read(); + return variant; + } + + internal override void WriteInternal(Utf8JsonWriter writer, NumberRangeQuery value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + if (value.From.HasValue) + { + writer.WritePropertyName("from"); + writer.WriteNumberValue(value.From.Value); + } + + if (value.Gt.HasValue) + { + writer.WritePropertyName("gt"); + writer.WriteNumberValue(value.Gt.Value); + } + + if (value.Gte.HasValue) + { + writer.WritePropertyName("gte"); + writer.WriteNumberValue(value.Gte.Value); + } + + if (value.Lt.HasValue) + { + writer.WritePropertyName("lt"); + writer.WriteNumberValue(value.Lt.Value); + } + + if (value.Lte.HasValue) + { + writer.WritePropertyName("lte"); + writer.WriteNumberValue(value.Lte.Value); + } + + if (value.To.HasValue) + { + writer.WritePropertyName("to"); + writer.WriteNumberValue(value.To.Value); + } + + if (value.Relation is not null) + { + writer.WritePropertyName("relation"); + JsonSerializer.Serialize(writer, value.Relation, options); + } + + if (!string.IsNullOrEmpty(value.QueryName)) + { + writer.WritePropertyName("_name"); + writer.WriteStringValue(value.QueryName); + } + + if (value.Boost.HasValue) + { + writer.WritePropertyName("boost"); + writer.WriteNumberValue(value.Boost.Value); + } + + writer.WriteEndObject(); + } + } + + [JsonConverter(typeof(NumberRangeQueryConverter))] + public partial class NumberRangeQuery : FieldNameQueryBase, IQueryVariant { [JsonInclude] [JsonPropertyName("from")] @@ -49,6 +183,167 @@ public partial class NumberRangeQuery : RangeQueryBase [JsonInclude] [JsonPropertyName("to")] public double? To { get; set; } + + [JsonInclude] + [JsonPropertyName("relation")] + public Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? Relation { get; set; } + } + + public sealed partial class NumberRangeQueryDescriptor : SerializableDescriptorBase> + { + internal NumberRangeQueryDescriptor(Action> configure) => configure.Invoke(this); + public NumberRangeQueryDescriptor() : base() + { + } + + private string? QueryNameValue { get; set; } + + private float? BoostValue { get; set; } + + private Elastic.Clients.Elasticsearch.Field? FieldValue { get; set; } + + private double? FromValue { get; set; } + + private double? GtValue { get; set; } + + private double? GteValue { get; set; } + + private double? LtValue { get; set; } + + private double? LteValue { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? RelationValue { get; set; } + + private double? ToValue { get; set; } + + public NumberRangeQueryDescriptor QueryName(string? queryName) + { + QueryNameValue = queryName; + return Self; + } + + public NumberRangeQueryDescriptor Boost(float? boost) + { + BoostValue = boost; + return Self; + } + + public NumberRangeQueryDescriptor Field(Elastic.Clients.Elasticsearch.Field? field) + { + FieldValue = field; + return Self; + } + + public NumberRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + + public NumberRangeQueryDescriptor From(double? from) + { + FromValue = from; + return Self; + } + + public NumberRangeQueryDescriptor Gt(double? gt) + { + GtValue = gt; + return Self; + } + + public NumberRangeQueryDescriptor Gte(double? gte) + { + GteValue = gte; + return Self; + } + + public NumberRangeQueryDescriptor Lt(double? lt) + { + LtValue = lt; + return Self; + } + + public NumberRangeQueryDescriptor Lte(double? lte) + { + LteValue = lte; + return Self; + } + + public NumberRangeQueryDescriptor Relation(Elastic.Clients.Elasticsearch.QueryDsl.RangeRelation? relation) + { + RelationValue = relation; + return Self; + } + + public NumberRangeQueryDescriptor To(double? to) + { + ToValue = to; + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + writer.WriteStartObject(); + writer.WritePropertyName(settings.Inferrer.Field(FieldValue)); + writer.WriteStartObject(); + if (!string.IsNullOrEmpty(QueryNameValue)) + { + writer.WritePropertyName("_name"); + writer.WriteStringValue(QueryNameValue); + } + + if (BoostValue.HasValue) + { + writer.WritePropertyName("boost"); + writer.WriteNumberValue(BoostValue.Value); + } + + if (FromValue.HasValue) + { + writer.WritePropertyName("from"); + writer.WriteNumberValue(FromValue.Value); + } + + if (GtValue.HasValue) + { + writer.WritePropertyName("gt"); + writer.WriteNumberValue(GtValue.Value); + } + + if (GteValue.HasValue) + { + writer.WritePropertyName("gte"); + writer.WriteNumberValue(GteValue.Value); + } + + if (LtValue.HasValue) + { + writer.WritePropertyName("lt"); + writer.WriteNumberValue(LtValue.Value); + } + + if (LteValue.HasValue) + { + writer.WritePropertyName("lte"); + writer.WriteNumberValue(LteValue.Value); + } + + if (RelationValue is not null) + { + writer.WritePropertyName("relation"); + JsonSerializer.Serialize(writer, RelationValue, options); + } + + if (ToValue.HasValue) + { + writer.WritePropertyName("to"); + writer.WriteNumberValue(ToValue.Value); + } + + writer.WriteEndObject(); + writer.WriteEndObject(); + } } public sealed partial class NumberRangeQueryDescriptor : SerializableDescriptorBase @@ -62,6 +357,8 @@ public NumberRangeQueryDescriptor() : base() private float? BoostValue { get; set; } + private Elastic.Clients.Elasticsearch.Field? FieldValue { get; set; } + private double? FromValue { get; set; } private double? GtValue { get; set; } @@ -88,6 +385,24 @@ public NumberRangeQueryDescriptor Boost(float? boost) return Self; } + public NumberRangeQueryDescriptor Field(Elastic.Clients.Elasticsearch.Field? field) + { + FieldValue = field; + return Self; + } + + public NumberRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + + public NumberRangeQueryDescriptor Field(Expression> field) + { + FieldValue = field; + return Self; + } + public NumberRangeQueryDescriptor From(double? from) { FromValue = from; @@ -132,6 +447,8 @@ public NumberRangeQueryDescriptor To(double? to) protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) { + writer.WriteStartObject(); + writer.WritePropertyName(settings.Inferrer.Field(FieldValue)); writer.WriteStartObject(); if (!string.IsNullOrEmpty(QueryNameValue)) { @@ -188,6 +505,7 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o } writer.WriteEndObject(); + writer.WriteEndObject(); } } } \ No newline at end of file diff --git a/tests/Tests/Serialization/Queries/MultipleSearchFiltersTests.cs b/tests/Tests/Serialization/Queries/MultipleSearchFiltersTests.cs index b4d4a942cdd..971311b0fd5 100644 --- a/tests/Tests/Serialization/Queries/MultipleSearchFiltersTests.cs +++ b/tests/Tests/Serialization/Queries/MultipleSearchFiltersTests.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Elastic.Clients.Elasticsearch.QueryDsl; +using Tests.Domain; using VerifyXunit; namespace Tests.Serialization; @@ -12,7 +13,7 @@ namespace Tests.Serialization; public class MultipleSearchFiltersTests : SerializerTestBase { [U] - public async Task CanSerialize_AvgAggregation_Descriptor() + public async Task CanSerialize_MultipleFilters() { var search = new SearchRequestDescriptor(search => search .Query(q => q @@ -20,7 +21,21 @@ public async Task CanSerialize_AvgAggregation_Descriptor() .Filter( f => f.Term(t => t.Field(f => f.Age).Value(37)), f => f.Term(t => t.Field(f => f.Name).Value("Steve")) - //f => f.Range(new RangeQuery(new DateRangeQuery { Gte = "now-1d/d", Lt = "now/d" })) + )))); + + var serialisedJson = await SerializeAndGetJsonStringAsync(search); + + await Verifier.VerifyJson(serialisedJson); + } + + [U] + public async Task CanSerialize_DateRangeFilter() + { + var search = new SearchRequestDescriptor(search => search + .Query(q => q + .Bool(b => b + .Filter( // TODO - Update once we have fluent unions + f => f.Range(new RangeQuery(new DateRangeQuery { Gte = "now-1d/d", Lt = "now/d", Field = Infer.Field(f => f.LastActivity) })) )))); var serialisedJson = await SerializeAndGetJsonStringAsync(search); diff --git a/tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_DateRangeFilter.verified.txt b/tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_DateRangeFilter.verified.txt new file mode 100644 index 00000000000..eae9e6d9b6d --- /dev/null +++ b/tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_DateRangeFilter.verified.txt @@ -0,0 +1,16 @@ +{ + query: { + bool: { + filter: [ + { + range: { + lastActivity: { + gte: now-1d/d, + lt: now/d + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_AvgAggregation_Descriptor.verified.txt b/tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_MultipleFilters.verified.txt similarity index 100% rename from tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_AvgAggregation_Descriptor.verified.txt rename to tests/Tests/_VerifySnapshots/MultipleSearchFiltersTests.CanSerialize_MultipleFilters.verified.txt