コード例 #1
0
        protected override Query HandleQuotedTerm(string field, Token termToken, Token slopToken)
        {
            string termImage = termToken.Image.Substring(1, termToken.Image.Length - 2);

            if (Str.Equals(Like, field))
            {
                return(getMoreLikeQuery(termImage, slopToken));
            }

            return(base.HandleQuotedTerm(field, termToken, slopToken));
        }
コード例 #2
0
        protected override Query HandleBareTokenQuery(string field, Token termToken, Token slopToken, bool prefix, bool wildcard, bool fuzzy, bool regexp)
        {
            if (Str.Equals(Like, field))
            {
                if (prefix || wildcard || regexp || fuzzy)
                {
                    return(_matchNothingQuery);
                }

                return(getMoreLikeQuery(termToken.Image, slopToken));
            }

            return(base.HandleBareTokenQuery(field, termToken, slopToken, prefix, wildcard, fuzzy, regexp));
        }
コード例 #3
0
        private static float parseSlop(Token fuzzySlop)
        {
            if (fuzzySlop == null)
            {
                return(0f);
            }

            if (fuzzySlop.Image.Length <= 1)
            {
                return(0f);
            }

            float.TryParse(fuzzySlop.Image.Substring(1), NumberStyles.Float, Str.Culture, out var slop);

            return(slop);
        }
コード例 #4
0
        private Query getMoreLikeQuery(string termImage, Token slopToken)
        {
            string unescaped = StringEscaper.Unescape(termImage);
            float  slop      = parseSlop(slopToken);

            if (string.IsNullOrEmpty(unescaped))
            {
                return(MatchNothingQuery);
            }

            if (!_repository.IsLoadingComplete.Signaled)
            {
                return(MatchNothingQuery);
            }

            string name   = unescaped.RemoveDiacritics();
            var    result = new DisjunctionMaxQuery(0.1f);

            addClauses(isToken: false);
            addClauses(isToken: true);

            return(result.Disjuncts.Count == 0
                                ? MatchNothingQuery
                                : result);

            void addClauses(bool isToken)
            {
                if (!_repository.MapByName(isToken).TryGetValue(name, out var list))
                {
                    return;
                }

                Card c = list[0];

                if (!string.IsNullOrEmpty(c.TextEn))
                {
                    result.Add(createMoreLikeThisQuery(slop, c.TextEn, nameof(Card.TextEn)));
                }

                if (!string.IsNullOrEmpty(c.GeneratedMana))
                {
                    result.Add(createMoreLikeThisQuery(slop, c.GeneratedMana, nameof(Card.GeneratedMana)));
                }
            }
        }
コード例 #5
0
        private Query getMoreLikeQuery(string termImage, Token slopToken)
        {
            string unescaped = StringEscaper.Unescape(termImage);
            float  slop      = parseSlop(slopToken);

            if (string.IsNullOrEmpty(unescaped))
            {
                return(_matchNothingQuery);
            }

            if (!_repository.IsLoadingComplete)
            {
                return(_matchNothingQuery);
            }

            string cardName = unescaped.RemoveDiacritics();

            if (!_repository.CardsByName.TryGetValue(cardName, out var cards))
            {
                return(_matchNothingQuery);
            }

            var card = cards[0];

            var result = new DisjunctionMaxQuery(0.1f);

            if (!string.IsNullOrEmpty(card.TextEn))
            {
                result.Add(createMoreLikeThisQuery(slop, card.TextEn, nameof(card.TextEn)));
            }

            if (!string.IsNullOrEmpty(card.GeneratedMana))
            {
                result.Add(createMoreLikeThisQuery(slop, card.GeneratedMana, nameof(card.GeneratedMana)));
            }

            if (result.Disjuncts.Count == 0)
            {
                return(_matchNothingQuery);
            }

            return(result);
        }