whistlepig 0.10 → 0.11

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.
@@ -447,6 +447,44 @@ static VALUE query_or(VALUE self, VALUE v_other) {
447
447
  return o_result;
448
448
  }
449
449
 
450
+ /*
451
+ * call-seq: snippetize(field, string, max_num_results=10)
452
+ *
453
+ * Returns an array of [start, end] subarrays that mark the matching positions of
454
+ * the query within the string. 'field' determines which field the string is
455
+ * taken to be.
456
+ *
457
+ */
458
+ static VALUE query_snippetize(int argc, VALUE* argv, VALUE self) {
459
+ VALUE v_field, v_string, v_max_num_results;
460
+ rb_scan_args(argc, argv, "21", &v_field, &v_string, &v_max_num_results);
461
+ Check_Type(v_string, T_STRING);
462
+
463
+ wp_query* query; Data_Get_Struct(self, wp_query, query);
464
+ uint32_t num_results, max_num_results;
465
+ if(NIL_P(v_max_num_results)) max_num_results = 10;
466
+ else max_num_results = NUM2INT(v_max_num_results);
467
+
468
+ uint32_t* start_offsets = malloc(sizeof(uint32_t) * max_num_results);
469
+ uint32_t* end_offsets = malloc(sizeof(uint32_t) * max_num_results);
470
+
471
+ wp_error* e = wp_snippetize_string(query, RSTRING_PTR(v_field), RSTRING_PTR(v_string), max_num_results, &num_results, start_offsets, end_offsets);
472
+ RAISE_IF_NECESSARY(e);
473
+
474
+ VALUE array = rb_ary_new2(num_results);
475
+ for(uint32_t i = 0; i < num_results; i++) {
476
+ VALUE subarray = rb_ary_new2(2);
477
+ rb_ary_store(subarray, 0, INT2NUM(start_offsets[i]));
478
+ rb_ary_store(subarray, 1, INT2NUM(end_offsets[i]));
479
+ rb_ary_store(array, i, subarray);
480
+ }
481
+
482
+ free(start_offsets);
483
+ free(end_offsets);
484
+
485
+ return array;
486
+ }
487
+
450
488
  static VALUE query_init(VALUE self, VALUE query) {
451
489
  rb_iv_set(self, "@query", query);
452
490
  return self;
@@ -568,6 +606,7 @@ void Init_whistlepig() {
568
606
  rb_define_method(c_query, "to_s", query_to_s, 0);
569
607
  rb_define_method(c_query, "clone", query_clone, 0);
570
608
  rb_define_method(c_query, "term_map", query_map_terms, 0);
609
+ rb_define_method(c_query, "snippetize", query_snippetize, -1);
571
610
  rb_define_attr(c_query, "query", 1, 0);
572
611
 
573
612
  c_error = rb_define_class_under(m_whistlepig, "Error", rb_eStandardError);
@@ -12,6 +12,8 @@
12
12
  #include "query-parser.h"
13
13
  #include "lock.h"
14
14
  #include "error.h"
15
+ #include "rarray.h"
16
+ #include "snippeter.h"
15
17
 
16
18
  // see comments in index.c
17
19
  char* strdup(const char* old);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whistlepig
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.10'
4
+ version: '0.11'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-01 00:00:00.000000000 Z
12
+ date: 2012-04-10 00:00:00.000000000 -07:00
13
+ default_executable:
13
14
  dependencies: []
14
15
  description: Whistlepig is a minimalist realtime full-text search index. Its goal
15
16
  is to be as small and minimally-featured as possible, while still remaining useful,
@@ -27,40 +28,45 @@ files:
27
28
  - COPYING
28
29
  - ext/whistlepig/extconf.rb
29
30
  - lib/whistlepig.rb
31
+ - ext/whistlepig/query-parser.lex.h
32
+ - ext/whistlepig/entry.h
33
+ - ext/whistlepig/lock.c
34
+ - ext/whistlepig/stringmap.c
35
+ - ext/whistlepig/tokenizer.lex.h
36
+ - ext/whistlepig/whistlepig.h
30
37
  - ext/whistlepig/error.c
38
+ - ext/whistlepig/snippeter.h
31
39
  - ext/whistlepig/lock.h
32
- - ext/whistlepig/tokenizer.lex.c
33
- - ext/whistlepig/query-parser.tab.c
34
- - ext/whistlepig/defaults.h
40
+ - ext/whistlepig/extconf.h
35
41
  - ext/whistlepig/stringmap.h
36
- - ext/whistlepig/query.c
37
- - ext/whistlepig/stringmap.c
38
- - ext/whistlepig/query.h
39
- - ext/whistlepig/segment.h
40
- - ext/whistlepig/entry.c
41
- - ext/whistlepig/search.c
42
- - ext/whistlepig/mmap-obj.c
43
- - ext/whistlepig/query-parser.tab.h
44
42
  - ext/whistlepig/query-parser.lex.c
45
- - ext/whistlepig/query-parser.c
43
+ - ext/whistlepig/defaults.h
44
+ - ext/whistlepig/tokenizer.lex.c
45
+ - ext/whistlepig/termhash.c
46
+ - ext/whistlepig/query-parser.h
47
+ - ext/whistlepig/index.c
46
48
  - ext/whistlepig/stringpool.c
49
+ - ext/whistlepig/query.h
50
+ - ext/whistlepig/query-parser.c
47
51
  - ext/whistlepig/stringpool.h
48
- - ext/whistlepig/whistlepig.h
52
+ - ext/whistlepig/mmap-obj.c
53
+ - ext/whistlepig/whistlepig.c
54
+ - ext/whistlepig/search.c
55
+ - ext/whistlepig/snippeter.c
56
+ - ext/whistlepig/termhash.h
57
+ - ext/whistlepig/query.c
58
+ - ext/whistlepig/query-parser.tab.h
49
59
  - ext/whistlepig/khash.h
50
- - ext/whistlepig/index.c
51
- - ext/whistlepig/search.h
52
- - ext/whistlepig/query-parser.lex.h
53
- - ext/whistlepig/mmap-obj.h
54
- - ext/whistlepig/tokenizer.lex.h
60
+ - ext/whistlepig/query-parser.tab.c
61
+ - ext/whistlepig/entry.c
55
62
  - ext/whistlepig/index.h
56
- - ext/whistlepig/entry.h
57
- - ext/whistlepig/termhash.h
58
- - ext/whistlepig/error.h
59
- - ext/whistlepig/whistlepig.c
60
- - ext/whistlepig/termhash.c
63
+ - ext/whistlepig/segment.h
64
+ - ext/whistlepig/mmap-obj.h
65
+ - ext/whistlepig/rarray.h
61
66
  - ext/whistlepig/segment.c
62
- - ext/whistlepig/query-parser.h
63
- - ext/whistlepig/lock.c
67
+ - ext/whistlepig/search.h
68
+ - ext/whistlepig/error.h
69
+ has_rdoc: true
64
70
  homepage: http://masanjin.net/whistlepig
65
71
  licenses: []
66
72
  post_install_message:
@@ -87,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
93
  version: '0'
88
94
  requirements: []
89
95
  rubyforge_project:
90
- rubygems_version: 1.8.11
96
+ rubygems_version: 1.6.0
91
97
  signing_key:
92
98
  specification_version: 3
93
99
  summary: a minimalist realtime full-text search index