예제 #1
0
        /// <summary>
        /// Execute search item validation
        /// </summary>
        /// <param name="item">Search item to validate</param>
        private void ValidateSearchItem(ISearchItem item)
        {
            var searchParameter = item as ISearchParameter;

            if (!this._solrExpressOptions.FailFast || searchParameter == null)
            {
                return;
            }

            var attributes = searchParameter
                             .GetType()
#if NETCORE
                             .GetTypeInfo()
#endif
                             .GetCustomAttributes()
                             .Where(q => q is IValidationAttribute)
                             .ToList();

            var hasMultipleInstances = this
                                       ._searchItemCollection
                                       .GetSearchParameters()
                                       ?.Count(q => q.GetType() == searchParameter.GetType()) > 1;

            var allowMultipleInstances = !attributes.Any(q => q is AllowMultipleInstancesAttribute);

            Checker.IsTrue <AllowMultipleInstancesException>(hasMultipleInstances && !allowMultipleInstances, searchParameter.GetType().FullName);

            foreach (var attribute in attributes)
            {
                var isValid = ((IValidationAttribute)attribute).IsValid <TDocument>(searchParameter, out string errorMessage);

                Checker.IsFalse <SearchParameterIsInvalidException>(isValid, searchParameter.GetType().FullName, errorMessage);
            }
        }
예제 #2
0
        public virtual bool IsIncluded(ISearchItem fileName)
        {
            if (Type == SearchType.Unknown || Parameter == SearchParameter.Unknown || string.IsNullOrEmpty(Value))
            {
                return(true);
            }

            switch (Type)
            {
            case SearchType.Contains:
                return(SwitchContains(fileName) == Include);

            case SearchType.NotContains:
                return(!SwitchContains(fileName) == Include);

            case SearchType.Is:
                return(SwitchEquals(fileName) == Include);

            case SearchType.Not:
                return(!SwitchEquals(fileName) == Include);

            default:
                return(false);
            }
        }
예제 #3
0
        /// <summary>
        /// Validate search parameter
        /// </summary>
        /// <param name="item">Search item to validate</param>
        private void ValidateSearchParameter(ISearchItem item)
        {
            if (item is ISearchParameter)
            {
                var parameter = (ISearchParameter)item;

                var multipleInstances = !parameter.AllowMultipleInstances && this._items
                                        .Any(q => (q.GetType() == parameter.GetType()));

                Checker.IsTrue <AllowMultipleInstanceOfParameterTypeException>(multipleInstances, parameter.GetType().FullName);

                var parameterValidation = parameter as IValidation;

                var mustValidate = this.Options.FailFast && parameterValidation != null;

                if (parameter is IAnyParameter <TDocument> )
                {
                    mustValidate = mustValidate && this.Options.CheckAnyParameter && parameter is IAnyParameter <TDocument>;
                }

                if (mustValidate)
                {
                    bool   isValid;
                    string errorMessage;

                    parameterValidation.Validate(out isValid, out errorMessage);

                    Checker.IsTrue <InvalidParameterTypeException>(!isValid, parameterValidation.GetType().FullName, errorMessage);
                }
            }
        }
예제 #4
0
        private bool SwitchEquals(ISearchItem fileName)
        {
            switch (Parameter)
            {
            case SearchParameter.Extension:
            {
                return(fileName.Extension.ToLower().Equals(Value.ToLower()));
            }

            case SearchParameter.Name:
            {
                return(Path.GetFileNameWithoutExtension(fileName.Name).ToLower().Equals(Value.ToLower()));
            }

            case SearchParameter.NameOrExtension:
            {
                return(Path.GetFileNameWithoutExtension(fileName.Name).ToLower().Equals(Value) || fileName.Extension.Equals(Value.ToLower()));
            }

            case SearchParameter.WholePath:
            {
                return(fileName.FullName.ToLower().Equals(Value.ToLower()));
            }
            }
            return(false);
        }
