bitmapper 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|