35 #include <drizzled/sql_sort.h>
36 #include <drizzled/session.h>
37 #include <drizzled/sql_list.h>
38 #include <drizzled/internal/iocache.h>
39 #include <drizzled/unique.h>
40 #include <drizzled/table.h>
42 #if defined(CMATH_NAMESPACE)
43 using namespace CMATH_NAMESPACE;
50 int unique_write_to_ptrs(
unsigned char* key,
51 uint32_t, Unique *unique)
53 memcpy(unique->record_pointers, key, unique->size);
54 unique->record_pointers+=unique->size;
58 Unique::Unique(qsort_cmp2 comp_func,
void * comp_func_fixed_arg,
59 uint32_t size_arg,
size_t max_in_memory_size_arg)
60 : max_in_memory_size(max_in_memory_size_arg),
65 tree.init_tree(0, 0, size, comp_func,
false,
66 NULL, comp_func_fixed_arg);
85 inline double log2_n_fact(
double x)
87 return (log(2*M_PI*x)/2 + x*log(x/M_E)) / M_LN2;
141 double Unique::get_use_cost(uint32_t *, uint32_t nkeys, uint32_t key_size,
142 size_t max_in_memory_size_arg)
144 ulong max_elements_in_tree;
145 ulong last_tree_elems;
148 max_elements_in_tree= ((ulong) max_in_memory_size_arg /
149 ALIGN_SIZE(
sizeof(Tree_Element)+key_size));
151 last_tree_elems= nkeys % max_elements_in_tree;
154 result= 2*log2_n_fact(last_tree_elems + 1.0);
175 assert(elements == 0);
199 bool Unique::walk(tree_walk_action action,
void *walk_action_arg)
201 return tree.tree_walk(action, walk_action_arg, left_root_right);
209 bool Unique::get(Table *table)
211 table->sort.found_records= elements+tree.getElementsInTree();
213 if ((record_pointers=table->sort.record_pointers= (
unsigned char*)
214 malloc(size * tree.getElementsInTree())))
216 (void) tree.tree_walk((tree_walk_action) unique_write_to_ptrs,
217 this, left_root_right);
#define TIME_FOR_COMPARE_ROWID