예제 #5
0
        /// <summary>
        /// Removes the <see cref="ISearchItem{TKey}"/>.
        /// </summary>
        /// <param name="item">The item to remove.</param>
        /// <returns><see langword="true"/>, if <paramref name="item"/> was removed. <see langword="false"/>, if <paramref name="item"/> was not found.</returns>
        public static bool RemoveCommand(ISearchItem <string> item)
        {
            var    assembly     = Assembly.GetCallingAssembly();
            string assemblyName = assembly?.GetName()?.Name ?? "Null";

            assemblyName = assemblyName.Replace("_", " ");

            var sourceName = "___UNNAMEDITEMSOURCE___";
            var combined   = $"{assemblyName}_{sourceName}";

            if (searchItemSources.TryGetValue(combined, out var existing))
            {
                ExternalCommandItemSource source = (ExternalCommandItemSource)existing;
                var key = source.entries.Where(e => e.Value == item).Select(e => e.Key).FirstOrDefault();
                if (key != null)
                {
                    source.entries.Remove(key);
                    return(true);
                }
                if (source.entries.Count == 0)
                {
                    searchItemSources.TryRemove(combined, out var _);
                }
            }
            return(false);
        }
예제 #6
0
        public int CalculateMatchStrength(ISearchItem searchItem)
        {
            if (string.IsNullOrEmpty(SearchTerm))
            {
                return 1;
            }

            int wholeScore = CalculatePartScore(searchItem.Alias, SearchTerm);
            if (wholeScore > 0)
            {
                return wholeScore << 24;
            }

            int runningScore = 0;
            int partLengthMatched = 0;
            for (int i = 0; i < _parts.Length; ++i)
            {
                int partScore = CalculatePartScore(searchItem.Alias, _parts[i]);
                if (partScore > 0)
                {
                    partLengthMatched += _parts[i].Length;
                    runningScore += partScore & 0x7F;
                }
            }

            return ((partLengthMatched & 0x7F) << 16) | (runningScore & 0xFFFF);
        }
예제 #7
0
        public int CalculateMatchStrength(ISearchItem searchItem)
        {
            if (string.IsNullOrEmpty(SearchTerm))
            {
                return(1);
            }

            int wholeScore = CalculatePartScore(searchItem.Alias, SearchTerm);

            if (wholeScore > 0)
            {
                return(wholeScore << 24);
            }

            int runningScore      = 0;
            int partLengthMatched = 0;

            for (int i = 0; i < _parts.Length; ++i)
            {
                int partScore = CalculatePartScore(searchItem.Alias, _parts[i]);
                if (partScore > 0)
                {
                    partLengthMatched += _parts[i].Length;
                    runningScore      += partScore & 0x7F;
                }
            }

            return(((partLengthMatched & 0x7F) << 16) | (runningScore & 0xFFFF));
        }
예제 #8
0
 private static bool CheckDateRange(ISearchItem file, CalendarDateRange range = null)
 {
     if (range == null)
     {
         return(true);
     }
     return(file.CreationTime >= range.Start && file.CreationTime <= range.End);
 }
예제 #9
0
 private static bool CheckSizeRange(ISearchItem file, SizeRange range)
 {
     if (range == null)
     {
         return(true);
     }
     return(range.IsInRange(file.Length));
 }
예제 #10
0
        private void OnLostFocus(object sender, RoutedEventArgs e)
        {
            ISearchItem selected = SelectedItem;

            if (selected != null && !Options.IsKeyboardFocusWithin)
            {
                Text         = selected.CollapsedItemText;
                CommitedItem = selected;
            }
        }
예제 #11
0
        /// <summary>
        /// Add an item to search
        /// </summary>
        /// <param name="item">Parameter to add in the query</param>
        /// <returns>Itself</returns>
        public DocumentSearch <TDocument> Add(ISearchItem item)
        {
            Checker.IsNull(item);

            this.ValidateSearchItem(item);

            this._searchItemCollection.Add(item);

            return(this);
        }
예제 #12
0
        /// <summary>
        /// Add an item to search
        /// </summary>
        /// <param name="item">Parameter to add in the query</param>
        ISolrSearch <TDocument> ISolrSearch <TDocument> .Add(ISearchItem item)
        {
            Checker.IsNull(item);

            this.ValidateSearchParameter(item);

            this._items.Add(item);

            return(this);
        }
