/* 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)));
}
}