Compiler* PhraseQuery_Make_Compiler_IMP(PhraseQuery *self, Searcher *searcher, float boost, bool subordinate) { PhraseQueryIVARS *const ivars = PhraseQuery_IVARS(self); if (Vec_Get_Size(ivars->terms) == 1) { // Optimize for one-term "phrases". Obj *term = Vec_Fetch(ivars->terms, 0); TermQuery *term_query = TermQuery_new(ivars->field, term); TermCompiler *term_compiler; TermQuery_Set_Boost(term_query, ivars->boost); term_compiler = (TermCompiler*)TermQuery_Make_Compiler(term_query, searcher, boost, subordinate); DECREF(term_query); return (Compiler*)term_compiler; } else { PhraseCompiler *compiler = PhraseCompiler_new(self, searcher, boost); if (!subordinate) { PhraseCompiler_Normalize(compiler); } return (Compiler*)compiler; } }
Compiler* PhraseQuery_make_compiler(PhraseQuery *self, Searcher *searcher, float boost) { if (VA_Get_Size(self->terms) == 1) { // Optimize for one-term "phrases". Obj *term = VA_Fetch(self->terms, 0); TermQuery *term_query = TermQuery_new(self->field, term); TermCompiler *term_compiler; TermQuery_Set_Boost(term_query, self->boost); term_compiler = (TermCompiler*)TermQuery_Make_Compiler(term_query, searcher, boost); DECREF(term_query); return (Compiler*)term_compiler; } else { return (Compiler*)PhraseCompiler_new(self, searcher, boost); } }
Query* QParser_Make_Term_Query_IMP(QueryParser *self, String *field, Obj *term) { UNUSED_VAR(self); return (Query*)TermQuery_new(field, term); }
static void test_Create_Excerpt(TestBatchRunner *runner, Searcher *searcher, Obj *query, Hits *hits) { String *content = (String*)SSTR_WRAP_UTF8("content", 7); Highlighter *highlighter = Highlighter_new(searcher, query, content, 200); HitDoc *hit = Hits_Next(hits); String *excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "<strong>Φ</strong> a b c d <strong>x y z</strong>", 54) >= 0, "highlighter tagged phrase and single term"); DECREF(excerpt); String *pre_tag = (String*)SSTR_WRAP_UTF8("\x1B[1m", 4); Highlighter_Set_Pre_Tag(highlighter, pre_tag); String *post_tag = (String*)SSTR_WRAP_UTF8("\x1B[0m", 4); Highlighter_Set_Post_Tag(highlighter, post_tag); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "\x1B[1mΦ\x1B[0m a b c d \x1B[1mx y z\x1B[0m", 36) >= 0, "set_pre_tag and set_post_tag"); DECREF(excerpt); DECREF(hit); hit = Hits_Next(hits); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "x", 1) >= 0, "excerpt field with partial hit doesn't cause highlighter freakout"); DECREF(excerpt); DECREF(hit); DECREF(highlighter); query = (Obj*)SSTR_WRAP_UTF8("x \"x y z\" AND b", 15); hits = Searcher_Hits(searcher, query, 0, 10, NULL); highlighter = Highlighter_new(searcher, query, content, 200); hit = Hits_Next(hits); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "<strong>b</strong> c d <strong>x y z</strong>", 45) >= 0, "query with same word in both phrase and term doesn't cause freakout"); DECREF(excerpt); DECREF(hit); DECREF(highlighter); DECREF(hits); query = (Obj*)SSTR_WRAP_UTF8("blind", 5); hits = Searcher_Hits(searcher, query, 0, 10, NULL); highlighter = Highlighter_new(searcher, query, content, 200); hit = Hits_Next(hits); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, """, 6) >= 0, "HTML entity encoded properly"); DECREF(excerpt); DECREF(hit); DECREF(highlighter); DECREF(hits); query = (Obj*)SSTR_WRAP_UTF8("why", 3); hits = Searcher_Hits(searcher, query, 0, 10, NULL); highlighter = Highlighter_new(searcher, query, content, 200); hit = Hits_Next(hits); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "Φ", 6) == -1, "no ellipsis for short excerpt"); DECREF(excerpt); DECREF(hit); DECREF(highlighter); DECREF(hits); Obj *term = (Obj*)SSTR_WRAP_UTF8("x", 1); query = (Obj*)TermQuery_new(content, term); hits = Searcher_Hits(searcher, query, 0, 10, NULL); hit = Hits_Next(hits); highlighter = Highlighter_new(searcher, query, content, 200); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "strong", 5) >= 0, "specify field highlights correct field..."); DECREF(excerpt); DECREF(highlighter); String *alt = (String*)SSTR_WRAP_UTF8("alt", 3); highlighter = Highlighter_new(searcher, query, alt, 200); excerpt = Highlighter_Create_Excerpt(highlighter, hit); TEST_TRUE(runner, Str_Find_Utf8(excerpt, "strong", 5) == -1, "... but not another field"); DECREF(excerpt); DECREF(highlighter); DECREF(hit); DECREF(hits); DECREF(query); }