Ejemplo n.º 1
0
 public void TestGetContentSearchStr()
 {
     Assert.Multiple(() =>
     {
         Assert.IsEmpty(Generator.GetContentSearchStr(null, false));
         Assert.IsEmpty(Generator.GetContentSearchStr(" ", true));
         Assert.AreEqual($"{nameof(CodeSource.Content)}:A", Generator.GetContentSearchStr("A", false));
         Assert.AreEqual($"{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:A", Generator.GetContentSearchStr("A", true));
     });
 }
Ejemplo n.º 2
0
        public void TestGetContentSearchQuery_NormalQuery()
        {
            var query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = false,
                Content       = "ABC*",
            });

            Assert.NotNull(query);
            Assert.AreEqual("Content:abc*", query.ToString());

            query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "ABC*",
            });

            Assert.AreEqual($"{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:ABC*", query.ToString());

            query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = false,
                Content       = "Abc~2",
            });

            Assert.AreEqual($"Content:abc~2", query.ToString());

            query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "Abc~2",
            });

            Assert.AreEqual($"{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:Abc~2", query.ToString());

            query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "  ",
            });

            Assert.IsNull(query);

            query = Generator.GetContentSearchQuery(new SearchRequest
            {
                CaseSensitive = false,
                Content       = null,
            });

            Assert.IsNull(query);
        }
Ejemplo n.º 3
0
        protected string GetContentSearchStr(string content, bool caseSensitive)
        {
            if (!string.IsNullOrWhiteSpace(content))
            {
                if (caseSensitive)
                {
                    return($"{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:{content}");
                }

                return($"{nameof(CodeSource.Content)}:{content}");
            }

            return(string.Empty);
        }
Ejemplo n.º 4
0
        void AddPhaseQueryWithoutWildcard(BooleanQuery query, string queryStr, string propertyName)
        {
            queryStr = $"\"{queryStr}\"";

            if (propertyName == nameof(CodeSource.FilePath))
            {
                query.Add(GetQueryFromStr($"{propertyName}:{queryStr.Replace("\\", "\\\\").Replace(ReplaceEncodedDoubleQuotes, EncodedDoubleQuotes).Replace(EncodedSpecialPrefix, SpecialPrefix)}", false), Occur.MUST);
            }
            else
            {
                if (propertyName == CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content)))
                {
                    query.Add(GetQueryFromStr($"{propertyName}:{queryStr.Replace(ReplaceEncodedDoubleQuotes, EncodedDoubleQuotes).Replace(EncodedSpecialPrefix, SpecialPrefix)}", true), Occur.MUST);
                }
                else
                {
                    query.Add(GetQueryFromStr($"{propertyName}:{queryStr.Replace(ReplaceEncodedDoubleQuotes, EncodedDoubleQuotes).Replace(EncodedSpecialPrefix, SpecialPrefix)}", false), Occur.MUST);
                }
            }
        }
Ejemplo n.º 5
0
        public void TestGetSearchQuery_NormalQuery()
        {
            var query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = false,
                Content       = "ABC*",
                FileName      = "EFG",
            });

            Assert.NotNull(query);
            Assert.AreEqual("+FileName:efg +Content:abc*", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "ABC*",
                FileName      = "EFG",
            });

            Assert.AreEqual($"+FileName:efg +{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:ABC*", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = false,
                Content       = "Abc~2",
                FileName      = "EFG",
            });

            Assert.AreEqual($"+FileName:efg +Content:abc~2", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                FileName      = "EFG",
                Content       = "Abc~2",
            });

            Assert.AreEqual($"+FileName:efg +{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:Abc~2", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                FileName      = "EFG",
            });

            Assert.AreEqual($"FileName:efg", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "Abc~2",
            });

            Assert.AreEqual($"{CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content))}:Abc~2", query.ToString());

            query = Generator.GetSearchQuery(new SearchRequest
            {
                CaseSensitive = true,
                Content       = "Abc~2",
                CodePK        = "123"
            });

            Assert.AreEqual($"{nameof(CodeSource.CodePK)}:123", query.ToString());
        }
Ejemplo n.º 6
0
        void AddPhaseQuery(BooleanQuery query, string queryStr, bool caseSensitive, string propertyName)
        {
            if (!string.IsNullOrWhiteSpace(queryStr))
            {
                queryStr = queryStr.Replace(SpecialPrefix, EncodedSpecialPrefix);

                if (caseSensitive && propertyName == nameof(CodeSource.Content))
                {
                    propertyName = CodeIndexBuilder.GetCaseSensitiveField(nameof(CodeSource.Content));
                }

                queryStr = queryStr.Replace(EncodedDoubleQuotes, ReplaceEncodedDoubleQuotes).Replace(DoubleQuotes, ReplaceEncodedDoubleQuotes);

                if (!string.IsNullOrWhiteSpace(queryStr))
                {
                    if (queryStr.Contains(WildcardAsterisk))
                    {
                        queryStr = queryStr.Replace(EncodedAsterisk, ReplaceEncodedAsterisk);

                        if (!queryStr.Contains(WildcardAsterisk))
                        {
                            AddPhaseQueryWithoutWildcard(query, queryStr.Replace(ReplaceEncodedAsterisk, EncodedAsterisk), propertyName);
                        }
                        else
                        {
                            queryStr = queryStr.Replace(WildcardAsterisk, ReplaceWildcardAsterisk).Replace(ReplaceEncodedDoubleQuotes, DoubleQuotes).Replace(ReplaceEncodedAsterisk, WildcardAsterisk);

                            var words = new List <string>();

                            using (var tokenStream = LucenePoolLight.Analyzer.GetTokenStream(propertyName, queryStr))
                            {
                                var termAttr = tokenStream.GetAttribute <ICharTermAttribute>();

                                tokenStream.Reset();

                                while (tokenStream.IncrementToken())
                                {
                                    words.Add(termAttr.ToString());
                                }
                            }

                            if (words.Count > 0)
                            {
                                var phraseWords = new List <string>();

                                foreach (var word in words)
                                {
                                    if (word.StartsWith(ReplaceWildcardAsterisk))
                                    {
                                        // TODO: Support searching for "ABC * EDF"
                                        throw new NotImplementedException("Not support wildcard searching at top or wildcard only searching");
                                    }
                                    else
                                    {
                                        phraseWords.Add(word.Replace(WildcardAsterisk, EncodedAsterisk).Replace(ReplaceWildcardAsterisk, WildcardAsterisk).Replace(EncodedSpecialPrefix, SpecialPrefix));
                                    }
                                }

                                query.Add(CreatePhraseQuery(phraseWords, propertyName), Occur.MUST);
                            }
                        }
                    }
                    else
                    {
                        AddPhaseQueryWithoutWildcard(query, queryStr, propertyName);
                    }
                }
            }
        }