Unity 6.3
0 онлайн 63 гостей 3 в системе
Вход

QueryEngine<T0>

класс в UnityEditor.Search

Описание

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Логическое значение. Указывает, следует ли пропускать неполные фильтры. Если true, фильтры пропускаются. Если false и validateFilters является true, неполные фильтры будут генерировать ошибки при анализе.
skipUnknownFiltersЛогическое значение. Указывает, следует ли пропускать неизвестные фильтры. Если true, неизвестные фильтры пропускаются. Если false и validateFilters является true, неизвестные фильтры будут генерировать ошибки, если не будет предоставлен обработчик фильтра по умолчанию.
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Получить фильтр по его токену.