You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2013/09/13 20:31:41 UTC

[lucy-commits] [09/17] git commit: refs/heads/cfish-string-prep1 - Make SortCache_Value work with immutable strings

Make SortCache_Value work with immutable strings


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

Branch: refs/heads/cfish-string-prep1
Commit: b7881f0e40bf6f5470c8314a5e6aa231817c4cde
Parents: eafb8f7
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Mon Sep 9 21:15:52 2013 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Fri Sep 13 20:15:59 2013 +0200

----------------------------------------------------------------------
 core/Lucy/Index/SortCache.c                    | 15 +-----
 core/Lucy/Index/SortCache.cfh                  | 15 ++----
 core/Lucy/Index/SortCache/NumericSortCache.c   | 52 +++++----------------
 core/Lucy/Index/SortCache/NumericSortCache.cfh | 28 ++++-------
 core/Lucy/Index/SortCache/TextSortCache.c      | 23 ++-------
 core/Lucy/Index/SortCache/TextSortCache.cfh    |  7 +--
 core/Lucy/Index/SortFieldWriter.c              |  8 ++--
 core/Lucy/Search/Collector/SortCollector.c     |  9 ++--
 core/Lucy/Search/RangeQuery.c                  | 10 ++--
 perl/buildlib/Lucy/Build/Binding/Index.pm      |  5 +-
 10 files changed, 46 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache.c b/core/Lucy/Index/SortCache.c
