版本: Unity 6 (6000.0)
语言英语
  • C#

QueryEngine<T0>

UnityEditor.Search 中的类

建议更改

成功!

感谢您帮助我们改进 Unity 文档的质量。尽管我们无法接受所有提交内容,但我们会阅读用户提出的每项建议并进行必要的更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们改进 Unity 文档的质量。

关闭

取消

描述

QueryEngine 定义了如何从输入字符串构建查询。它可以自定义以支持自定义过滤器和运算符。

<TData>: 过滤的数据类型。

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class Example_QueryEngine
{
    static List<MyObjectType> s_Data;

    static QueryEngine<MyObjectType> SetupQueryEngine()
    {
        // Set up the query engine
        var queryEngine = new QueryEngine<MyObjectType>();

        // Add a filter for MyObjectType.id that supports all operators
        queryEngine.AddFilter("id", myObj => myObj.id);
        // Add a filter for MyObjectType.name that supports only contains (:), equal (=) and not equal (!=)
        queryEngine.AddFilter("n", myObj => myObj.name, new[] { ":", "=", "!=" });
        // Add a filter for MyObjectType.active that supports only equal and not equal
        queryEngine.AddFilter("a", myObj => myObj.active, new[] { "=", "!=" });
        // Add a filter for the computed property magnitude that supports equal, not equal, lesser, greater, lesser or equal and greater or equal.
        queryEngine.AddFilter("m", myObj => myObj.position.magnitude, new[] { "=", "!=", "<", ">", "<=", ">=" });

        // Set up what data from objects of type MyObjectType will be matched against search words
        queryEngine.SetSearchDataCallback(myObj => new[] { myObj.id.ToString(), myObj.name });

        return queryEngine;
    }

    [MenuItem("Examples/QueryEngine/Class")]
    public static void RunExample()
    {
        s_Data = GenerateExampleData();
        var queryEngine = SetupQueryEngine();
        TestFiltering(queryEngine, s_Data);
    }

    static void TestFiltering(QueryEngine<MyObjectType> queryEngine, IEnumerable<MyObjectType> inputData)
    {
        // Find objects that have an id > 2 and are active
        var filteredData = FilterData("id>2 a=true", queryEngine, inputData);
        ValidateData(filteredData, s_Data.Where(myObj => myObj.id > 2 && myObj.active));

        // Find objects that are not active and have a name that contains Test
        filteredData = FilterData("a=false n:Test", queryEngine, inputData);
        ValidateData(filteredData, s_Data.Where(myObj => myObj.name.Contains("Test") && !myObj.active));

        // Find objects that have a magnitude higher than 1 or the id 0.
        filteredData = FilterData("m>1 or id=0", queryEngine, inputData);
        ValidateData(filteredData, s_Data.Where(myObj => myObj.position.magnitude > 1f || myObj.id == 0));
    }

    static IEnumerable<MyObjectType> FilterData(string inputQuery, QueryEngine<MyObjectType> queryEngine, IEnumerable<MyObjectType> inputData)
    {
        // Parse the query string into a query operation
        var query = queryEngine.ParseQuery(inputQuery);

        // If the query is not valid, print all errors and return an empty data set
        if (!query.valid)
        {
            foreach (var queryError in query.errors)
            {
                Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"Error parsing input at {queryError.index}: {queryError.reason}");
            }

            return new List<MyObjectType>();
        }

        // Apply the query on a data set and get the filtered result.
        var filteredData = query.Apply(inputData);
        return filteredData;
    }

    static void ValidateData(IEnumerable<MyObjectType> filteredData, IEnumerable<MyObjectType> expectedData)
    {
        var filteredDataArray = filteredData.ToArray();
        var expectedDataArray = expectedData.ToArray();
        Debug.Assert(filteredDataArray.Length == expectedDataArray.Length, $"Filtered data should have {expectedDataArray.Length} elements.");
        if (filteredDataArray.Length != expectedDataArray.Length)
            return;

        for (var i = 0; i < expectedDataArray.Length; i++)
        {
            Debug.Assert(filteredDataArray[i] == expectedDataArray[i], $"{filteredDataArray[i]} should be equal to {expectedDataArray[i]}");
        }
    }

    static List<MyObjectType> GenerateExampleData()
    {
        var data = new List<MyObjectType>()
        {
            new MyObjectType { id = 0, name = "Test 1", position = new Vector2(0, 0), active = false },
            new MyObjectType { id = 1, name = "Test 2", position = new Vector2(0, 1), active = true },
            new MyObjectType { id = 2, name = "Test 3", position = new Vector2(1, 0), active = false },
            new MyObjectType { id = 3, name = "Test 4", position = new Vector2(1, 1), active = true },
            new MyObjectType { id = 4, name = "Test 5", position = new Vector2(2, 0), active = false },
            new MyObjectType { id = 5, name = "Test 6", position = new Vector2(0, 2), active = true }
        };

        return data;
    }

    /// <summary>
    /// Custom type. This is the type of objects that will be searched by the QueryEngine.
    /// </summary>
    class MyObjectType
    {
        public int id { get; set; }
        public string name { get; set; }
        public Vector2 position { get; set; }
        public bool active { get; set; }

        public MyObjectType()
        {
            id = 0;
            name = "";
            position = Vector2.zero;
            active = false;
        }

        public override string ToString()
        {
            return $"({id}, {name}, ({position.x}, {position.y}), {active})";
        }
    }
}

