/* 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; using OpenSearch.Net.Utf8Json; namespace OpenSearch.Client { /// /// A script to execute to provide custom computation /// [InterfaceDataContract] [JsonFormatter(typeof(ScriptFormatter))] public interface IScript { /// /// Language of script. /// /// language /// this [DataMember(Name = "lang")] string Lang { get; set; } /// /// Scripts are compiled and cached for faster execution. /// If the same script can be used, just with different parameters provided, /// it is preferable to use the ability to pass parameters to the script itself. /// /// /// script: "doc['num1'].value > param1" /// param: "param1" = 5 /// /// param /// this [DataMember(Name = "params")] [JsonFormatter(typeof(VerbatimDictionaryKeysPreservingNullFormatter))] Dictionary Params { get; set; } } /// public abstract class ScriptBase : IScript { /// public string Lang { get; set; } /// public Dictionary Params { get; set; } /// /// Implicit conversion from to /// public static implicit operator ScriptBase(string script) => new InlineScript(script); } /// public abstract class ScriptDescriptorBase : DescriptorBase, IScript where TDescriptor : ScriptDescriptorBase, TInterface, IScript where TInterface : class, IScript { string IScript.Lang { get; set; } Dictionary IScript.Params { get; set; } /// public TDescriptor Params(Dictionary scriptParams) => Assign(scriptParams, (a, v) => a.Params = v); /// public TDescriptor Params(Func, FluentDictionary> paramsDictionary) => Assign(paramsDictionary, (a, v) => a.Params = v?.Invoke(new FluentDictionary())); /// public TDescriptor Lang(string lang) => Assign(lang, (a, v) => a.Lang = v); /// public TDescriptor Lang(ScriptLang lang) => Assign(lang.GetStringValue(), (a, v) => a.Lang = v); } /// public class ScriptDescriptor : DescriptorBase { /// /// A script that has been indexed in OpenSearch with the specified id /// public IndexedScriptDescriptor Id(string id) => new IndexedScriptDescriptor(id); /// /// An inline script to execute /// public InlineScriptDescriptor Source(string script) => new InlineScriptDescriptor(script); } }