index 53f6d43..446ced2 100644
--- a/core/Lucy/Index/SortCache.c
+++ b/core/Lucy/Index/SortCache.c
@@ -111,22 +111,13 @@ SortCache_Find_IMP(SortCache *self, Obj *term) {
     int32_t          lo     = 0;
     int32_t          hi     = ivars->cardinality - 1;
     int32_t          result = -100;
-    Obj             *blank  = SortCache_Make_Blank(self);
-
-    if (term != NULL
-        && !Obj_Is_A(term, Obj_Get_VTable(blank))
-        && !Obj_Is_A(blank, Obj_Get_VTable(term))
-       ) {
-        THROW(ERR, "SortCache error for field %o: term is a %o, and not "
-              "comparable to a %o", ivars->field, Obj_Get_Class_Name(term),
-              Obj_Get_Class_Name(blank));
-    }
 
     // Binary search.
     while (hi >= lo) {
         const int32_t mid = lo + ((hi - lo) / 2);
-        Obj *val = SortCache_Value(self, mid, blank);
+        Obj *val = SortCache_Value(self, mid);
         int32_t comparison = FType_null_back_compare_values(type, term, val);
+        DECREF(val);
         if (comparison < 0) {
             hi = mid - 1;
         }
@@ -139,8 +130,6 @@ SortCache_Find_IMP(SortCache *self, Obj *term) {
         }
     }
 
-    DECREF(blank);
-
     if (hi < 0) {
         // Target is "less than" the first cache entry.
         return -1;

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache.cfh b/core/Lucy/Index/SortCache.cfh
index 9554425..f16b78f 100644
--- a/core/Lucy/Index/SortCache.cfh
+++ b/core/Lucy/Index/SortCache.cfh
@@ -34,18 +34,11 @@ class Lucy::Index::SortCache inherits Clownfish::Obj {
          void *ords, int32_t cardinality, int32_t doc_max, int32_t null_ord = -1,
          int32_t ord_width);
 
-    /** Assign the value for ordinal <code>ord</code> to <code>blank</code>.
-     *
-     * @return either <code>blank</code> (no longer blank), or NULL if the
-     * value for <code>ord</code> is NULL.
-     */
-    public abstract nullable Obj*
-    Value(SortCache *self, int32_t ord, Obj *blank);
-
-    /** Return an object appropriate for use as an argument to Value().
+    /** Return the value for ordinal <code>ord</code>, or NULL if the value
+     * for <code>ord</code> is NULL.
      */
-    public abstract incremented Obj*
-    Make_Blank(SortCache *self);
+    public abstract nullable incremented Obj*
+    Value(SortCache *self, int32_t ord);
 
     public void*
     Get_Ords(SortCache *self);

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache/NumericSortCache.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache/NumericSortCache.c b/core/Lucy/Index/SortCache/NumericSortCache.c
index 143c9c1..7241e6f 100644
--- a/core/Lucy/Index/SortCache/NumericSortCache.c
+++ b/core/Lucy/Index/SortCache/NumericSortCache.c
@@ -102,26 +102,19 @@ F64SortCache_init(Float64SortCache *self, const String *field,
 }
 
 Obj*
-F64SortCache_Value_IMP(Float64SortCache *self, int32_t ord, Obj *blank) {
+F64SortCache_Value_IMP(Float64SortCache *self, int32_t ord) {
     Float64SortCacheIVARS *const ivars = F64SortCache_IVARS(self);
     if (ord == ivars->null_ord) {
         return NULL;
     }
     else if (ord < 0) {
         THROW(ERR, "Ordinal less than 0 for %o: %i32", ivars->field, ord);
+        UNREACHABLE_RETURN(Obj*);
     }
     else {
-        Float64 *num_blank = (Float64*)CERTIFY(blank, FLOAT64);
         InStream_Seek(ivars->dat_in, ord * sizeof(double));
-        Float64_Set_Value(num_blank, InStream_Read_F64(ivars->dat_in));
+        return (Obj*)Float64_new(InStream_Read_F64(ivars->dat_in));
     }
-    return blank;
-}
-
-Float64*
-F64SortCache_Make_Blank_IMP(Float64SortCache *self) {
-    UNUSED_VAR(self);
-    return Float64_new(0.0);
 }
 
 /***************************************************************************/
@@ -147,26 +140,19 @@ F32SortCache_init(Float32SortCache *self, const String *field,
 }
 
 Obj*
-F32SortCache_Value_IMP(Float32SortCache *self, int32_t ord, Obj *blank) {
+F32SortCache_Value_IMP(Float32SortCache *self, int32_t ord) {
     Float32SortCacheIVARS *const ivars = F32SortCache_IVARS(self);
     if (ord == ivars->null_ord) {
         return NULL;
     }
     else if (ord < 0) {
         THROW(ERR, "Ordinal less than 0 for %o: %i32", ivars->field, ord);
+        UNREACHABLE_RETURN(Obj*);
     }
     else {
-        Float32 *num_blank = (Float32*)CERTIFY(blank, FLOAT32);
         InStream_Seek(ivars->dat_in, ord * sizeof(float));
-        Float32_Set_Value(num_blank, InStream_Read_F32(ivars->dat_in));
+        return (Obj*)Float32_new(InStream_Read_F32(ivars->dat_in));
     }
-    return blank;
-}
-
-Float32*
-F32SortCache_Make_Blank_IMP(Float32SortCache *self) {
-    UNUSED_VAR(self);
-    return Float32_new(0.0f);
 }
 
 /***************************************************************************/
@@ -192,26 +178,19 @@ I32SortCache_init(Int32SortCache *self, const String *field,
 }
 
 Obj*
-I32SortCache_Value_IMP(Int32SortCache *self, int32_t ord, Obj *blank) {
+I32SortCache_Value_IMP(Int32SortCache *self, int32_t ord) {
     Int32SortCacheIVARS *const ivars = I32SortCache_IVARS(self);
     if (ord == ivars->null_ord) {
         return NULL;
     }
     else if (ord < 0) {
         THROW(ERR, "Ordinal less than 0 for %o: %i32", ivars->field, ord);
+        UNREACHABLE_RETURN(Obj*);
     }
     else {
-        Integer32 *int_blank = (Integer32*)CERTIFY(blank, INTEGER32);
         InStream_Seek(ivars->dat_in, ord * sizeof(int32_t));
-        Int32_Set_Value(int_blank, InStream_Read_I32(ivars->dat_in));
+        return (Obj*)Int32_new(InStream_Read_I32(ivars->dat_in));
     }
-    return blank;
-}
-
-Integer32*
-I32SortCache_Make_Blank_IMP(Int32SortCache *self) {
-    UNUSED_VAR(self);
-    return Int32_new(0);
 }
 
 /***************************************************************************/
@@ -237,26 +216,19 @@ I64SortCache_init(Int64SortCache *self, const String *field,
 }
 
 Obj*
-I64SortCache_Value_IMP(Int64SortCache *self, int32_t ord, Obj *blank) {
+I64SortCache_Value_IMP(Int64SortCache *self, int32_t ord) {
     Int64SortCacheIVARS *const ivars = I64SortCache_IVARS(self);
     if (ord == ivars->null_ord) {
         return NULL;
     }
     else if (ord < 0) {
         THROW(ERR, "Ordinal less than 0 for %o: %i32", ivars->field, ord);
+        UNREACHABLE_RETURN(Obj*);
     }
     else {
-        Integer64 *int_blank = (Integer64*)CERTIFY(blank, INTEGER64);
         InStream_Seek(ivars->dat_in, ord * sizeof(int64_t));
-        Int64_Set_Value(int_blank, InStream_Read_I64(ivars->dat_in));
+        return (Obj*)Int64_new(InStream_Read_I64(ivars->dat_in));
     }
-    return blank;
-}
-
-Integer64*
-I64SortCache_Make_Blank_IMP(Int64SortCache *self) {
-    UNUSED_VAR(self);
-    return Int64_new(0);
 }
 
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache/NumericSortCache.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache/NumericSortCache.cfh b/core/Lucy/Index/SortCache/NumericSortCache.cfh
index e1ba6e7..4b6de04 100644
--- a/core/Lucy/Index/SortCache/NumericSortCache.cfh
+++ b/core/Lucy/Index/SortCache/NumericSortCache.cfh
@@ -44,11 +44,8 @@ class Lucy::Index::SortCache::Float64SortCache cnick F64SortCache
          int32_t cardinality, int32_t doc_max, int32_t null_ord = -1,
          int32_t ord_width, InStream *ord_in, InStream *dat_in);
 
-    public nullable Obj*
-    Value(Float64SortCache *self, int32_t ord, Obj *blank);
-
-    public incremented Float64*
-    Make_Blank(Float64SortCache *self);
+    public nullable incremented Obj*
+    Value(Float64SortCache *self, int32_t ord);
 }
 
 class Lucy::Index::SortCache::Float32SortCache cnick F32SortCache
@@ -64,11 +61,8 @@ class Lucy::Index::SortCache::Float32SortCache cnick F32SortCache
          int32_t cardinality, int32_t doc_max, int32_t null_ord = -1,
          int32_t ord_width, InStream *ord_in, InStream *dat_in);
 
-    public nullable Obj*
-    Value(Float32SortCache *self, int32_t ord, Obj *blank);
-
-    public incremented Float32*
-    Make_Blank(Float32SortCache *self);
+    public nullable incremented Obj*
+    Value(Float32SortCache *self, int32_t ord);
 }
 
 class Lucy::Index::SortCache::Int32SortCache cnick I32SortCache
@@ -84,11 +78,8 @@ class Lucy::Index::SortCache::Int32SortCache cnick I32SortCache
          int32_t cardinality, int32_t doc_max, int32_t null_ord = -1,
          int32_t ord_width, InStream *ord_in, InStream *dat_in);
 
-    public nullable Obj*
-    Value(Int32SortCache *self, int32_t ord, Obj *blank);
-
-    public incremented Integer32*
-    Make_Blank(Int32SortCache *self);
+    public nullable incremented Obj*
+    Value(Int32SortCache *self, int32_t ord);
 }
 
 class Lucy::Index::SortCache::Int64SortCache cnick I64SortCache
