null+****@clear*****
null+****@clear*****
2011年 12月 18日 (日) 03:01:16 JST
Kentoku 2011-12-17 18:01:16 +0000 (Sat, 17 Dec 2011)
New Revision: 72bb62c0136ee2021395e163f1e434d26ac77616
Log:
support full count using index for wrapper. refs #1196
Modified files:
ha_mroonga.cc
ha_mroonga.h
Modified: ha_mroonga.cc (+87 -5)
===================================================================
--- ha_mroonga.cc 2011-12-16 02:04:30 +0000 (3f29e7e)
+++ ha_mroonga.cc 2011-12-17 18:01:16 +0000 (37f4626)
@@ -1428,12 +1428,17 @@ ulonglong ha_mroonga::table_flags() const
ulong ha_mroonga::wrapper_index_flags(uint idx, uint part, bool all_parts) const
{
ulong index_flags;
+ KEY key = table_share->key_info[idx];
MRN_DBUG_ENTER_METHOD();
- MRN_SET_WRAP_SHARE_KEY(share, table->s);
- MRN_SET_WRAP_TABLE_KEY(this, table);
- index_flags = wrap_handler->index_flags(idx, part, all_parts);
- MRN_SET_BASE_SHARE_KEY(share, table->s);
- MRN_SET_BASE_TABLE_KEY(this, table);
+ if (key.algorithm == HA_KEY_ALG_BTREE || key.algorithm == HA_KEY_ALG_UNDEF) {
+ MRN_SET_WRAP_SHARE_KEY(share, table->s);
+ MRN_SET_WRAP_TABLE_KEY(this, table);
+ index_flags = wrap_handler->index_flags(idx, part, all_parts);
+ MRN_SET_BASE_SHARE_KEY(share, table->s);
+ MRN_SET_BASE_TABLE_KEY(this, table);
+ } else {
+ index_flags = HA_ONLY_WHOLE_INDEX | HA_KEY_SCAN_NOT_ROR;
+ }
DBUG_RETURN(index_flags);
}
@@ -2290,6 +2295,7 @@ int ha_mroonga::wrapper_open(const char *name, int mode, uint test_if_locked)
MRN_SET_BASE_SHARE_KEY(share, table->s);
MRN_SET_BASE_TABLE_KEY(this, table);
init();
+ wrapper_overwrite_index_bits();
pk_keypart_map = make_prev_keypart_map(
table->key_info[table_share->primary_key].key_parts);
@@ -2438,6 +2444,51 @@ error:
DBUG_RETURN(error);
}
+void ha_mroonga::wrapper_overwrite_index_bits()
+{
+ uint i, j;
+ longlong table_option = table_flags();
+ MRN_DBUG_ENTER_METHOD();
+ table_share->keys_for_keyread.clear_all();
+ for (i = 0; i < table_share->fields; i++)
+ {
+ Field *field = table_share->field[i];
+ field->part_of_key.clear_all();
+ field->part_of_key_not_clustered.clear_all();
+ field->part_of_sortkey.clear_all();
+ }
+ for (i = 0; i < table_share->keys; i++) {
+ KEY *key_info = &table->s->key_info[i];
+ KEY_PART_INFO *key_part = key_info->key_part;
+ for (j = 0 ; j < key_info->key_parts; key_part++, j++)
+ {
+ Field *field = key_part->field;
+ if (field->key_length() == key_part->length &&
+ !(field->flags & BLOB_FLAG))
+ {
+ if (index_flags(i, j, 0) & HA_KEYREAD_ONLY)
+ {
+ table_share->keys_for_keyread.set_bit(i);
+ field->part_of_key.set_bit(i);
+ field->part_of_key_not_clustered.set_bit(i);
+ }
+ if (index_flags(i, j, 1) & HA_READ_ORDER)
+ field->part_of_sortkey.set_bit(i);
+ }
+ if (i == table_share->primary_key &&
+ (table_option & HA_PRIMARY_KEY_IN_READ_INDEX))
+ {
+ if (field->key_length() == key_part->length &&
+ !(field->flags & BLOB_FLAG))
+ field->part_of_key = table_share->keys_in_use;
+ if (field->part_of_sortkey.is_set(i))
+ field->part_of_sortkey = table_share->keys_in_use;
+ }
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
int ha_mroonga::storage_open(const char *name, int mode, uint test_if_locked)
{
int error = 0;
@@ -8597,6 +8648,37 @@ void ha_mroonga::change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg)
DBUG_VOID_RETURN;
}
+bool ha_mroonga::wrapper_primary_key_is_clustered()
+{
+ bool res;
+ MRN_DBUG_ENTER_METHOD();
+ MRN_SET_WRAP_SHARE_KEY(share, table->s);
+ MRN_SET_WRAP_TABLE_KEY(this, table);
+ res = wrap_handler->primary_key_is_clustered();
+ MRN_SET_BASE_SHARE_KEY(share, table->s);
+ MRN_SET_BASE_TABLE_KEY(this, table);
+ DBUG_RETURN(res);
+}
+
+bool ha_mroonga::storage_primary_key_is_clustered()
+{
+ MRN_DBUG_ENTER_METHOD();
+ DBUG_RETURN(handler::primary_key_is_clustered());
+}
+
+bool ha_mroonga::primary_key_is_clustered()
+{
+ MRN_DBUG_ENTER_METHOD();
+ bool res;
+ if (share->wrapper_mode)
+ {
+ res = wrapper_primary_key_is_clustered();
+ } else {
+ res = storage_primary_key_is_clustered();
+ }
+ DBUG_RETURN(res);
+}
+
#ifdef __cplusplus
}
#endif
Modified: ha_mroonga.h (+4 -0)
===================================================================
--- ha_mroonga.h 2011-12-16 02:04:30 +0000 (3dedfef)
+++ ha_mroonga.h 2011-12-17 18:01:16 +0000 (2ab0b1c)
@@ -356,6 +356,7 @@ protected:
int index_last(uchar *buf);
#endif
void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
+ bool primary_key_is_clustered();
private:
void push_warning_unsupported_spatial_index_search(enum ha_rkey_function flag);
@@ -422,6 +423,7 @@ private:
int open_table(const char *name);
int storage_open_columns(void);
int storage_open_indexes(const char *name);
+ void wrapper_overwrite_index_bits();
int wrapper_close();
int storage_close();
int mrn_extra(enum ha_extra_function operation);
@@ -692,6 +694,8 @@ private:
int storage_start_stmt(THD *thd, thr_lock_type lock_type);
void wrapper_change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
void storage_change_table_ptr(TABLE *table_arg, TABLE_SHARE *share_arg);
+ bool wrapper_primary_key_is_clustered();
+ bool storage_primary_key_is_clustered();
};
#ifdef __cplusplus