/// <summary>
            /// Removes a filter or filter group from the group
            /// </summary>
            /// <param name="searchFilter">Filter or filter group to remove</param>
            public bool Remove(SearchFilter searchFilter)
            {
                SearchFilterGroup testGroup = searchFilter as SearchFilterGroup;

                if (testGroup != null)
                {
                    return(Remove(testGroup));
                }
                else
                {
                    if (searchFilter == null)
                    {
                        return(false);
                    }
                    if (searchFilters.Remove(searchFilter))
                    {
                        return(true);
                    }
                    for (int i = 0; i < searchFilters.Count; i++)
                    {
                        SearchFilterGroup testSubGroup = searchFilters[i] as SearchFilterGroup;
                        if (testSubGroup != null && testSubGroup.Remove(searchFilter))
                        {
                            return(true);
                        }
                    }
                    return(false);
                }
            }
            /// <summary>
            /// Checks if a filter is already in this filter group
            /// </summary>
            /// <param name="searchFilter">Filter to check</param>
            /// <returns>If the filter is already part of this group</returns>
            public bool Contains(SearchFilter searchFilter)
            {
                SearchFilterGroup searchGroupTest = (searchFilter as SearchFilterGroup);

                if (searchGroupTest != null)
                {
                    return(Contains(searchGroupTest));
                }
                if (searchFilters.Contains(searchFilter))
                {
                    return(true);
                }
                else
                {
                    SearchFilterGroup groupTest;
                    for (int i = 0; i < searchFilters.Count; i++)
                    {
                        groupTest = searchFilters[i] as SearchFilterGroup;
                        if (groupTest != null)
                        {
                            if (groupTest.Contains(searchFilter))
                            {
                                return(true);
                            }
                        }
                    }
                }
                return(false);
            }
            /// <summary>
            /// Get a deep copy of the group and all filters contained in the group
            /// </summary>
            /// <returns>a copy of this group with all filters deep copied</returns>
            public override SearchFilter DeepCopy()
            {
                SearchFilterGroup newGroup = base.DeepCopy() as SearchFilterGroup;

                newGroup.searchFilters.Clear();
                for (int i = 0; i < searchFilters.Count; i++)
                {
                    if (searchFilters[i] != null)
                    {
                        newGroup.searchFilters.Add(searchFilters[i].DeepCopy());
                    }
                }
                return(newGroup);
            }
 /// <summary>
 /// Checks if this group already contains a group
 /// </summary>
 /// <param name="group">Group to check</param>
 /// <returns>If the group is already part of this group</returns>
 public bool Contains(SearchFilterGroup group)
 {
     if (group == this)
     {
         return(true);
     }
     for (int i = 0; i < searchFilters.Count; i++)
     {
         SearchFilterGroup testGroup = searchFilters[i] as SearchFilterGroup;
         if (testGroup != null && (testGroup == group || testGroup.Contains(group)))
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #5
0
        void OnGUI()
        {
            if (GUILayout.Button("Search"))
            {
                if (filter != null)
                {
                    List <GameObject> results = GetAllGameObjects();
                    filter.Filter(results);
                    ResultsWindow.DisplayResult(results, filter, dockOutputWindow);
                }
            }
#if UNITY_2019_OR_NEWER
            dockOutputWindow = EditorGUILayout.ToggleLeft("Dock results window", dockOutputWindow);
#else
            GUI.enabled      = false;
            dockOutputWindow = EditorGUILayout.ToggleLeft("Dock results window (available in 2019 or newer)", dockOutputWindow);
            GUI.enabled      = true;
#endif
            using (var scope = new EditorGUILayout.HorizontalScope())
            {
                EditorGUILayout.LabelField("Filter");
                filter = (SearchFilter)EditorGUILayout.ObjectField(filter, typeof(SearchFilter), true);
                if (filter != null)
                {
                    SearchFilterGroup filterGroup = (filter as SearchFilterGroup);
                    if (filterGroup == null)
                    {
                        filterGroup = CreateInstance <SearchFilterGroup>();
                        filterGroup.AddSearchFilter(filter);
                        filter = filterGroup;
                    }
                }
                else
                {
                    filter = CreateInstance <SearchFilterGroup>();
                }
            }
            if (filter != null)
            {
                using (var scrollScope = new GUILayout.ScrollViewScope(scrollPos))
                {
                    scrollPos    = scrollScope.scrollPosition;
                    filterEditor = Editor.CreateEditor(filter);
                    filterEditor.OnInspectorGUI();
                }
            }
        }
 public bool Remove(SearchFilterGroup group)
 {
     if (group == this || group == null)
     {
         return(false);
     }
     if (searchFilters.Remove(group))
     {
         return(true);
     }
     for (int i = 0; i < searchFilters.Count; i++)
     {
         SearchFilterGroup testGroup = searchFilters[i] as SearchFilterGroup;
         if (testGroup != null && testGroup.Remove(group))
         {
             return(true);
         }
     }
     return(false);
 }
            /// <summary>
            /// To add a filter or filter group
            /// </summary>
            /// <param name="searchFilter">Filter or filter group to add</param>
            public void AddSearchFilter(SearchFilter searchFilter)
            {
                SearchFilterGroup filterGroup = searchFilter as SearchFilterGroup;

                if (filterGroup != null)
                {
                    if (searchFilter == this)
                    {
                        Debug.LogWarning("Can not add filter group to itself");
                    }
                    else if (Contains(filterGroup) || filterGroup.Contains(this))
                    {
                        Debug.LogWarning("Filter already in group or subgroup");
                    }
                    else
                    {
                        searchFilters.Add(filterGroup);
                    }
                }
                else if (!Contains(searchFilter))
                {
                    searchFilters.Add(searchFilter);
                }
            }
Beispiel #8
0
 public override void OnInspectorGUI()
 {
     using (var vertScope = new EditorGUILayout.VerticalScope())
     {
         EditorGUI.indentLevel++;
         serializedObject.Update();
         SearchFilterGroup group   = (serializedObject.targetObject as SearchFilterGroup);
         SearchFilter[]    filters = group.searchFilters.ToArray();
         SearchFilterGroup groupTest;
         bool missing = false;
         for (int i = 0; i < filters.Length; i++)
         {
             missing = false;
             using (var filterScope = new EditorGUILayout.VerticalScope("Box"))
             {
                 if (filters[i] != null)
                 {
                     groupTest = filters[i] as SearchFilterGroup;
                     if (groupTest != null)
                     {
                         editor = CreateEditor(groupTest);
                     }
                     else
                     {
                         editor = CreateEditor(filters[i]);
                     }
                 }
                 else
                 {
                     editor  = CreateEditor(nullSearchFilter);
                     missing = true;
                 }
                 editor.OnInspectorGUI();
                 if (missing)
                 {
                     Color col  = GUI.contentColor;
                     Color bCol = GUI.backgroundColor;
                     GUI.backgroundColor = Color.red;
                     GUI.contentColor    = Color.red;
                     if (GUILayout.Button("Missing reference to filter click to remove"))
                     {
                         group.Remove(filters[i]);
                     }
                     GUI.contentColor    = col;
                     GUI.backgroundColor = bCol;
                 }
                 else
                 {
                     if (GUILayout.Button("Remove"))
                     {
                         group.Remove(filters[i]);
                     }
                 }
             }
             GUILayout.Space(10);
         }
         using (var horScope = new EditorGUILayout.HorizontalScope("Box"))
         {
             bool hit = GUILayout.Button("Add filter");
             addSearchFilter = (SearchFilter)EditorGUILayout.ObjectField(addSearchFilter, typeof(SearchFilter), true);
             if (addSearchFilter != null && hit)
             {
                 group.AddSearchFilter(addSearchFilter);
                 addSearchFilter = null;
                 EditorUtility.SetDirty(this);
             }
         }
     }
     serializedObject.ApplyModifiedProperties();
     EditorUtility.SetDirty(serializedObject.targetObject);
 }
        public IActionResult Index(SearchQueryModel model)
        {
            //Search data
            //http://localhost:9200/person_full_details/_search
            //Search exact term (case-insensitive)

            /*var searchResponse = _elasticClient.Search<PersonFullDetails>(s => s
             *  .From(0)
             *  .Size(10)
             *  .Query(q => q
             *      .Match(m => m
             *          .Field(f => f.Firstname)
             *          .Query("gil*")
             *      )
             *  )
             * );*/
            //Search start with
            var searchResponse = _elasticClient.Search <PersonFullDetails>(s => s
                                                                           .From(0)
                                                                           .Size(10)
                                                                           .Query(q => q
                                                                                  .Prefix(m => m
                                                                                          .Field(f => f.Firstname)
                                                                                          .Value("gil")
                                                                                          )
                                                                                  )
                                                                           );
            var people = searchResponse.Documents;

            //Low-level search
            var searchResponseLowLevel = _elasticClient.LowLevel.Search <SearchResponse <PersonFullDetails> >(PostData.Serializable(new
            {
                from  = 0,
                size  = 10,
                query = new
                {
                    match = new
                    {
                        field = "firstname",
                        query = "gilles"
                    }
                }
            }));
            var responseJsonLowLevel = searchResponseLowLevel;

            //Aggregates
            //TODO: Order bu last/first
            var searchResponseAggOLD = _elasticClient.Search <PersonFullDetails>(s => s
                                                                                 .From((model.Page - 1) * model.PageSize)
                                                                                 .Size(model.PageSize)
                                                                                 //.Size(0)
                                                                                 .Query(q => q
                                                                                        .MatchAll()

                                                                                        /*.Match(m => m
                                                                                         *  .Field(f => f.Firstname)
                                                                                         *  .Query("gilles")
                                                                                         * )*/
                                                                                        )
                                                                                 .Aggregations(a => a
                                                                                               .Terms("last_names", ta => ta
                                                                                                      .Field(f => f.Lastname.Suffix("keyword"))
                                                                                                      )
                                                                                               .Terms("roles", ta => ta
                                                                                                      .Field(f => f.Roles.Suffix("keyword"))
                                                                                                      )
                                                                                               .Terms("company_names", ta => ta
                                                                                                      .Field(f => f.Company.Name.Suffix("keyword"))
                                                                                                      )
                                                                                               )
                                                                                 );

            var searchQuery = new SearchDescriptor <PersonFullDetails>()
                              .From((model.Page - 1) * model.PageSize)
                              .Size(model.PageSize);
            //Term

            /*searchQuery = searchQuery
             *  .Query(qu => qu
             *      .Bool(b => b
             *          //Term
             *          .Must(must => must
             *              .Match(m => m
             *                  .Field(f => f.Firstname)
             *                  .Query(model.Term)
             *                  )
             *              )
             *          //Filter
             *          .Filter(f =>
             *              f.Match(term => term//Term?
             *                  .Field(field => field.Lastname)
             *                  .Query("Dupont")//Value?
             *              )
             *          )
             *      )
             *  );*/

            //TODO: Clean next lines
            var lastnames = model.LastnameFilterValues ?? new string[] { };
            var companies = model.CompanyFilterValues ?? new string[] { };
            var roles     = model.RoleFilterValues ?? new string[] { };
            var filters   = new List <Func <QueryContainerDescriptor <PersonFullDetails>, QueryContainer> >();

            //TODO: Include 1+ filters
            if (lastnames.Any(i => i != null))
            {
                foreach (var lastname in lastnames)
                {
                    filters.Add(fq => fq.Match(t => t.Field(f => f.Lastname).Query(lastname)));
                }
            }
            if (companies.Any(i => i != null))
            {
                foreach (var company in companies)
                {
                    filters.Add(fq => fq.Match(t => t.Field(f => f.Company.Name).Query(company)));
                }
            }
            if (roles.Any(i => i != null))
            {
                foreach (var role in roles)
                {
                    filters.Add(fq => fq.Match(t => t.Field(f => f.Roles).Query(role)));
                }
            }

            Fields firstnameField = Infer.Field <PersonFullDetails>(p => p.Firstname);
            var    lastnameField  = Infer.Field <PersonFullDetails>(p => p.Lastname, 2);//Boost 2, more important
            var    bioField       = Infer.Field <PersonFullDetails>(p => p.Bio);

            searchQuery = searchQuery
                          .Query(qu => qu
                                 .Bool(b => b
                                       //Term
                                       .Must(must => must
                                       //.Match(m => m
                                             .MultiMatch(m => m
                                       //.Field(f => f.Firstname)
                                                         .Fields(firstnameField.And(lastnameField).And(bioField))
                                                         .Query(model.Term)
                                                         )
                                             )
                                       //Filter
                                       .Filter(filters)

                                       /*.Filter(f =>
                                        *  f.Match(term => term//Term?
                                        *      .Field(field => field.Lastname)
                                        *      .Query(model.NameFilterValue)//Value?
                                        *  )
                                        * )*/
                                       )
                                 ).Highlight(h => h
                                             .PreTags("<b>")
                                             .PostTags("</b>")
                                             .Fields(f => f
                                                     .Field(e => e.Bio)
                                                     .PreTags("<span class=\"highlighted\">")
                                                     .PostTags("</span>")
                                                     )
                                             );

            //Aggregates
            searchQuery = searchQuery
                          .Aggregations(a => a
                                        .Terms("last_names", ta => ta
                                               .Field(f => f.Lastname.Suffix("keyword"))
                                               )
                                        .Terms("roles", ta => ta
                                               .Field(f => f.Roles.Suffix("keyword"))
                                               )
                                        .Terms("company_names", ta => ta
                                               .Field(f => f.Company.Name.Suffix("keyword"))
                                               )
                                        );
            var searchResponseAgg = _elasticClient.Search <PersonFullDetails>(searchQuery);

            /*var search2 = new SearchDescriptor<PersonFullDetails>()
             * .Query(q => q
             *     .QueryString(queryString => queryString
             *         .Query("gilles")))
             * .Aggregations(a => a
             *     .Terms("last_names", term => term
             *         .Field(f => f.Lastname.Suffix("keyword"))));*/

            //var search21 = _elasticClient.Search<PersonFullDetails>(search2);

            var results = new List <SearchPersonModel>();
            var i       = 0;

            foreach (var hit in searchResponseAgg.Hits)
            {
                var document = hit.Source;
                foreach (var highlight in hit.Highlight)
                {
                    if (highlight.Key == "bio")
                    {
                        document.Bio = highlight.Value.FirstOrDefault();
                    }
                }
                results.Add(new SearchPersonModel
                {
                    Id        = document.Id,
                    Firstname = document.Firstname,
                    Lastname  = document.Lastname,
                    Age       = document.Age,
                    Bio       = document.Bio,
                    Roles     = document.Roles,
                    Company   = new SearchCompanyModel
                    {
                        Id   = document.Company.Id,
                        Name = document.Company.Name
                    }
                });
                i++;
            }

            var filterGroups = new List <SearchFilterGroup>();
            //Lastname
            var lastnameFilters = new List <SearchFilter>();

            foreach (var bucket in searchResponseAgg.Aggregations.Terms("last_names").Buckets)
            {
                lastnameFilters.Add(new SearchFilter
                {
                    Label = bucket.Key,
                    Count = bucket.DocCount ?? 0
                });
            }
            var lastnameFilterGroup = new SearchFilterGroup
            {
                Label   = "Lastname",
                Filters = lastnameFilters
            };

            filterGroups.Add(lastnameFilterGroup);
            //Role
            var roleFilters = new List <SearchFilter>();

            foreach (var bucket in searchResponseAgg.Aggregations.Terms("roles").Buckets)
            {
                roleFilters.Add(new SearchFilter
                {
                    Label = bucket.Key,
                    Count = bucket.DocCount ?? 0
                });
            }
            var roleFilterGroup = new SearchFilterGroup
            {
                Label   = "Role",
                Filters = roleFilters
            };

            filterGroups.Add(roleFilterGroup);
            //Company
            var companyFilters = new List <SearchFilter>();

            foreach (var bucket in searchResponseAgg.Aggregations.Terms("company_names").Buckets)
            {
                companyFilters.Add(new SearchFilter
                {
                    Label = bucket.Key,
                    Count = bucket.DocCount ?? 0
                });
            }
            var companyFilterGroup = new SearchFilterGroup
            {
                Label   = "Company",
                Filters = companyFilters
            };

            filterGroups.Add(companyFilterGroup);

            var totalPages = searchResponseAgg.Total / (double)model.PageSize;
            var data       = new SearchResultModel
            {
                SearchTerm           = model.Term,
                NbTotalResults       = searchResponseAgg.Total,
                Results              = results,
                FilterGroups         = filterGroups,
                PageSize             = model.PageSize,
                CurrentPage          = model.Page,
                TotalPages           = (int)Math.Ceiling(totalPages),
                LastnameFilterValues = model.LastnameFilterValues,
                CompanyFilterValues  = model.CompanyFilterValues,
                RoleFilterValues     = model.RoleFilterValues
            };

            return(View(data));
        }