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