bitmapper 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/bitmapper/bit_mapper_wrap.c +24 -13
- data/ext/bitmapper/bit_mapper_wrap.h +8 -3
- data/ext/bitmapper/bitmapper.c +37 -12
- metadata +2 -2
@@ -29,7 +29,8 @@ void allocate_map(Bitmapper* map, int index_len){
|
|
29
29
|
map->bkt_size = pow(10, 10 - index_len);
|
30
30
|
map->bkt_count = size;
|
31
31
|
map->index_len = index_len;
|
32
|
-
map->
|
32
|
+
map->filter_enabled = 0;
|
33
|
+
map->filter_status = bit_bucket_create(size);
|
33
34
|
sprintf(map->fill_str, "%%llu%%0%illu\n",10-index_len);
|
34
35
|
}
|
35
36
|
|
@@ -46,19 +47,29 @@ void free_map(Bitmapper* map){
|
|
46
47
|
map->bkts[i] = NULL;
|
47
48
|
}
|
48
49
|
}
|
49
|
-
if(map->
|
50
|
+
if(map->filter_status != NULL) bit_bucket_free(map->filter_status);
|
50
51
|
if(map->bkts != NULL) free(map->bkts);
|
51
52
|
}
|
52
53
|
|
53
|
-
void
|
54
|
-
|
55
|
-
map->white_list_char = (char*)malloc(sizeof(char));
|
56
|
-
map->white_list_char[0] = c;
|
54
|
+
void enable_filter(Bitmapper* map){
|
55
|
+
map->filter_enabled = 1;
|
57
56
|
}
|
58
57
|
|
59
|
-
void
|
60
|
-
|
61
|
-
|
58
|
+
void disable_filter(Bitmapper* map){
|
59
|
+
map->filter_enabled = 0;
|
60
|
+
}
|
61
|
+
|
62
|
+
int set_in_filter(Bitmapper* map, unsigned long long int number){
|
63
|
+
map->filter_enabled = 1;
|
64
|
+
return bit_bucket_set_bit(map->filter_status, number);
|
65
|
+
}
|
66
|
+
|
67
|
+
int status_for_filter(Bitmapper* map, unsigned long long int number){
|
68
|
+
return bit_bucket_get_bit(map->filter_status, number);
|
69
|
+
}
|
70
|
+
|
71
|
+
int clear_in_filter(Bitmapper* map, unsigned long long int number){
|
72
|
+
return bit_bucket_clear_bit(map->filter_status, number);
|
62
73
|
}
|
63
74
|
|
64
75
|
/*
|
@@ -73,6 +84,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){
|
|
73
84
|
|
74
85
|
/*
|
75
86
|
Adds the given number to the bucket reperesented by the given index
|
87
|
+
if filter is enabled and the index is set in filter_status
|
76
88
|
@param Bitmapper* the mapepr object to use
|
77
89
|
@param unsigned long long int the offset to be added(if the offset is greater
|
78
90
|
than bucket size it is rejected)
|
@@ -80,6 +92,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){
|
|
80
92
|
*/
|
81
93
|
int add_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
|
82
94
|
if(bkt_index > map->bkt_count) return 1;
|
95
|
+
if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
|
83
96
|
if((map->bkts[bkt_index]) == NULL)
|
84
97
|
map->bkts[bkt_index] = (BitBucket*)create_bucket_for(map->bkts[bkt_index], map->bkt_size);
|
85
98
|
if(bit_bucket_set_bit(map->bkts[bkt_index], offset) != 0){
|
@@ -112,6 +125,7 @@ int add_num(Bitmapper* map,unsigned long long int full_num){
|
|
112
125
|
*/
|
113
126
|
int remove_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
|
114
127
|
if(bkt_index > map->bkt_count) return 1;
|
128
|
+
if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
|
115
129
|
if(map->bkts[bkt_index] == NULL)
|
116
130
|
return 0;
|
117
131
|
if(bit_bucket_clear_bit(map->bkts[bkt_index], offset) != 0){
|
@@ -177,10 +191,7 @@ int add_numbers_in_file(Bitmapper* map,FILE *in){
|
|
177
191
|
sprintf(scan_str, "%%%is%%%is\n",map->index_len, 10-map->index_len);
|
178
192
|
while(fgets(msisdn, 15, in)!=NULL){
|
179
193
|
sscanf(msisdn,scan_str, index, rest_num);
|
180
|
-
|
181
|
-
}else{
|
182
|
-
add_num_in_bkt(map, atoll(rest_num), atoll(index) );
|
183
|
-
}
|
194
|
+
add_num_in_bkt(map, atoll(rest_num), atoll(index) );
|
184
195
|
}
|
185
196
|
}
|
186
197
|
|
@@ -12,16 +12,21 @@ typedef struct Bitmapper{
|
|
12
12
|
unsigned long long int bkt_size; /* size of each bucket in bits */
|
13
13
|
/* the format specifier used to dump number to file from buckets */
|
14
14
|
int index_len;
|
15
|
-
char *white_list_char;
|
16
15
|
char fill_str[20];
|
16
|
+
int filter_enabled;
|
17
|
+
BitBucket* filter_status;
|
17
18
|
} Bitmapper;
|
18
19
|
|
19
20
|
Bitmapper* create_map();
|
20
21
|
void allocate_map(Bitmapper*, int);
|
21
22
|
void free_map(Bitmapper*);
|
22
23
|
BitBucket* create_bucket_for(BitBucket*, unsigned long long int);
|
23
|
-
|
24
|
-
void
|
24
|
+
|
25
|
+
void enable_filter(Bitmapper*);
|
26
|
+
void disable_filter(Bitmapper*);
|
27
|
+
int set_for_filter(Bitmapper* , unsigned long long int);
|
28
|
+
int status_for_filter(Bitmapper*, unsigned long long int );
|
29
|
+
int clear_in_filter(Bitmapper*, unsigned long long int);
|
25
30
|
|
26
31
|
int add_num_in_bkt(Bitmapper* ,unsigned long long int, unsigned long long int);
|
27
32
|
int add_num(Bitmapper* ,unsigned long long int);
|
data/ext/bitmapper/bitmapper.c
CHANGED
@@ -192,26 +192,47 @@ VALUE bm_num_status(VALUE self, VALUE num){
|
|
192
192
|
return (VALUE)Qfalse;
|
193
193
|
}
|
194
194
|
|
195
|
+
VALUE bm_enable_filter(VALUE self){
|
196
|
+
Bitmapper* map;
|
197
|
+
Data_Get_Struct(self, Bitmapper, map);
|
198
|
+
enable_filter(map);
|
199
|
+
return self;
|
200
|
+
}
|
195
201
|
|
196
|
-
VALUE
|
197
|
-
|
198
|
-
|
202
|
+
VALUE bm_disable_filter(VALUE self){
|
203
|
+
Bitmapper* map;
|
204
|
+
Data_Get_Struct(self, Bitmapper, map);
|
205
|
+
disable_filter(map);
|
206
|
+
return self;
|
207
|
+
}
|
208
|
+
|
209
|
+
VALUE bm_set_filters(VALUE self, VALUE val){
|
210
|
+
int i;
|
199
211
|
Bitmapper* map;
|
212
|
+
VALUE tmp;
|
200
213
|
|
214
|
+
if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
|
201
215
|
Data_Get_Struct(self, Bitmapper, map);
|
202
|
-
|
203
|
-
|
204
|
-
|
216
|
+
for(i=0; i< RARRAY_LEN(val); i++){
|
217
|
+
tmp = RARRAY_PTR(val)[i];
|
218
|
+
tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
|
219
|
+
set_in_filter(map, bm_to_ll(tmp));
|
220
|
+
}
|
205
221
|
return (VALUE)Qtrue;
|
206
222
|
}
|
207
223
|
|
208
|
-
VALUE
|
209
|
-
int
|
210
|
-
VALUE return_val;
|
224
|
+
VALUE bm_clear_filters(VALUE self, VALUE val){
|
225
|
+
int i;
|
211
226
|
Bitmapper* map;
|
227
|
+
VALUE tmp;
|
212
228
|
|
229
|
+
if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
|
213
230
|
Data_Get_Struct(self, Bitmapper, map);
|
214
|
-
|
231
|
+
for(i=0; i< RARRAY_LEN(val); i++){
|
232
|
+
tmp = RARRAY_PTR(val)[i];
|
233
|
+
tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
|
234
|
+
clear_in_filter(map, bm_to_ll(tmp));
|
235
|
+
}
|
215
236
|
return (VALUE)Qtrue;
|
216
237
|
}
|
217
238
|
|
@@ -224,8 +245,12 @@ void Init_bitmapper(){
|
|
224
245
|
rb_define_method(rb_cBitmapper, "add", bm_add_from_file, 1);
|
225
246
|
rb_define_method(rb_cBitmapper, "remove", bm_remove_from_file, 1);
|
226
247
|
rb_define_method(rb_cBitmapper, "dump_to", bm_dump_to_file, 1);
|
227
|
-
|
228
|
-
rb_define_method(rb_cBitmapper, "
|
248
|
+
|
249
|
+
rb_define_method(rb_cBitmapper, "enable_filter", bm_enable_filter, 0);
|
250
|
+
rb_define_method(rb_cBitmapper, "disable_filter", bm_disable_filter, 0);
|
251
|
+
rb_define_method(rb_cBitmapper, "set_filters", bm_set_filters, 1);
|
252
|
+
rb_define_method(rb_cBitmapper, "clear_filters", bm_clear_filters, 1);
|
253
|
+
|
229
254
|
rb_define_method(rb_cBitmapper, "load_from_str", bm_load_str_to_bkt, 2);
|
230
255
|
rb_define_method(rb_cBitmapper, "dump_to_str", bm_dump_bkt_str, 2);
|
231
256
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitmapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A fast, in-memory, bit map filter!
|
15
15
|
email: gouthamvel@gmail.com
|