[Groonga-mysql-commit] mroonga/mroonga [fix-for-visual-studio] [wrapper][fulltext] support boolean mode.

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Oct 4 10:25:48 JST 2012


Kouhei Sutou	2011-06-19 12:29:37 +0900 (Sun, 19 Jun 2011)

  New Revision: 70820de10fca4222e9123521d2dc60f057a31a6a
  https://github.com/mroonga/mroonga/commit/70820de10fca4222e9123521d2dc60f057a31a6a

  Log:
    [wrapper][fulltext] support boolean mode.

  Modified files:
    ha_mroonga.cc

  Modified: ha_mroonga.cc (+42 -9)
===================================================================
--- ha_mroonga.cc    2011-06-18 21:10:04 +0900 (fe1c94b)
+++ ha_mroonga.cc    2011-06-19 12:29:37 +0900 (4cda3d2)
@@ -3839,20 +3839,53 @@ FT_INFO *ha_mroonga::wrapper_ft_init_ext(uint flags, uint key_nr, String *key)
     table->key_info[table_share->primary_key].key_length;
 
   grn_obj *index_column = grn_index_columns[key_nr];
+  char index_column_name[GRN_TABLE_MAX_KEY_SIZE];
+  int index_column_name_length;
+  index_column_name_length = grn_obj_name(info->ctx,
+                                          index_column,
+                                          index_column_name,
+                                          GRN_TABLE_MAX_KEY_SIZE);
+  grn_obj *match_columns, *match_columns_variable;
+  GRN_EXPR_CREATE_FOR_QUERY(info->ctx, info->table, match_columns,
+                            match_columns_variable);
+  grn_expr_parse(info->ctx, match_columns,
+                 index_column_name, index_column_name_length,
+                 NULL, GRN_OP_MATCH, GRN_OP_AND,
+                 GRN_EXPR_SYNTAX_SCRIPT);
+
+  grn_obj *expression, *expression_variable;
+  GRN_EXPR_CREATE_FOR_QUERY(info->ctx, info->table,
+                            expression, expression_variable);
   if (flags & FT_BOOL) {
-    grn_query *query = grn_query_open(info->ctx, key->ptr(), key->length(),
-                                      GRN_OP_OR, MRN_MAX_EXPRS);
-    grn_obj_search(info->ctx, index_column, (grn_obj *)query, info->result,
-                   GRN_OP_OR, NULL);
-    grn_query_close(info->ctx, query);
+    const char *keyword = key->ptr();
+    uint keyword_length = key->length();
+    // WORKAROUND: ignore the first '+' to support "+apple macintosh" pattern.
+    if (keyword_length > 0 && keyword[0] == '+') {
+      keyword++;
+      keyword_length++;
+    }
+    grn_expr_flags expression_flags = GRN_EXPR_SYNTAX_QUERY;
+    grn_rc rc;
+    rc = grn_expr_parse(info->ctx, expression,
+                        keyword, keyword_length,
+                        match_columns, GRN_OP_MATCH, GRN_OP_OR,
+                        expression_flags);
+    // TODO: check rc
+    grn_table_select(info->ctx, info->table, expression,
+                     info->result, GRN_OP_OR);
   } else {
     grn_obj query;
     GRN_TEXT_INIT(&query, GRN_OBJ_DO_SHALLOW_COPY);
     GRN_TEXT_SET_REF(&query, key->ptr(), key->length());
-    grn_obj_search(info->ctx, index_column, &query, info->result,
-                   GRN_OP_OR, NULL);
-    grn_obj_unlink(ctx, &query);
-  }
+    grn_expr_append_obj(info->ctx, expression, match_columns, GRN_OP_PUSH, 1);
+    grn_expr_append_const(info->ctx, expression, &query, GRN_OP_PUSH, 1);
+    grn_expr_append_op(info->ctx, expression, GRN_OP_MATCH, 2);
+    grn_table_select(info->ctx, info->table, expression,
+                     info->result, GRN_OP_OR);
+    grn_obj_unlink(info->ctx, &query);
+  }
+  grn_obj_unlink(info->ctx, expression);
+  grn_obj_unlink(info->ctx, match_columns);
 
   DBUG_RETURN((FT_INFO *)info);
 }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-mysql-commit mailing list
Back to archive index