123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using JetBrains.Annotations;
-
- namespace UnityEditor.Searcher
- {
- [PublicAPI]
- public class Searcher
- {
- public ISearcherAdapter Adapter { get; }
- public Comparison<SearcherItem> SortComparison { get; set; }
-
- readonly List<SearcherDatabaseBase> m_Databases;
-
- public Searcher(SearcherDatabaseBase database, string title)
- : this(new List<SearcherDatabaseBase> { database }, title, null)
- { }
-
- public Searcher(IEnumerable<SearcherDatabaseBase> databases, string title)
- : this(databases, title, null)
- { }
-
- public Searcher(SearcherDatabaseBase database, ISearcherAdapter adapter = null)
- : this(new List<SearcherDatabaseBase> { database }, adapter)
- { }
-
- public Searcher(IEnumerable<SearcherDatabaseBase> databases, ISearcherAdapter adapter = null)
- : this(databases, string.Empty, adapter)
- { }
-
- Searcher(IEnumerable<SearcherDatabaseBase> databases, string title, ISearcherAdapter adapter)
- {
- m_Databases = new List<SearcherDatabaseBase>();
- var databaseId = 0;
- foreach (var database in databases)
- {
- // This is needed for sorting items between databases.
- database.OverwriteId(databaseId);
- databaseId++;
-
- m_Databases.Add(database);
- }
-
- Adapter = adapter ?? new SearcherAdapter(title);
- }
-
- public void BuildIndices()
- {
- foreach (var database in m_Databases)
- {
- database.BuildIndex();
- }
- }
-
- public IEnumerable<SearcherItem> Search(string query)
- {
- query = query.ToLower();
-
- var results = new List<SearcherItem>();
- float maxScore = 0;
- foreach (var database in m_Databases)
- {
- var localResults = database.Search(query, out var localMaxScore);
- if (localMaxScore > maxScore)
- {
- // skip the highest scored item in the local results and
- // insert it back as the first item. The first item should always be
- // the highest scored item. The order of the other items does not matter
- // because they will be reordered to recreate the tree properly.
- if (results.Count > 0)
- {
- // backup previous best result
- results.Add(results[0]);
- // replace it with the new best result
- results[0] = localResults[0];
- // add remaining results at the end
- results.AddRange(localResults.Skip(1));
- }
- else // best result will be the first item
- results.AddRange(localResults);
-
- maxScore = localMaxScore;
- }
- else // no new best result just append everything
- {
- results.AddRange(localResults);
- }
- }
-
- return results;
- }
-
- [PublicAPI]
- public class AnalyticsEvent
- {
- [PublicAPI]
- public enum EventType{ Pending, Picked, Cancelled }
- public readonly EventType eventType;
- public readonly string currentSearchFieldText;
- public AnalyticsEvent(EventType eventType, string currentSearchFieldText)
- {
- this.eventType = eventType;
- this.currentSearchFieldText = currentSearchFieldText;
- }
- }
- }
- }
|