You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2013/07/17 16:12:27 UTC

[lucy-commits] [07/34] git commit: refs/heads/master - Migrate Lucy's highlight classes to IVARS.

Migrate Lucy's highlight classes to IVARS.

Change all Lucy's highlight classes to access instance vars
via an IVARS struct rather than via `self`.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/458824ce
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/458824ce
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/458824ce

Branch: refs/heads/master
Commit: 458824ce4f5335dd6cfbd3c76a6d46f64a7755f5
Parents: 6827b4f
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Jun 28 11:00:32 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Jul 16 15:50:07 2013 -0700

----------------------------------------------------------------------
 core/Lucy/Highlight/HeatMap.c     |  17 +++--
 core/Lucy/Highlight/Highlighter.c | 123 ++++++++++++++++++---------------
 2 files changed, 76 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/458824ce/core/Lucy/Highlight/HeatMap.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Highlight/HeatMap.c b/core/Lucy/Highlight/HeatMap.c
index 0d976e9..114bbbe 100644
--- a/core/Lucy/Highlight/HeatMap.c
+++ b/core/Lucy/Highlight/HeatMap.c
@@ -29,17 +29,18 @@ HeatMap_new(VArray *spans, uint32_t window) {
 
 HeatMap*
 HeatMap_init(HeatMap *self, VArray *spans, uint32_t window) {
+    HeatMapIVARS *const ivars = HeatMap_IVARS(self);
     VArray *spans_copy = VA_Shallow_Copy(spans);
     VArray *spans_plus_boosts;
 
-    self->spans  = NULL;
-    self->window = window;
+    ivars->spans  = NULL;
+    ivars->window = window;
 
     VA_Sort(spans_copy, NULL, NULL);
     spans_plus_boosts = HeatMap_Generate_Proximity_Boosts(self, spans_copy);
     VA_Push_VArray(spans_plus_boosts, spans_copy);
     VA_Sort(spans_plus_boosts, NULL, NULL);
-    self->spans = HeatMap_Flatten_Spans(self, spans_plus_boosts);
+    ivars->spans = HeatMap_Flatten_Spans(self, spans_plus_boosts);
 
     DECREF(spans_plus_boosts);
     DECREF(spans_copy);
@@ -49,7 +50,8 @@ HeatMap_init(HeatMap *self, VArray *spans, uint32_t window) {
 
 void
 HeatMap_destroy(HeatMap *self) {
-    DECREF(self->spans);
+    HeatMapIVARS *const ivars = HeatMap_IVARS(self);
+    DECREF(ivars->spans);
     SUPER_DESTROY(self, HEATMAP);
 }
 
@@ -155,6 +157,7 @@ HeatMap_flatten_spans(HeatMap *self, VArray *spans) {
 
 float
 HeatMap_calc_proximity_boost(HeatMap *self, Span *span1, Span *span2) {
+    HeatMapIVARS *const ivars = HeatMap_IVARS(self);
     int32_t comparison = Span_Compare_To(span1, (Obj*)span2);
     Span *lower = comparison <= 0 ? span1 : span2;
     Span *upper = comparison >= 0 ? span1 : span2;
@@ -164,11 +167,11 @@ HeatMap_calc_proximity_boost(HeatMap *self, Span *span1, Span *span2) {
     // If spans overlap, set distance to 0.
     if (distance < 0) { distance = 0; }
 
-    if (distance > (int32_t)self->window) {
+    if (distance > (int32_t)ivars->window) {
         return 0.0f;
     }
     else {
-        float factor = (self->window - distance) / (float)self->window;
+        float factor = (ivars->window - distance) / (float)ivars->window;
         // Damp boost with greater distance.
         factor *= factor;
         return factor * (Span_Get_Weight(lower) + Span_Get_Weight(upper));
@@ -208,7 +211,7 @@ HeatMap_generate_proximity_boosts(HeatMap *self, VArray *spans) {
 
 VArray*
 HeatMap_get_spans(HeatMap *self) {
-    return self->spans;
+    return HeatMap_IVARS(self)->spans;
 }
 
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/458824ce/core/Lucy/Highlight/Highlighter.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Highlight/Highlighter.c b/core/Lucy/Highlight/Highlighter.c
index 85afe29..1e43b21 100644
--- a/core/Lucy/Highlight/Highlighter.c
+++ b/core/Lucy/Highlight/Highlighter.c
@@ -53,97 +53,103 @@ Highlighter_new(Searcher *searcher, Obj *query, const CharBuf *field,
 Highlighter*
 Highlighter_init(Highlighter *self, Searcher *searcher, Obj *query,
                  const CharBuf *field, uint32_t excerpt_length) {
-    self->query          = Searcher_Glean_Query(searcher, query);
-    self->searcher       = (Searcher*)INCREF(searcher);
-    self->field          = CB_Clone(field);
-    self->excerpt_length = excerpt_length;
-    self->slop           = excerpt_length / 3;
-    self->window_width   = excerpt_length + (self->slop * 2);
-    self->pre_tag        = CB_new_from_trusted_utf8("<strong>", 8);
-    self->post_tag       = CB_new_from_trusted_utf8("</strong>", 9);
-    if (Query_Is_A(self->query, COMPILER)) {
-        self->compiler = (Compiler*)INCREF(self->query);
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+    ivars->query          = Searcher_Glean_Query(searcher, query);
+    ivars->searcher       = (Searcher*)INCREF(searcher);
+    ivars->field          = CB_Clone(field);
+    ivars->excerpt_length = excerpt_length;
+    ivars->slop           = excerpt_length / 3;
+    ivars->window_width   = excerpt_length + (ivars->slop * 2);
+    ivars->pre_tag        = CB_new_from_trusted_utf8("<strong>", 8);
+    ivars->post_tag       = CB_new_from_trusted_utf8("</strong>", 9);
+    if (Query_Is_A(ivars->query, COMPILER)) {
+        ivars->compiler = (Compiler*)INCREF(ivars->query);
     }
     else {
-        self->compiler = Query_Make_Compiler(self->query, searcher,
-                                             Query_Get_Boost(self->query),
-                                             false);
+        ivars->compiler = Query_Make_Compiler(ivars->query, searcher,
+                                              Query_Get_Boost(ivars->query),
+                                              false);
     }
     return self;
 }
 
 void
 Highlighter_destroy(Highlighter *self) {
-    DECREF(self->searcher);
-    DECREF(self->query);
-    DECREF(self->compiler);
-    DECREF(self->field);
-    DECREF(self->pre_tag);
-    DECREF(self->post_tag);
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+    DECREF(ivars->searcher);
+    DECREF(ivars->query);
+    DECREF(ivars->compiler);
+    DECREF(ivars->field);
+    DECREF(ivars->pre_tag);
+    DECREF(ivars->post_tag);
     SUPER_DESTROY(self, HIGHLIGHTER);
 }
 
 CharBuf*
 Highlighter_highlight(Highlighter *self, const CharBuf *text) {
-    size_t   size   = CB_Get_Size(text)
-                      + CB_Get_Size(self->pre_tag)
-                      + CB_Get_Size(self->post_tag);
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+    size_t size = CB_Get_Size(text)
+                  + CB_Get_Size(ivars->pre_tag)
+                  + CB_Get_Size(ivars->post_tag);
     CharBuf *retval = CB_new(size);
-    CB_Cat(retval, self->pre_tag);
+    CB_Cat(retval, ivars->pre_tag);
     CB_Cat(retval, text);
-    CB_Cat(retval, self->post_tag);
+    CB_Cat(retval, ivars->post_tag);
     return retval;
 }
 
 void
 Highlighter_set_pre_tag(Highlighter *self, const CharBuf *pre_tag) {
-    CB_Mimic(self->pre_tag, (Obj*)pre_tag);
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+    CB_Mimic(ivars->pre_tag, (Obj*)pre_tag);
 }
 
 void
 Highlighter_set_post_tag(Highlighter *self, const CharBuf *post_tag) {
-    CB_Mimic(self->post_tag, (Obj*)post_tag);
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+    CB_Mimic(ivars->post_tag, (Obj*)post_tag);
 }
 
 CharBuf*
 Highlighter_get_pre_tag(Highlighter *self) {
-    return self->pre_tag;
+    return Highlighter_IVARS(self)->pre_tag;
 }
 
 CharBuf*
 Highlighter_get_post_tag(Highlighter *self) {
-    return self->post_tag;
+    return Highlighter_IVARS(self)->post_tag;
 }
 
 CharBuf*
 Highlighter_get_field(Highlighter *self) {
-    return self->field;
+    return Highlighter_IVARS(self)->field;
 }
 
 Query*
 Highlighter_get_query(Highlighter *self) {
-    return self->query;
+    return Highlighter_IVARS(self)->query;
 }
 
 Searcher*
 Highlighter_get_searcher(Highlighter *self) {
-    return self->searcher;
+    return Highlighter_IVARS(self)->searcher;
 }
 
 Compiler*
 Highlighter_get_compiler(Highlighter *self) {
-    return self->compiler;
+    return Highlighter_IVARS(self)->compiler;
 }
 
 uint32_t
 Highlighter_get_excerpt_length(Highlighter *self) {
-    return self->excerpt_length;
+    return Highlighter_IVARS(self)->excerpt_length;
 }
 
 CharBuf*
 Highlighter_create_excerpt(Highlighter *self, HitDoc *hit_doc) {
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
     ZombieCharBuf *field_val
-        = (ZombieCharBuf*)HitDoc_Extract(hit_doc, self->field,
+        = (ZombieCharBuf*)HitDoc_Extract(hit_doc, ivars->field,
                                          (ViewCharBuf*)ZCB_BLANK());
 
     if (!field_val || !Obj_Is_A((Obj*)field_val, CHARBUF)) {
@@ -155,24 +161,24 @@ Highlighter_create_excerpt(Highlighter *self, HitDoc *hit_doc) {
     }
     else {
         ZombieCharBuf *fragment = ZCB_WRAP((CharBuf*)field_val);
-        CharBuf *raw_excerpt = CB_new(self->excerpt_length + 10);
-        CharBuf *highlighted = CB_new((self->excerpt_length * 3) / 2);
+        CharBuf *raw_excerpt = CB_new(ivars->excerpt_length + 10);
+        CharBuf *highlighted = CB_new((ivars->excerpt_length * 3) / 2);
         DocVector *doc_vec
-            = Searcher_Fetch_Doc_Vec(self->searcher,
+            = Searcher_Fetch_Doc_Vec(ivars->searcher,
                                      HitDoc_Get_Doc_ID(hit_doc));
         VArray *maybe_spans
-            = Compiler_Highlight_Spans(self->compiler, self->searcher,
-                                       doc_vec, self->field);
+            = Compiler_Highlight_Spans(ivars->compiler, ivars->searcher,
+                                       doc_vec, ivars->field);
         VArray *score_spans = maybe_spans ? maybe_spans : VA_new(0);
         VA_Sort(score_spans, NULL, NULL);
         HeatMap *heat_map
-            = HeatMap_new(score_spans, (self->excerpt_length * 2) / 3);
+            = HeatMap_new(score_spans, (ivars->excerpt_length * 2) / 3);
         int32_t top
             = Highlighter_Find_Best_Fragment(self, (CharBuf*)field_val,
                                              (ViewCharBuf*)fragment, heat_map);
         VArray *sentences
             = Highlighter_Find_Sentences(self, (CharBuf*)field_val, 0,
-                                         top + self->window_width);
+                                         top + ivars->window_width);
 
         top = Highlighter_Raw_Excerpt(self, (CharBuf*)field_val,
                                       (CharBuf*)fragment, raw_excerpt, top,
@@ -208,32 +214,34 @@ S_hottest(HeatMap *heat_map) {
 int32_t
 Highlighter_find_best_fragment(Highlighter *self, const CharBuf *field_val,
                                ViewCharBuf *fragment, HeatMap *heat_map) {
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
+
     // Window is 1.66 * excerpt_length, with the loc in the middle.
     int32_t best_location = S_hottest(heat_map);
 
-    if (best_location < (int32_t)self->slop) {
+    if (best_location < (int32_t)ivars->slop) {
         // If the beginning of the string falls within the window centered
         // around the hottest point in the field, start the fragment at the
         // beginning.
         ViewCB_Assign(fragment, (CharBuf*)field_val);
         int32_t top = ViewCB_Trim_Top(fragment);
-        ViewCB_Truncate(fragment, self->window_width);
+        ViewCB_Truncate(fragment, ivars->window_width);
         return top;
     }
     else {
-        int32_t top = best_location - self->slop;
+        int32_t top = best_location - ivars->slop;
         ViewCB_Assign(fragment, (CharBuf*)field_val);
         ViewCB_Nip(fragment, top);
         top += ViewCB_Trim_Top(fragment);
-        int32_t chars_left = ViewCB_Truncate(fragment, self->excerpt_length);
-        int32_t overrun = self->excerpt_length - chars_left;
+        int32_t chars_left = ViewCB_Truncate(fragment, ivars->excerpt_length);
+        int32_t overrun = ivars->excerpt_length - chars_left;
 
         if (!overrun) {
             // We've found an acceptable window.
             ViewCB_Assign(fragment, (CharBuf*)field_val);
             ViewCB_Nip(fragment, top);
             top += ViewCB_Trim_Top(fragment);
-            ViewCB_Truncate(fragment, self->window_width);
+            ViewCB_Truncate(fragment, ivars->window_width);
             return top;
         }
         else if (overrun > top) {
@@ -248,7 +256,7 @@ Highlighter_find_best_fragment(Highlighter *self, const CharBuf *field_val,
             ViewCB_Assign(fragment, (CharBuf*)field_val);
             ViewCB_Nip(fragment, top);
             top += ViewCB_Trim_Top(fragment);
-            ViewCB_Truncate(fragment, self->excerpt_length);
+            ViewCB_Truncate(fragment, ivars->excerpt_length);
             return top;
         }
     }
@@ -283,14 +291,15 @@ int32_t
 Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
                         const CharBuf *fragment, CharBuf *raw_excerpt,
                         int32_t top, HeatMap *heat_map, VArray *sentences) {
+    HighlighterIVARS *const ivars = Highlighter_IVARS(self);
     bool     found_starting_edge = false;
     bool     found_ending_edge   = false;
     int32_t  start = top;
     int32_t  end   = 0;
     double   field_len = CB_Length(field_val);
-    uint32_t min_len = field_len < self->excerpt_length * 0.6666
+    uint32_t min_len = field_len < ivars->excerpt_length * 0.6666
                        ? (uint32_t)field_len
-                       : (uint32_t)(self->excerpt_length * 0.6666);
+                       : (uint32_t)(ivars->excerpt_length * 0.6666);
 
     // Try to find a starting sentence boundary.
     const uint32_t num_sentences = VA_Get_Size(sentences);
@@ -299,7 +308,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
             Span *sentence = (Span*)VA_Fetch(sentences, i);
             int32_t candidate = Span_Get_Offset(sentence);;
 
-            if (candidate > top + (int32_t)self->window_width) {
+            if (candidate > top + (int32_t)ivars->window_width) {
                 break;
             }
             else if (candidate >= top) {
@@ -308,7 +317,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
                 // fragment.
                 ZombieCharBuf *temp = ZCB_WRAP(fragment);
                 ZCB_Nip(temp, candidate - top);
-                uint32_t chars_left = ZCB_Truncate(temp, self->excerpt_length);
+                uint32_t chars_left = ZCB_Truncate(temp, ivars->excerpt_length);
                 if (chars_left >= min_len
                     && S_has_heat(heat_map, candidate, chars_left)
                    ) {
@@ -333,7 +342,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
             if (last_edge <= start) {
                 break;
             }
-            else if (last_edge - start > (int32_t)self->excerpt_length) {
+            else if (last_edge - start > (int32_t)ivars->excerpt_length) {
                 continue;
             }
             else {
@@ -361,7 +370,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
     }
     int32_t this_excerpt_len = found_ending_edge
                                ? end - start
-                               : (int32_t)self->excerpt_length;
+                               : (int32_t)ivars->excerpt_length;
     if (!this_excerpt_len) { return start; }
 
     if (found_starting_edge) {
@@ -403,7 +412,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
                     // we don't know a solid end point yet.
                     break;
                 }
-                else if (this_excerpt_len <= (int32_t)self->excerpt_length) {
+                else if (this_excerpt_len <= (int32_t)ivars->excerpt_length) {
                     break;
                 }
             }
@@ -415,7 +424,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
             temp             = orig_temp;
             start            = orig_start;
             this_excerpt_len = orig_len;
-            int32_t diff = this_excerpt_len - self->excerpt_length;
+            int32_t diff = this_excerpt_len - ivars->excerpt_length;
             if (diff > 0) {
                 ZCB_Nip(temp, diff);
                 start            += diff;
@@ -423,7 +432,7 @@ Highlighter_raw_excerpt(Highlighter *self, const CharBuf *field_val,
             }
         }
 
-        ZCB_Truncate(temp, self->excerpt_length - ELLIPSIS_LEN);
+        ZCB_Truncate(temp, ivars->excerpt_length - ELLIPSIS_LEN);
         CB_Cat_Char(raw_excerpt, ELLIPSIS_CODE_POINT);
         CB_Cat_Char(raw_excerpt, ' ');
         CB_Cat(raw_excerpt, (CharBuf*)temp);