[Groonga-mysql-commit] mroonga/mroonga [master] improve fulltext search condition detection.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 2月 2日 (木) 14:50:18 JST


Kouhei Sutou	2012-02-02 14:50:18 +0900 (Thu, 02 Feb 2012)

  New Revision: 2ef24a1c95c614f5280d58254c6fe63435224285

  Log:
    improve fulltext search condition detection.

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+22 -38)
===================================================================
--- ha_mroonga.cc    2012-02-02 14:38:27 +0900 (c8c8588)
+++ ha_mroonga.cc    2012-02-02 14:50:18 +0900 (f9dbe78)
@@ -6721,6 +6721,26 @@ void ha_mroonga::check_count_skip(key_part_map start_key_part_map,
   DBUG_VOID_RETURN;
 }
 
+bool ha_mroonga::is_fulltext_search_item(Item *item)
+{
+  MRN_DBUG_ENTER_METHOD();
+
+  if (!item) {
+    DBUG_RETURN(false);
+  }
+
+  if (item->type() != Item::FUNC_ITEM) {
+    DBUG_RETURN(false);
+  }
+
+  Item_func *func_item = (Item_func *)item;
+  if (func_item->functype() != Item_func::FT_FUNC) {
+    DBUG_RETURN(false);
+  }
+
+  DBUG_RETURN(true);
+}
+
 void ha_mroonga::check_fast_order_limit(grn_table_sort_key **sort_keys,
                                         int *n_sort_keys,
                                         longlong *limit,
@@ -6774,50 +6794,14 @@ void ha_mroonga::check_fast_order_limit(grn_table_sort_key **sort_keys,
       fast_order_limit = FALSE;
       DBUG_VOID_RETURN;
     }
-    Item *info = (Item *)select_lex->item_list.first_node()->info;
-    Item *where;
-    where = select_lex->where;
-    if (!where ||
-        where->type() != Item::FUNC_ITEM ||
-        ((Item_func *)where)->functype() != Item_func::FT_FUNC) {
+    Item *where = select_lex->where;
+    if (!is_fulltext_search_item(where)) {
       DBUG_PRINT("info",
                  ("mroonga: fast_order_limit = FALSE: not fulltext search"));
       fast_order_limit = FALSE;
       DBUG_VOID_RETURN;
     }
     Item_func *match_against = (Item_func *)where;
-    where = where->next;
-    if (!where ||
-        where->type() != Item::STRING_ITEM) {
-      DBUG_PRINT("info", ("mroonga: fast_order_limit = FALSE"));
-      fast_order_limit = FALSE;
-      DBUG_VOID_RETURN;
-    }
-    where = where->next;
-    if (!where ||
-        where->type() != Item::FIELD_ITEM) {
-      DBUG_PRINT("info", ("mroonga: fast_order_limit = FALSE"));
-      fast_order_limit = FALSE;
-      DBUG_VOID_RETURN;
-    }
-    for (where = where->next; where; where = where->next) {
-      if (grn_columns && where->type() == Item::FIELD_ITEM)
-        continue;
-      if (where->type() == Item::FUNC_ITEM && match_against->eq(where, true)) {
-        for (uint i = 0; i < match_against->arg_count; i++) {
-          where = where->next;
-        }
-        continue;
-      }
-      if (where == info)
-        continue;
-      break;
-    }
-    if (where && (where != info || !where->eq(info, true))) {
-      DBUG_PRINT("info", ("mroonga: fast_order_limit = FALSE"));
-      fast_order_limit = FALSE;
-      DBUG_VOID_RETURN;
-    }
     *n_sort_keys = select_lex->order_list.elements;
     *sort_keys = (grn_table_sort_key *)malloc(sizeof(grn_table_sort_key) *
                                               *n_sort_keys);

  Modified: ha_mroonga.h (+1 -0)
===================================================================
--- ha_mroonga.h    2012-02-02 14:38:27 +0900 (d641573)
+++ ha_mroonga.h    2012-02-02 14:50:18 +0900 (4ec61fc)
@@ -411,6 +411,7 @@ private:
 #endif
   void check_count_skip(key_part_map start_key_part_map,
                         key_part_map end_key_part_map, bool fulltext);
+  bool is_fulltext_search_item(Item *item);
   void check_fast_order_limit(grn_table_sort_key **sort_keys, int *n_sort_keys,
                               longlong *limit,
                               grn_obj *target_table, grn_obj *score_column);




Groonga-mysql-commit メーリングリストの案内
Back to archive index