|
19 | 19 |
|
20 | 20 | using System;
|
21 | 21 | using System.Runtime.Serialization;
|
| 22 | +using System.Text; |
22 | 23 | using System.Text.Json;
|
23 | 24 | using System.Text.Json.Serialization;
|
24 | 25 | using Elastic.Clients.Elasticsearch.Core;
|
@@ -545,6 +546,120 @@ public override void Write(Utf8JsonWriter writer, RangeRelation value, JsonSeria
|
545 | 546 | }
|
546 | 547 | }
|
547 | 548 |
|
| 549 | +[JsonConverter(typeof(SimpleQueryStringFlagsConverter))] |
| 550 | +[Flags] |
| 551 | +public enum SimpleQueryStringFlags |
| 552 | +{ |
| 553 | + [EnumMember(Value = "WHITESPACE")] |
| 554 | + Whitespace = 1 << 0, |
| 555 | + [EnumMember(Value = "SLOP")] |
| 556 | + Slop = 1 << 1, |
| 557 | + [EnumMember(Value = "PREFIX")] |
| 558 | + Prefix = 1 << 2, |
| 559 | + [EnumMember(Value = "PRECEDENCE")] |
| 560 | + Precedence = 1 << 3, |
| 561 | + [EnumMember(Value = "PHRASE")] |
| 562 | + Phrase = 1 << 4, |
| 563 | + [EnumMember(Value = "OR")] |
| 564 | + Or = 1 << 5, |
| 565 | + [EnumMember(Value = "NOT")] |
| 566 | + Not = 1 << 6, |
| 567 | + [EnumMember(Value = "NONE")] |
| 568 | + None = 1 << 7, |
| 569 | + [EnumMember(Value = "NEAR")] |
| 570 | + Near = 1 << 8, |
| 571 | + [EnumMember(Value = "FUZZY")] |
| 572 | + Fuzzy = 1 << 9, |
| 573 | + [EnumMember(Value = "ESCAPE")] |
| 574 | + Escape = 1 << 10, |
| 575 | + [EnumMember(Value = "AND")] |
| 576 | + And = 1 << 11, |
| 577 | + [EnumMember(Value = "ALL")] |
| 578 | + All = 1 << 12 |
| 579 | +} |
| 580 | + |
| 581 | +internal sealed class SimpleQueryStringFlagsConverter : JsonConverter<SimpleQueryStringFlags> |
| 582 | +{ |
| 583 | + public override SimpleQueryStringFlags Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
| 584 | + { |
| 585 | + var s = reader.GetString(); |
| 586 | + if (string.IsNullOrEmpty(s)) |
| 587 | + { |
| 588 | + return default; |
| 589 | + } |
| 590 | + |
| 591 | + var flags = s.Split('|'); |
| 592 | + var result = default(SimpleQueryStringFlags); |
| 593 | + foreach (var flag in flags) |
| 594 | + { |
| 595 | + result |= flag switch |
| 596 | + { |
| 597 | + "WHITESPACE" => SimpleQueryStringFlags.Whitespace, |
| 598 | + "SLOP" => SimpleQueryStringFlags.Slop, |
| 599 | + "PREFIX" => SimpleQueryStringFlags.Prefix, |
| 600 | + "PRECEDENCE" => SimpleQueryStringFlags.Precedence, |
| 601 | + "PHRASE" => SimpleQueryStringFlags.Phrase, |
| 602 | + "OR" => SimpleQueryStringFlags.Or, |
| 603 | + "NOT" => SimpleQueryStringFlags.Not, |
| 604 | + "NONE" => SimpleQueryStringFlags.None, |
| 605 | + "NEAR" => SimpleQueryStringFlags.Near, |
| 606 | + "FUZZY" => SimpleQueryStringFlags.Fuzzy, |
| 607 | + "ESCAPE" => SimpleQueryStringFlags.Escape, |
| 608 | + "AND" => SimpleQueryStringFlags.And, |
| 609 | + "ALL" => SimpleQueryStringFlags.All, |
| 610 | + _ => throw new JsonException($"Invalid flag value '{flag}' for type '{typeToConvert.Name}'.") |
| 611 | + }; |
| 612 | + } |
| 613 | + |
| 614 | + return result; |
| 615 | + } |
| 616 | + |
| 617 | + public override void Write(Utf8JsonWriter writer, SimpleQueryStringFlags value, JsonSerializerOptions options) |
| 618 | + { |
| 619 | + if (value == default) |
| 620 | + { |
| 621 | + writer.WriteStringValue(string.Empty); |
| 622 | + return; |
| 623 | + } |
| 624 | + |
| 625 | + var sb = new StringBuilder(); |
| 626 | + if (value.HasFlag(SimpleQueryStringFlags.Whitespace)) |
| 627 | + sb.Append("WHITESPACE|"); |
| 628 | + if (value.HasFlag(SimpleQueryStringFlags.Slop)) |
| 629 | + sb.Append("SLOP|"); |
| 630 | + if (value.HasFlag(SimpleQueryStringFlags.Prefix)) |
| 631 | + sb.Append("PREFIX|"); |
| 632 | + if (value.HasFlag(SimpleQueryStringFlags.Precedence)) |
| 633 | + sb.Append("PRECEDENCE|"); |
| 634 | + if (value.HasFlag(SimpleQueryStringFlags.Phrase)) |
| 635 | + sb.Append("PHRASE|"); |
| 636 | + if (value.HasFlag(SimpleQueryStringFlags.Or)) |
| 637 | + sb.Append("OR|"); |
| 638 | + if (value.HasFlag(SimpleQueryStringFlags.Not)) |
| 639 | + sb.Append("NOT|"); |
| 640 | + if (value.HasFlag(SimpleQueryStringFlags.None)) |
| 641 | + sb.Append("NONE|"); |
| 642 | + if (value.HasFlag(SimpleQueryStringFlags.Near)) |
| 643 | + sb.Append("NEAR|"); |
| 644 | + if (value.HasFlag(SimpleQueryStringFlags.Fuzzy)) |
| 645 | + sb.Append("FUZZY|"); |
| 646 | + if (value.HasFlag(SimpleQueryStringFlags.Escape)) |
| 647 | + sb.Append("ESCAPE|"); |
| 648 | + if (value.HasFlag(SimpleQueryStringFlags.And)) |
| 649 | + sb.Append("AND|"); |
| 650 | + if (value.HasFlag(SimpleQueryStringFlags.All)) |
| 651 | + sb.Append("ALL|"); |
| 652 | + if (sb.Length == 0) |
| 653 | + { |
| 654 | + writer.WriteStringValue(string.Empty); |
| 655 | + return; |
| 656 | + } |
| 657 | + |
| 658 | + sb.Remove(sb.Length - 1, 1); |
| 659 | + writer.WriteStringValue(sb.ToString()); |
| 660 | + } |
| 661 | +} |
| 662 | + |
548 | 663 | [JsonConverter(typeof(TextQueryTypeConverter))]
|
549 | 664 | public enum TextQueryType
|
550 | 665 | {
|
|
0 commit comments