@@ -104,11 +95,8 @@ class Lucy::Index::SortCache::Int64SortCache cnick I64SortCache
          int32_t cardinality, int32_t doc_max, int32_t null_ord = -1,
          int32_t ord_width, InStream *ord_in, InStream *dat_in);
 
-    public nullable Obj*
-    Value(Int64SortCache *self, int32_t ord, Obj *blank);
-
-    public incremented Integer64*
-    Make_Blank(Int64SortCache *self);
+    public nullable incremented Obj*
+    Value(Int64SortCache *self, int32_t ord);
 }
 
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache/TextSortCache.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache/TextSortCache.c b/core/Lucy/Index/SortCache/TextSortCache.c
index d9573f2..97df2bb 100644
--- a/core/Lucy/Index/SortCache/TextSortCache.c
+++ b/core/Lucy/Index/SortCache/TextSortCache.c
@@ -89,7 +89,7 @@ TextSortCache_Destroy_IMP(TextSortCache *self) {
 #define NULL_SENTINEL -1
 
 Obj*
-TextSortCache_Value_IMP(TextSortCache *self, int32_t ord, Obj *blank) {
+TextSortCache_Value_IMP(TextSortCache *self, int32_t ord) {
     TextSortCacheIVARS *const ivars = TextSortCache_IVARS(self);
     if (ord == ivars->null_ord) {
         return NULL;
@@ -110,26 +110,13 @@ TextSortCache_Value_IMP(TextSortCache *self, int32_t ord, Obj *blank) {
         }
 
         // Read character data into String.
-        CERTIFY(blank, STRING);
-        int64_t len = next_offset - offset;
-        char *ptr = Str_Grow((String*)blank, (size_t)len);
+        size_t len = (size_t)(next_offset - offset);
+        char *ptr = (char*)MALLOCATE(len + 1);
         InStream_Seek(ivars->dat_in, offset);
-        InStream_Read_Bytes(ivars->dat_in, ptr, (size_t)len);
+        InStream_Read_Bytes(ivars->dat_in, ptr, len);
         ptr[len] = '\0';
-        if (!StrHelp_utf8_valid(ptr, (size_t)len)) {
-            Str_Set_Size((String*)blank, 0);
-            THROW(ERR, "Invalid UTF-8 at %i64 in %o", offset,
-                  InStream_Get_Filename(ivars->dat_in));
-        }
-        Str_Set_Size((String*)blank, (size_t)len);
+        return (Obj*)Str_new_steal_str(ptr, len, len + 1);
     }
-    return blank;
-}
-
-String*
-TextSortCache_Make_Blank_IMP(TextSortCache *self) {
-    UNUSED_VAR(self);
-    return Str_new_from_trusted_utf8("", 0);
 }
 
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortCache/TextSortCache.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortCache/TextSortCache.cfh b/core/Lucy/Index/SortCache/TextSortCache.cfh
index 7fb4f12..66b73c1 100644
--- a/core/Lucy/Index/SortCache/TextSortCache.cfh
+++ b/core/Lucy/Index/SortCache/TextSortCache.cfh
@@ -36,11 +36,8 @@ class Lucy::Index::SortCache::TextSortCache
          int32_t ord_width, InStream *ord_in, InStream *ix_in,
          InStream *dat_in);
 
-    public nullable Obj*
-    Value(TextSortCache *self, int32_t ord, Obj *blank);
-
-    public incremented String*
-    Make_Blank(TextSortCache *self);
+    public nullable incremented Obj*
+    Value(TextSortCache *self, int32_t ord);
 
     public void
     Destroy(TextSortCache *self);

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Index/SortFieldWriter.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/SortFieldWriter.c b/core/Lucy/Index/SortFieldWriter.c
index 8c8e39b..b251123 100644
--- a/core/Lucy/Index/SortFieldWriter.c
+++ b/core/Lucy/Index/SortFieldWriter.c
@@ -436,14 +436,14 @@ SortFieldWriter_Refill_IMP(SortFieldWriter *self) {
     Hash *const      uniq_vals  = ivars->uniq_vals;
     I32Array *const  doc_map    = ivars->doc_map;
     SortCache *const sort_cache = ivars->sort_cache;
-    Obj *const       blank      = SortCache_Make_Blank(sort_cache);
 
     while (ivars->run_ord < ivars->run_cardinality
            && MemPool_Get_Consumed(ivars->mem_pool) < ivars->mem_thresh
           ) {
-        Obj *val = SortCache_Value(sort_cache, ivars->run_ord, blank);
+        Obj *val = SortCache_Value(sort_cache, ivars->run_ord);
         if (val) {
             Hash_Store(uniq_vals, val, (Obj*)CFISH_TRUE);
+            DECREF(val);
             break;
         }
         ivars->run_ord++;
@@ -457,9 +457,10 @@ SortFieldWriter_Refill_IMP(SortFieldWriter *self) {
                                ? I32Arr_Get(doc_map, raw_doc_id)
                                : raw_doc_id;
             if (remapped) {
-                Obj *val = SortCache_Value(sort_cache, ord, blank);
+                Obj *val = SortCache_Value(sort_cache, ord);
                 SortFieldWriter_Add(self, remapped, val);
                 count++;
+                DECREF(val);
             }
         }
         else if (ord > ivars->run_ord) {
@@ -475,7 +476,6 @@ SortFieldWriter_Refill_IMP(SortFieldWriter *self) {
         ivars->sort_cache = NULL;
     }
 
-    DECREF(blank);
     return count;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Search/Collector/SortCollector.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Search/Collector/SortCollector.c b/core/Lucy/Search/Collector/SortCollector.c
index 15e9480..4001b6b 100644
--- a/core/Lucy/Search/Collector/SortCollector.c
+++ b/core/Lucy/Search/Collector/SortCollector.c
@@ -295,15 +295,12 @@ SortColl_Collect_IMP(SortCollector *self, int32_t doc_id) {
 
             for (uint32_t i = 0, max = ivars->num_rules; i < max; i++) {
                 SortCache *cache   = ivars->sort_caches[i];
-                Obj       *old_val = (Obj*)VA_Delete(values, i);
+                Obj       *old_val = VA_Delete(values, i);
+                DECREF(old_val);
                 if (cache) {
                     int32_t ord = SortCache_Ordinal(cache, doc_id);
-                    Obj *blank = old_val
-                                 ? old_val
-                                 : SortCache_Make_Blank(cache);
-                    Obj *val = SortCache_Value(cache, ord, blank);
+                    Obj *val = SortCache_Value(cache, ord);
                     if (val) { VA_Store(values, i, (Obj*)val); }
-                    else     { DECREF(blank); }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/core/Lucy/Search/RangeQuery.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Search/RangeQuery.c b/core/Lucy/Search/RangeQuery.c
index cbc5b74..a208213 100644
--- a/core/Lucy/Search/RangeQuery.c
+++ b/core/Lucy/Search/RangeQuery.c
@@ -279,8 +279,7 @@ S_find_lower_bound(RangeCompiler *self, SortCache *sort_cache) {
             lower_bound = 0;
         }
         else {
-            Obj *value = SortCache_Make_Blank(sort_cache);
-            Obj *low_found = SortCache_Value(sort_cache, low_ord, value);
+            Obj *low_found = SortCache_Value(sort_cache, low_ord);
             bool exact_match = low_found == NULL
                                  ? false
                                  : Obj_Equals(lower_term, low_found);
@@ -289,7 +288,7 @@ S_find_lower_bound(RangeCompiler *self, SortCache *sort_cache) {
             if (!exact_match || !RangeQuery_IVARS(parent)->include_lower) {
                 lower_bound++;
             }
-            DECREF(value);
+            DECREF(low_found);
         }
     }
 
@@ -309,8 +308,7 @@ S_find_upper_bound(RangeCompiler *self, SortCache *sort_cache) {
             retval = -1;
         }
         else {
-            Obj *value = SortCache_Make_Blank(sort_cache);
-            Obj *hi_found = SortCache_Value(sort_cache, hi_ord, value);
+            Obj *hi_found = SortCache_Value(sort_cache, hi_ord);
             bool exact_match = hi_found == NULL
                                  ? false
                                  : Obj_Equals(upper_term, (Obj*)hi_found);
@@ -319,7 +317,7 @@ S_find_upper_bound(RangeCompiler *self, SortCache *sort_cache) {
             if (exact_match && !RangeQuery_IVARS(parent)->include_upper) {
                 retval--;
             }
-            DECREF(value);
+            DECREF(hi_found);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/b7881f0e/perl/buildlib/Lucy/Build/Binding/Index.pm
----------------------------------------------------------------------
diff --git a/perl/buildlib/Lucy/Build/Binding/Index.pm b/perl/buildlib/Lucy/Build/Binding/Index.pm
index ac31d09..b02f299 100644
--- a/perl/buildlib/Lucy/Build/Binding/Index.pm
+++ b/perl/buildlib/Lucy/Build/Binding/Index.pm
@@ -936,10 +936,9 @@ CODE:
         CFISH_RETHROW(CFISH_INCREF(cfish_Err_get_error()));
     }
     {
-        cfish_Obj *blank = LUCY_SortCache_Make_Blank(self);
-        cfish_Obj *value = LUCY_SortCache_Value(self, ord, blank);
+        cfish_Obj *value = LUCY_SortCache_Value(self, ord);
         RETVAL = XSBind_cfish_to_perl(value);
-        CFISH_DECREF(blank);
+        CFISH_DECREF(value);
     }
 }
 OUTPUT: RETVAL