예제 #13
0
        /// <summary>
        /// 注册一个数据源
        /// </summary>
        /// <param name="inputItem">输入的数据源</param>
        /// <param name="ifAdjustCache">是否调整检索缓存</param>
        /// <returns>是否成功</returns>
        private bool TryRegistOneItem(ISearchItem inputItem, bool ifAdjustCache)
        {
            if (null == inputItem || string.IsNullOrWhiteSpace(inputItem.ItemName))
            {
                return(false);
            }

            //调整输入
            string realName = AdjustString(inputItem.ItemName);

            if (!m_dicSearchSource.ContainsKey(realName))
            {
                m_dicSearchSource.Add(realName, new List <ISearchItem>());
            }

            if (!m_dicSearchSource[realName].Contains(inputItem))
            {
                m_dicSearchSource[realName].Add(inputItem);

                //判断是否需要添加到上次检索缓存
                //*上次检索可以触发此次添加的数值
                if (IfCanUseLastCache(realName))
                {
                    if (!m_LastSearchcache.Value.ContainsKey(realName))
                    {
                        m_LastSearchcache.Value.Add(realName, new List <ISearchItem>());
                    }
                    m_LastSearchcache.Value[realName].Add(inputItem);
                }

                //若需要调整缓存
                if (ifAdjustCache)
                {
                    Regex tempRegex = null;
                    foreach (var oneCacheKVP in m_cache)
                    {
                        tempRegex = new Regex(oneCacheKVP.Key);

                        //若命中
                        if (tempRegex.IsMatch(realName))
                        {
                            //加入缓存
                            oneCacheKVP.Value.Add(inputItem);
                        }
                    }
                }

                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #14
0
        // Here you do whatever is needed to create a list of FilteredList items that is
        // passed to the control for display
        private void OnSelectedChoiceChanged(ISearchItem item)
        {
            if (item == null)
            {
                return;
            }

            this.FilteredList.Clear();
            foreach (var model in this.Source.Where(n => n.ID.StartsWith(item.Name)))
            {
                // note that we are just attaching the ExampeSearchModel object to the SearcItem
                this.FilteredList.Add(new SearchItem(model.ID, model.ID, model));
            }
        }
예제 #15
0
        /// <summary>
        /// Execute search item validation
        /// </summary>
        /// <param name="item">Search item to validate</param>
        internal void ValidateSearchItem(ISearchItem item)
        {
            var searchParameter = item as ISearchParameter;
            var errorMessage    = string.Empty;

            if (!this._solrExpressOptions.FailFast || searchParameter == null)
            {
                return;
            }

            var attributes = searchParameter
                             .GetType()
#if NETCORE
                             .GetTypeInfo()
#endif
                             .GetCustomAttributes()
                             .Where(q => q is IValidationAttribute)
                             .ToList();

            var hasMultipleInstances = this
                                       ._searchItemCollection
                                       .GetSearchParameters()
                                       ?.Count(q => q.GetType() == searchParameter.GetType()) > 1;

            var allowMultipleInstances = !attributes.Any(q => q is AllowMultipleInstancesAttribute);

            Checker.IsTrue <AllowMultipleInstancesException>(hasMultipleInstances && !allowMultipleInstances, searchParameter.GetType().FullName);

            if (this._solrExpressOptions.CheckAnyParameter)
            {
                var useAnyThanSpecificParameterRather = attributes.FirstOrDefault(q => q is UseAnyThanSpecificParameterRatherAttribute);
                var isValid = ((IValidationAttribute)useAnyThanSpecificParameterRather).IsValid <TDocument>(searchParameter, out errorMessage);
                Checker.IsFalse <SearchParameterIsInvalidException>(isValid, searchParameter.GetType().FullName, errorMessage);
            }

            var filteredAttributes = attributes
                                     .Where(q =>
                                            !(q is UseAnyThanSpecificParameterRatherAttribute) &&
                                            !(q is AllowMultipleInstancesAttribute))
                                     .ToList();

            foreach (var attribute in filteredAttributes)
            {
                var isValid = ((IValidationAttribute)attribute).IsValid <TDocument>(searchParameter, out errorMessage);
                Checker.IsFalse <SearchParameterIsInvalidException>(isValid, searchParameter.GetType().FullName, errorMessage);
            }
        }
예제 #16
0
        private static bool CheckSearchConditions(ISearchItem file, ICollection <SearchCondition> conditions = null)
        {
            if (conditions == null || conditions.Count == 0)
            {
                return(true);
            }

            foreach (var searchCondition in conditions)
            {
                if (searchCondition.IsIncluded(file))
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #17
0
        /// <summary>
        /// Adds a <see cref="ISearchItem{TKey}"/>.
        /// </summary>
        /// <param name="item"><see cref="ISearchItem{TKey}"/> to add.</param>
        /// <returns><see langword="true"/>, if item was added. <see langword="false"/>, if item already existed.</returns>
        public static bool AddCommand(ISearchItem <string> item)
        {
            var    assembly     = Assembly.GetCallingAssembly();
            string assemblyName = assembly?.GetName()?.Name ?? "Null";

            assemblyName = assemblyName.Replace("_", " ");
            if (!registeredAssemblies.Contains(assemblyName))
            {
                registeredAssemblies.Add(assemblyName);
            }
            var key = $"{assemblyName}_{item.TopLeft}";

            var source = GetOrCreateSource(assemblyName);

            if (!source.entries.ContainsKey(key))
            {
                source.entries.Add(key, item);
                return(true);
            }
            return(false);
        }
예제 #18
0
        /// <summary>Get all items which can be searched and added to the player's inventory through the console.</summary>
        private IEnumerable <ISearchItem> GetItems()
        {
            // objects
            foreach (int id in Game1.objectInformation.Keys)
            {
                ISearchItem obj = id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange
                    ? new SearchableRing(id)
                    : (ISearchItem) new SearchableObject(id);
                if (obj.IsValid)
                {
                    yield return(obj);
                }
            }

            // weapons
            foreach (int id in Game1.content.Load <Dictionary <int, string> >("Data\\weapons").Keys)
            {
                ISearchItem weapon = new SearchableWeapon(id);
                if (weapon.IsValid)
                {
                    yield return(weapon);
                }
            }
        }
예제 #19
0
 private View ViewSelector(ISearchItem item)
 {
     if (demoDataTemplateSelector)
     {
         // this is an example of using a dataTemplate selector
         int    id = int.Parse(item.ID);
         string dataTemplateKey = id % 2 == 0 ? "TemplateA" : "TemplateB";
         if (id % 3 == 0)
         {
             dataTemplateKey = "TemplateC";
         }
         DataTemplate dt = this.Resources[dataTemplateKey] as DataTemplate;
         if (dt != null)
         {
             return(dt.CreateContent() as View);
         }
         return(null);
     }
     else
     {
         // this is an example of using a single template for all grid cells
         return(new MGCheckBoxFilter());
     }
 }
 public void Add(ISearchItem item)
 {
     // Test purpose only
 }
예제 #21
0
 public SearchItemContainer(ComboSearch search, ISearchItem item)
 {
     Item    = item;
     _search = search;
     search.SearchTextChanged += OnSearchTextChanged;
 }
예제 #22
0
 public SearchItemContainer(ComboSearch search, ISearchItem item)
 {
     Item = item;
     _search = search;
     search.SearchTextChanged += OnSearchTextChanged;
 }
예제 #23
0
 public static void SetSelectedChoice(BindableObject target, ISearchItem value)
 {
     target.SetValue(SelectedChoiceProperty, value);
 }
예제 #24
0
 /// <summary>
 /// 注册一个数据源
 /// </summary>
 /// <param name="inputItem">输入的数据源</param>
 /// <returns>是否成功</returns>
 public bool TryRegistOneItem(ISearchItem inputItem)
 {
     return(TryRegistOneItem(inputItem, true));
 }
예제 #25
0
 /// <summary>
 /// Determines whether an element is in current list
 /// </summary>
 /// <param name="item">Item to add</param>
 /// <returns>Returns true if item is found in list, otherwise false</returns>
 public bool Contains(ISearchItem item) => this._items.Contains(item);
예제 #26
0
 public bool IsMatch(ISearchItem searchItem)
 {
     return(CalculateMatchStrength(searchItem) > 0);
 }
예제 #27
0
 public bool IsMatch(ISearchItem searchItem)
 {
     return CalculateMatchStrength(searchItem) > 0;
 }
예제 #28
0
 public void Add(ISearchItem item)
 {
     this._searchItems.Add(item);
 }
 public void Add(ISearchItem item)
 {
 }