属性

globalStringComparison用于词语匹配和过滤器处理的全局字符串比较选项(如果未被覆盖)。
searchDataCallback用于获取与搜索词匹配的数据的回调函数。
searchDataOverridesStringComparison指示词语/短语匹配是否使用 searchDataStringComparison。
searchDataStringComparison用于词语/短语匹配的字符串比较选项。
searchWordMatcher用于将搜索数据与搜索词匹配的函数。
skipIncompleteFilters布尔值。指示是否应跳过不完整的过滤器。如果为真,则跳过过滤器。如果为假,并且 validateFilters 为真,则不完整的过滤器在解析时将生成错误。
skipUnknownFilters布尔值。指示是否应跳过未知过滤器。如果为真,则跳过未知过滤器。如果为假,并且 validateFilters 为真,则如果未提供默认过滤器处理程序,未知过滤器将生成错误。
validateFilters获取或设置引擎在解析查询时是否必须验证过滤器。默认为 true。

构造函数

QueryEngine_1构造一个新的 QueryEngine。

公共方法

AddFilter添加一个新的自定义过滤器。
AddFiltersFromAttribute添加所有使用方法属性 TFilterAttribute 标识的自定义过滤器。
AddNestedQueryAggregator添加一个新的嵌套查询聚合器。聚合器是一种操作,可以应用于嵌套查询,以根据特定标准汇总嵌套查询的结果。
AddOperator添加一个自定义过滤器运算符。
AddOperatorHandler添加一个自定义过滤器运算符处理程序。
AddTypeParser添加一个类型解析器,它解析字符串并返回自定义类型。由自定义运算符处理程序使用(请参阅 AddOperatorHandler)。
ClearFilters删除 QueryEngine 上添加的所有过滤器。
GetAllFilters获取此 QueryEngine 上添加的所有过滤器。
GetOperator获取 QueryEngine 上添加的自定义运算符。
ParseQuery将查询字符串解析为 ParsedQuery 操作。然后可以使用此 ParsedQuery 操作来过滤任何类型为 TData 的数据集。
RemoveFilter删除自定义过滤器。
RemoveOperator删除 QueryEngine 上添加的自定义运算符。
SetDefaultFilter设置未注册过滤器的默认过滤器处理程序。
SetDefaultParamFilter设置未注册的函数过滤器的默认过滤器处理程序。
SetFilterNestedQueryTransformer设置过滤器的嵌套查询转换器函数。此函数接收嵌套查询的结果,并提取与过滤器进行比较所需的数据。
SetGlobalStringComparisonOptions设置全局字符串比较选项。用于词语匹配和过滤器处理(除非过滤器覆盖)。
SetNestedQueryHandler设置处理嵌套查询的函数。只能设置一个处理程序。
SetSearchDataCallback设置用于获取与搜索词匹配的数据的回调函数。
SetSearchWordMatcher设置要使用的搜索词匹配函数,以代替默认函数。设置为 null 以使用默认值。
TryGetFilter通过其标记获取过滤器。