24 #include "../lib/grn-assertions.h"
26 static gchar *tmp_directory;
30 static grn_obj *cond, *res, *expr;
62 g_free(tmp_directory);
68 cut_remove_path(tmp_directory, NULL);
69 g_mkdir_with_parents(tmp_directory, 0700);
70 path = g_build_filename(tmp_directory,
"text-expr-parse", NULL);
97 cut_remove_path(tmp_directory, NULL);
101 static grn_obj *properties, *docs, *terms, *size, *body, *
author, *index_body;
104 insert_document(
const gchar *author_content,
const gchar *body_content)
106 uint32_t s = (uint32_t)strlen(body_content);
109 if (author_content) {
110 GRN_TEXT_SET(&context, &textbuf, author_content, strlen(author_content));
124 #define INSERT_DOCUMENT(author, body) \
125 cut_trace(insert_document(author, body))
127 static void grn_test_assert_select_all(
grn_obj *result);
128 static void grn_test_assert_select_none(
grn_obj *result);
131 grn_test_assert_select_all(
grn_obj *result)
134 gcut_take_new_list_string(
"hoge",
139 "hoge moge moge moge",
141 "moge hoge fuga fuga",
142 "moge hoge moge moge moge",
151 grn_test_assert_select_none(
grn_obj *result)
157 create_properties_table(
void)
159 const gchar *table_name =
"properties";
160 properties =
grn_table_create(&context, table_name, strlen(table_name), NULL,
163 cut_assert_not_null(properties);
167 create_documents_table(
void)
171 cut_assert_not_null(docs);
176 cut_assert_not_null(size);
181 cut_assert_not_null(body);
186 cut_assert_not_null(author);
190 create_terms_table(
void)
195 cut_assert_not_null(terms);
202 cut_assert_not_null(index_body);
226 create_properties_table();
227 create_documents_table();
228 create_terms_table();
232 #define PARSE(expr,str,flags) \
233 grn_test_assert(grn_expr_parse(&context, (expr), (str), strlen(str), \
234 body, GRN_OP_MATCH, GRN_OP_AND, flags))
239 #define ADD_DATUM(label, \
240 query_hoge_moge, query_hoge_moge_parse_level, \
241 query_poyo, query_poyo_parse_level, \
242 query_size, query_size_parse_level) \
243 gcut_add_datum(label, \
244 "query_hoge_moge", G_TYPE_STRING, query_hoge_moge, \
245 "query_hoge_moge_parse_level", \
246 G_TYPE_INT, query_hoge_moge_parse_level, \
247 "query_poyo", G_TYPE_STRING, query_poyo, \
248 "query_poyo_parse_level", \
249 G_TYPE_INT, query_poyo_parse_level, \
250 "query_size", G_TYPE_STRING, query_size, \
251 "query_size_parse_level", \
252 G_TYPE_INT, query_size_parse_level, \
261 "body:@hoge + body:@moge",
266 "body@\"hoge\" && body@\"moge\"",
281 cut_assert_not_null(cond);
283 cut_assert_not_null(v);
285 PARSE(cond, gcut_data_get_string(data,
"query_hoge_moge"),
286 gcut_data_get_int(data,
"query_hoge_moge_parse_level"));
287 PARSE(cond, gcut_data_get_string(data,
"query_poyo"),
288 gcut_data_get_int(data,
"query_poyo_parse_level"));
291 "noname($1:0){2body GET_VALUE,0\"hoge\",4MATCH,"
292 "2body GET_VALUE,0\"moge\",0MATCH,4AND,"
293 "2body GET_VALUE,0\"poyo\",0MATCH,0AND}",
297 cut_assert_not_null(res);
301 gcut_take_new_list_string(
"poyo moge hoge "
312 cut_assert_not_null(cond);
314 cut_assert_not_null(v);
316 PARSE(cond, gcut_data_get_string(data,
"query_size"),
317 gcut_data_get_int(data,
"query_size_parse_level"));
319 "noname($1:0){2size GET_VALUE,014,0EQUAL}",
323 cut_assert_not_null(res);
327 gcut_take_new_list_string(
"moge moge moge",
343 cut_assert_not_null(cond);
344 cut_assert_not_null(v);
345 PARSE(cond,
"size:14",
348 cut_assert_not_null(res);
350 gcut_take_new_list_string(
"moge moge moge",
372 cut_assert_not_null(tc);
381 cut_assert_not_null(res);
382 grn_test_assert_select_all(res);
393 cut_assert_not_null(cond);
394 cut_assert_not_null(v);
395 PARSE(cond,
"size:14",
398 cut_assert_not_null(res);
400 gcut_take_new_list_string(
"moge moge moge",
419 cut_assert_not_null(tc);
428 cut_assert_not_null(res);
429 grn_test_assert_select_all(res);
440 cut_assert_not_null(cond);
441 cut_assert_not_null(v);
442 PARSE(cond,
"size:14",
445 cut_assert_not_null(res);
447 gcut_take_new_list_string(
"moge moge moge",
462 cut_assert_not_null(tc);
471 cut_assert_not_null(res);
472 grn_test_assert_select_all(res);
483 cut_assert_not_null(cond);
484 cut_assert_not_null(v);
485 PARSE(cond,
"size:>14",
488 cut_assert_not_null(res);
490 gcut_take_new_list_string(
"hoge moge moge moge",
491 "moge hoge fuga fuga",
492 "moge hoge moge moge moge",
507 cut_assert_not_null(tc);
516 cut_assert_not_null(res);
517 grn_test_assert_select_none(res);
528 cut_assert_not_null(cond);
529 cut_assert_not_null(v);
530 PARSE(cond,
"size:>0",
533 cut_assert_not_null(res);
534 grn_test_assert_select_all(res);
539 PARSE(expr,
"_score = size",
547 cut_assert_not_null(cond);
548 cut_assert_not_null(v);
549 PARSE(cond,
"_score:>9",
552 cut_assert_not_null(res2);
554 gcut_take_new_list_string(
"moge moge moge",
556 "hoge moge moge moge",
558 "moge hoge fuga fuga",
559 "moge hoge moge moge moge",
581 cut_assert_not_null(cond);
582 cut_assert_not_null(v);
583 PARSE(cond,
"_key:moge",
586 cut_assert_not_null(res);
594 cut_assert_not_null(cond);
595 cut_assert_not_null(v);
596 PARSE(cond,
"_key:poge",
599 cut_assert_not_null(res);
622 cut_assert_not_null(cond);
623 cut_assert_not_null(v);
624 PARSE(cond,
"_value:1",
627 cut_assert_not_null(res);
642 cut_assert_not_null(cond);
643 cut_assert_not_null(v);
644 PARSE(cond,
"_value:5",
647 cut_assert_not_null(res);
659 cut_assert_not_null(expr);
661 PARSE(expr,
"search engine column",
667 unsigned int width, max_results;
668 const char *open_tags[] = {
"[[",
"<"};
669 const char *close_tags[] = {
"]]",
">"};
670 unsigned int open_tag_lens[] = {2, 1};
671 unsigned int close_tag_lens[] = {2, 1};
672 unsigned int n_results;
673 unsigned int max_tagged_len;
675 unsigned int result_len;
677 "groonga is an open-source fulltext search engine and column store.\n"
678 "It lets you write high-performance applications that requires "
685 sizeof(open_tags) /
sizeof(open_tags[0]),
686 open_tags, open_tag_lens,
687 close_tags, close_tag_lens,
689 cut_assert_not_null(snip);
692 &n_results, &max_tagged_len));
694 cut_assert_equal_uint(2, n_results);
695 cut_assert_equal_uint(111, max_tagged_len);
696 result = g_new(gchar, max_tagged_len);
697 cut_take_memory(result);
700 cut_assert_equal_string(
"groonga is an open-source fulltext "
701 "[[search]] <engine> and [[column]] store.\n"
702 "It lets you write high-performanc",
704 cut_assert_equal_uint(110, result_len);
707 cut_assert_equal_string(
"e applications that requires "
708 "fulltext [[search]].",
710 cut_assert_equal_uint(49, result_len);
724 cut_assert_not_null(expr);
726 PARSE(expr,
"search engine column",
732 unsigned int width, max_results;
733 unsigned int n_results;
734 unsigned int max_tagged_len;
736 unsigned int result_len;
738 "groonga is an open-source fulltext search engine and column store.\n"
739 "It lets you write high-performance applications that requires "
750 cut_assert_not_null(snip);
753 &n_results, &max_tagged_len));
755 cut_assert_equal_uint(2, n_results);
756 cut_assert_equal_uint(101, max_tagged_len);
757 result = g_new(gchar, max_tagged_len);
758 cut_take_memory(result);
761 cut_assert_equal_string(
"groonga is an open-source fulltext "
762 "search engine and column store.\n"
763 "It lets you write high-performanc",
765 cut_assert_equal_uint(100, result_len);
768 cut_assert_equal_string(
"e applications that requires "
771 cut_assert_equal_uint(45, result_len);
778 parse_numeric_literal(
const char *str_expr)
784 cut_assert_not_null(expr);
786 cut_assert_not_null(var);
805 const char *str_expr =
"var = 3.14159265";
807 var = parse_numeric_literal(str_expr);
816 const char *str_expr =
"var = 123456";
818 var = parse_numeric_literal(str_expr);
827 const char *str_expr =
"var = 3456789012";
829 var = parse_numeric_literal(str_expr);
838 const char *str_expr =
"var = 123456789012";
840 var = parse_numeric_literal(str_expr);
842 cut_assert_equal_int_least64(G_GINT64_CONSTANT(123456789012),
850 const char *str_expr =
"var = 12345678901234567890";
852 var = parse_numeric_literal(str_expr);
856 cut_assert_equal_double(12345678901234567890., 100000.,
GRN_FLOAT_VALUE(var));
867 cut_assert_not_null(cond);
868 cut_assert_not_null(v);
871 "noname($1:0){2author GET_VALUE,0\"morita\",0EQUAL}",