/* SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. */ /* * Modifications Copyright OpenSearch Contributors. See * GitHub history for details. * * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ using System; using System.Collections.Generic; using System.Runtime.Serialization; using OpenSearch.Net.Utf8Json; namespace OpenSearch.Client { /// /// A query that allows fine-grained control over the order and proximity of matching terms. /// Matching rules are constructed from a small set of definitions, and the rules are then applied to terms from a /// particular field. /// The definitions produce sequences of minimal intervals that span terms in a body of text. /// These intervals can be further combined and filtered by parent sources. /// [InterfaceDataContract] [JsonFormatter(typeof(FieldNameQueryFormatter))] public interface IIntervalsQuery : IFieldNameQuery, IIntervalsContainer { } /// public class IntervalsQuery : FieldNameQueryBase, IIntervalsQuery { /// public IIntervalsAllOf AllOf { get; set; } /// public IIntervalsAnyOf AnyOf { get; set; } /// public IIntervalsMatch Match { get; set; } /// public IIntervalsFuzzy Fuzzy { get; set; } /// public IIntervalsPrefix Prefix { get; set; } /// public IIntervalsWildcard Wildcard { get; set; } protected override bool Conditionless => IsConditionless(this); internal static bool IsConditionless(IIntervalsQuery q) => q.Field.IsConditionless() || q.Match == null && q.AllOf == null && q.AnyOf == null && q.Prefix == null && q.Wildcard == null && q.Fuzzy == null; internal override void InternalWrapInContainer(IQueryContainer container) => container.Intervals = this; } /// [DataContract] public class IntervalsQueryDescriptor : FieldNameQueryDescriptorBase, IIntervalsQuery, T> , IIntervalsQuery where T : class { protected override bool Conditionless => IntervalsQuery.IsConditionless(this); IIntervalsAllOf IIntervalsContainer.AllOf { get; set; } IIntervalsAnyOf IIntervalsContainer.AnyOf { get; set; } IIntervalsFuzzy IIntervalsContainer.Fuzzy { get; set; } IIntervalsMatch IIntervalsContainer.Match { get; set; } IIntervalsPrefix IIntervalsContainer.Prefix { get; set; } IIntervalsWildcard IIntervalsContainer.Wildcard { get; set; } /// public IntervalsQueryDescriptor Fuzzy(Func selector) => Assign(selector, (a, v) => a.Fuzzy = v?.Invoke(new IntervalsFuzzyDescriptor())); /// public IntervalsQueryDescriptor Match(Func selector) => Assign(selector, (a, v) => a.Match = v?.Invoke(new IntervalsMatchDescriptor())); /// public IntervalsQueryDescriptor Prefix(Func selector) => Assign(selector, (a, v) => a.Prefix = v?.Invoke(new IntervalsPrefixDescriptor())); /// public IntervalsQueryDescriptor Wildcard(Func selector) => Assign(selector, (a, v) => a.Wildcard = v?.Invoke(new IntervalsWildcardDescriptor())); /// public IntervalsQueryDescriptor AnyOf(Func selector) => Assign(selector, (a, v) => a.AnyOf = v?.Invoke(new IntervalsAnyOfDescriptor())); /// public IntervalsQueryDescriptor AllOf(Func selector) => Assign(selector, (a, v) => a.AllOf = v?.Invoke(new IntervalsAllOfDescriptor())); } /// /// Container for an rule /// public interface IIntervalsContainer { /// [DataMember(Name = "all_of")] IIntervalsAllOf AllOf { get; set; } /// [DataMember(Name = "any_of")] IIntervalsAnyOf AnyOf { get; set; } /// [DataMember(Name = "fuzzy")] IIntervalsFuzzy Fuzzy { get; set; } /// [DataMember(Name = "match")] IIntervalsMatch Match { get; set; } /// [DataMember(Name = "prefix")] IIntervalsPrefix Prefix { get; set; } /// [DataMember(Name = "wildcard")] IIntervalsWildcard Wildcard { get; set; } } /// public class IntervalsContainer : IIntervalsContainer, IDescriptor { public IntervalsContainer() { } public IntervalsContainer(IntervalsBase intervals) { intervals.ThrowIfNull(nameof(intervals)); intervals.WrapInContainer(this); } public IntervalsContainer(IntervalsNoFilterBase intervals) { intervals.ThrowIfNull(nameof(intervals)); intervals.WrapInContainer(this); } IIntervalsAllOf IIntervalsContainer.AllOf { get; set; } IIntervalsAnyOf IIntervalsContainer.AnyOf { get; set; } IIntervalsFuzzy IIntervalsContainer.Fuzzy { get; set; } IIntervalsMatch IIntervalsContainer.Match { get; set; } IIntervalsPrefix IIntervalsContainer.Prefix { get; set; } IIntervalsWildcard IIntervalsContainer.Wildcard { get; set; } public static implicit operator IntervalsContainer(IntervalsBase intervals) => intervals == null ? null : new IntervalsContainer(intervals); public static implicit operator IntervalsContainer(IntervalsNoFilterBase intervals) => intervals == null ? null : new IntervalsContainer(intervals); } /// /// Descriptor to construct an rule /// public class IntervalsDescriptor : IntervalsContainer { private IntervalsDescriptor Assign(TValue value, Action assigner) => Fluent.Assign(this, value, assigner); /// public IntervalsDescriptor Fuzzy(Func selector) => Assign(selector, (a, v) => a.Fuzzy = v?.Invoke(new IntervalsFuzzyDescriptor())); /// public IntervalsDescriptor Match(Func selector) => Assign(selector, (a, v) => a.Match = v?.Invoke(new IntervalsMatchDescriptor())); /// public IntervalsDescriptor Prefix(Func selector) => Assign(selector, (a, v) => a.Prefix = v?.Invoke(new IntervalsPrefixDescriptor())); /// public IntervalsDescriptor Wildcard(Func selector) => Assign(selector, (a, v) => a.Wildcard = v?.Invoke(new IntervalsWildcardDescriptor())); /// public IntervalsDescriptor AnyOf(Func selector) => Assign(selector, (a, v) => a.AnyOf = v?.Invoke(new IntervalsAnyOfDescriptor())); /// public IntervalsDescriptor AllOf(Func selector) => Assign(selector, (a, v) => a.AllOf = v?.Invoke(new IntervalsAllOfDescriptor())); } /// /// An rule with an optional filter /// public interface IIntervals { /// /// An optional interval filter /// [DataMember(Name = "filter")] IIntervalsFilter Filter { get; set; } } /// /// An rule /// public interface IIntervalsNoFilter { } /// /// Base type for an implementation /// public abstract class IntervalsBase : IIntervals { /// public IIntervalsFilter Filter { get; set; } internal abstract void WrapInContainer(IIntervalsContainer container); } /// /// Base type for an implementation /// public abstract class IntervalsNoFilterBase : IIntervalsNoFilter { internal abstract void WrapInContainer(IIntervalsContainer container); } /// /// Base type for descriptors that define /// public abstract class IntervalsDescriptorBase : DescriptorBase, IIntervals where TDescriptor : DescriptorBase, TInterface where TInterface : class, IIntervals { IIntervalsFilter IIntervals.Filter { get; set; } /// public TDescriptor Filter(Func selector) => Assign(selector, (a, v) => a.Filter = v?.Invoke(new IntervalsFilterDescriptor())); } /// /// Constructs a collection of /// public class IntervalsListDescriptor : DescriptorPromiseBase> { public IntervalsListDescriptor() : base(new List()) { } /// public IntervalsListDescriptor Fuzzy(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().Fuzzy(v))); /// public IntervalsListDescriptor Match(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().Match(v))); /// public IntervalsListDescriptor Prefix(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().Prefix(v))); /// public IntervalsListDescriptor Wildcard(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().Wildcard(v))); /// public IntervalsListDescriptor AnyOf(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().AnyOf(v))); /// public IntervalsListDescriptor AllOf(Func selector) => Assign(selector, (a, v) => a.AddIfNotNull(new IntervalsDescriptor().AllOf(v))); } }