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 2014/07/01 21:35:13 UTC

[8/8] git commit: refs/heads/master - Port t/028-sortexrun.t to C

Port t/028-sortexrun.t to C

Original commit by Nick Wellnhofer, amended by Marvin Humphrey for
changes to the SortExternal API.


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

Branch: refs/heads/master
Commit: eb10a8c6842c3483cff014a8a7b04de0ed5c0858
Parents: 73d6925
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Fri Oct 18 22:15:04 2013 +0200
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Jul 1 12:09:49 2014 -0700

----------------------------------------------------------------------
 core/Lucy/Test/Util/TestSortExternal.c | 38 ++++++++++++++++++++++-
 core/Lucy/Util/BBSortEx.c              |  8 +++++
 core/Lucy/Util/BBSortEx.cfh            |  3 ++
 perl/t/028-sortexrun.t                 | 48 -----------------------------
 4 files changed, 48 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/eb10a8c6/core/Lucy/Test/Util/TestSortExternal.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Util/TestSortExternal.c b/core/Lucy/Test/Util/TestSortExternal.c
index 2e04c83..19e83cf 100644
--- a/core/Lucy/Test/Util/TestSortExternal.c
+++ b/core/Lucy/Test/Util/TestSortExternal.c
@@ -269,9 +269,44 @@ test_sort_random_strings(TestBatchRunner *runner) {
     DECREF(bytebufs);
 }
 
+static void
+test_run(TestBatchRunner *runner) {
+    VArray *letters = VA_new(26);
+    for (int i = 0; i < 26; ++i) {
+        char ch = 'a' + i;
+        ByteBuf *bytebuf = BB_new_bytes(&ch, 1);
+        VA_Push(letters, (Obj*)bytebuf);
+    }
+    BBSortEx *run = BBSortEx_new(0x1000000, letters);
+    BBSortEx_Set_Mem_Thresh(run, 5);
+
+    BBSortEx_Refill(run);
+    TEST_INT_EQ(runner, BBSortEx_Buffer_Count(run), 5,
+                "Refill doesn't exceed memory threshold");
+
+    Obj *endpost = BBSortEx_Peek_Last(run);
+    ByteBuf *wanted = BB_new_bytes("e", 1);
+    TEST_TRUE(runner, BB_Equals(wanted, endpost), "Peek_Last");
+
+    VArray *elems = VA_new(26);
+    do {
+        while (BBSortEx_Buffer_Count(run) > 0) {
+            Obj *object = BBSortEx_Fetch(run);
+            VA_Push(elems, object);
+        }
+    } while (BBSortEx_Refill(run) > 0);
+    TEST_TRUE(runner, VA_Equals(elems, (Obj*)letters), "retrieve all elems");
+
+    DECREF(elems);
+    DECREF(wanted);
+    DECREF(endpost);
+    DECREF(letters);
+    DECREF(run);
+}
+
 void
 TestSortExternal_Run_IMP(TestSortExternal *self, TestBatchRunner *runner) {
-    TestBatchRunner_Plan(runner, (TestBatch*)self, 16);
+    TestBatchRunner_Plan(runner, (TestBatch*)self, 19);
 
     srand((unsigned int)time((time_t*)NULL));
     S_init_bytebufs();
@@ -281,6 +316,7 @@ TestSortExternal_Run_IMP(TestSortExternal *self, TestBatchRunner *runner) {
     test_sort_nothing(runner);
     test_sort_packed_ints(runner);
     test_sort_random_strings(runner);
+    test_run(runner);
     S_destroy_bytebufs();
 }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/eb10a8c6/core/Lucy/Util/BBSortEx.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Util/BBSortEx.c b/core/Lucy/Util/BBSortEx.c
index c9201bb..66e0568 100644
--- a/core/Lucy/Util/BBSortEx.c
+++ b/core/Lucy/Util/BBSortEx.c
@@ -183,6 +183,14 @@ BBSortEx_Peek_Cache_IMP(BBSortEx *self) {
     return retval;
 }
 
+Obj*
+BBSortEx_Peek_Last_IMP(BBSortEx *self) {
+    BBSortExIVARS *const ivars = BBSortEx_IVARS(self);
+    uint32_t count = ivars->buf_max - ivars->buf_tick;
+    if (count == 0) { return NULL; }
+    return INCREF(ivars->buffer[count-1]);
+}
+
 uint32_t
 BBSortEx_Get_Num_Runs_IMP(BBSortEx *self) {
     BBSortExIVARS *const ivars = BBSortEx_IVARS(self);

http://git-wip-us.apache.org/repos/asf/lucy/blob/eb10a8c6/core/Lucy/Util/BBSortEx.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Util/BBSortEx.cfh b/core/Lucy/Util/BBSortEx.cfh
index 6fd8656..a43b1fd 100644
--- a/core/Lucy/Util/BBSortEx.cfh
+++ b/core/Lucy/Util/BBSortEx.cfh
@@ -54,6 +54,9 @@ class Lucy::Util::BBSortEx
     incremented VArray*
     Peek_Cache(BBSortEx *self);
 
+    incremented nullable Obj*
+    Peek_Last(BBSortEx *self);
+
     uint32_t
     Get_Num_Runs(BBSortEx *self);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/eb10a8c6/perl/t/028-sortexrun.t
----------------------------------------------------------------------
diff --git a/perl/t/028-sortexrun.t b/perl/t/028-sortexrun.t
deleted file mode 100644
index f0df52a..0000000
--- a/perl/t/028-sortexrun.t
+++ /dev/null
@@ -1,48 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-use strict;
-use warnings;
-use lib 'buildlib';
-
-use Test::More skip_all => 'Disabled until test ported to C';
-#use Test::More tests => 5;
-use Lucy::Test;
-use Clownfish qw( to_perl );
-
-my $letters = Clownfish::VArray->new;
-$letters->push( Clownfish::ByteBuf->new($_) ) for 'a' .. 'z';
-my $run = Lucy::Util::BBSortEx->new( external => $letters );
-$run->set_mem_thresh(5);
-
-my $num_in_cache = $run->refill;
-is( $run->cache_count, 5, "Read_Elem puts the brakes on Refill" );
-my $endpost = $run->peek_last;
-is( $endpost, 'e', "Peek_Last" );
-$endpost = Clownfish::ByteBuf->new('b');
-my $slice = $run->pop_slice($endpost);
-is( scalar @$slice, 2, "Pop_Slice gets only less-than-or-equal elems" );
-@$slice = map { to_perl($_) } @$slice;
-is_deeply( $slice, [qw( a b )], "Pop_Slice picks highest elems" );
-
-my @got = qw( a b );
-while (1) {
-    $endpost = $run->peek_last;
-    $slice   = $run->pop_slice( Clownfish::ByteBuf->new($endpost) );
-    push @got, map { to_perl($_) } @$slice;
-    last unless $run->refill;
-}
-is_deeply( \@got, [ 'a' .. 'z' ], "retrieve all elems" );
-