# QueryEngine<TData>

> A QueryEngine defines how to build a query from an input string. It can be customized to support custom filters and operators.

## Definition

* **Type:** Class
* **Namespace:** [UnityEditor.Search](/engine/6000.7/script-reference/unityeditor/search.md)
* **Assembly:** UnityEditor

```csharp
public class QueryEngine<TData>
```

## Remarks

\\\<TData\\>: The filtered data type.

## Examples

```csharp
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>();

        #region basic_add_filter
        // 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[] { "=", "!=", "<", ">", "<=", ">=" });
        #endregion

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

        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})";
        }
    }
}
```

## Constructors

| Constructor                                                                                                                                                                | Description                   |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| [QueryEngine\`1()](/engine/6000.7/script-reference/unityeditor/search/queryengine1/ctor.md#queryengine\(\))                                                                | Constructs a new QueryEngine. |
| [QueryEngine\`1(System.Boolean)](/engine/6000.7/script-reference/unityeditor/search/queryengine1/ctor.md#queryengine\(bool\))                                              | Constructs a new QueryEngine. |
| [QueryEngine\`1(UnityEditor.Search.QueryValidationOptions)](/engine/6000.7/script-reference/unityeditor/search/queryengine1/ctor.md#queryengine\(queryvalidationoptions\)) | Constructs a new QueryEngine. |

## Properties

| Property                                                                                                                                      | Description                                                                                                                                                                                                                                                                                               |
| --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [globalStringComparison](/engine/6000.7/script-reference/unityeditor/search/queryengine1/globalstringcomparison.md)                           | Global string comparison options for word matching and filter handling (if not overridden).                                                                                                                                                                                                               |
| [searchDataCallback](/engine/6000.7/script-reference/unityeditor/search/queryengine1/searchdatacallback.md)                                   | The callback used to get the data to match to the search words.                                                                                                                                                                                                                                           |
| [searchDataOverridesStringComparison](/engine/6000.7/script-reference/unityeditor/search/queryengine1/searchdataoverridesstringcomparison.md) | Indicates if word/phrase matching uses searchDataStringComparison or not.                                                                                                                                                                                                                                 |
| [searchDataStringComparison](/engine/6000.7/script-reference/unityeditor/search/queryengine1/searchdatastringcomparison.md)                   | String comparison options for word/phrase matching.                                                                                                                                                                                                                                                       |
| [searchWordMatcher](/engine/6000.7/script-reference/unityeditor/search/queryengine1/searchwordmatcher.md)                                     | The function used to match the search data against the search words.                                                                                                                                                                                                                                      |
| [skipIncompleteFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/skipincompletefilters.md)                             | Boolean. Indicates if incomplete filters should be skipped. If true, filters are skipped. If false and [validateFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/validatefilters.md) is true, incomplete filters will generate errors when parsed.                                |
| [skipUnknownFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/skipunknownfilters.md)                                   | Boolean. Indicates if unknown filters should be skipped. If true, unknown filters are skipped. If false and [validateFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/validatefilters.md) is true, unknown filters will generate errors if no default filter handler is provided. |
| [validateFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/validatefilters.md)                                         | Get or set if the engine must validate filters when parsing the query. Defaults to true.                                                                                                                                                                                                                  |

## Methods

| Method                                                                                                                                  | Description                                                                                                                                                                         |
| --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [AddFilter](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addfilter.md)                                               | Adds a new custom filter.                                                                                                                                                           |
| [AddFiltersFromAttribute](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addfiltersfromattribute.md)                   | Adds all custom filters that are identified with the method attribute TFilterAttribute.                                                                                             |
| [AddNestedQueryAggregator](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addnestedqueryaggregator.md)                 | Adds a new nested query aggregator. An aggregator is an operation that can be applied on a nested query to aggregate the results of the nested query according to certain criteria. |
| [AddOperator](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addoperator.md)                                           | Adds a custom filter operator.                                                                                                                                                      |
| [AddOperatorHandler](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addoperatorhandler.md)                             | Adds a custom filter operator handler.                                                                                                                                              |
| [AddTypeParser](/engine/6000.7/script-reference/unityeditor/search/queryengine1/addtypeparser.md)                                       | Adds a type parser that parses a string and returns a custom type. Used by custom operator handlers (see AddOperatorHandler).                                                       |
| [ClearFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/clearfilters.md)                                         | Removes all filters that were added on the [QueryEngine](/engine/6000.7/script-reference/unityeditor/search/queryengine1.md).                                                       |
| [GetAllFilters](/engine/6000.7/script-reference/unityeditor/search/queryengine1/getallfilters.md)                                       | Get all filters added on this [QueryEngine](/engine/6000.7/script-reference/unityeditor/search/queryengine1.md).                                                                    |
| [GetOperator](/engine/6000.7/script-reference/unityeditor/search/queryengine1/getoperator.md)                                           | Get a custom operator added on the [QueryEngine](/engine/6000.7/script-reference/unityeditor/search/queryengine1.md).                                                               |
| [ParseQuery](/engine/6000.7/script-reference/unityeditor/search/queryengine1/parsequery.md)                                             | Parses a query string into a ParsedQuery operation. This ParsedQuery operation can then be used to filter any data set of type TData.                                               |
| [RemoveFilter](/engine/6000.7/script-reference/unityeditor/search/queryengine1/removefilter.md)                                         | Removes a custom filter.                                                                                                                                                            |
| [RemoveOperator](/engine/6000.7/script-reference/unityeditor/search/queryengine1/removeoperator.md)                                     | Removes a custom operator that was added on the [QueryEngine](/engine/6000.7/script-reference/unityeditor/search/queryengine1.md).                                                  |
| [SetDefaultFilter](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setdefaultfilter.md)                                 | Sets the default filter handler for filters that were not registered.                                                                                                               |
| [SetDefaultParamFilter](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setdefaultparamfilter.md)                       | Sets the default filter handler for function filters that were not registered.                                                                                                      |
| [SetFilterNestedQueryTransformer](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setfilternestedquerytransformer.md)   | Sets a filter's nested query transformer function. This function takes the result of a nested query and extracts the necessary data to compare with the filter.                     |
| [SetGlobalStringComparisonOptions](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setglobalstringcomparisonoptions.md) | Sets global string comparison options. Used for word matching and filter handling (unless overridden by filter).                                                                    |
| [SetNestedQueryHandler](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setnestedqueryhandler.md)                       | Sets the function that will handle nested queries. Only one handler can be set.                                                                                                     |
| [SetSearchDataCallback](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setsearchdatacallback.md)                       | Sets the callback used to fetch the data that is matched against the search words.                                                                                                  |
| [SetSearchWordMatcher](/engine/6000.7/script-reference/unityeditor/search/queryengine1/setsearchwordmatcher.md)                         | Set the search word matching function to be used instead of the default one. Set to null to use the default.                                                                        |
| [TryGetFilter](/engine/6000.7/script-reference/unityeditor/search/queryengine1/trygetfilter.md)                                         | Get a filter by its token.                                                                                                                                                          |
