couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kocol...@apache.org
Subject [1/4] couch-mrview commit: updated refs/heads/1805-respect-collation-setting-reduce-group to ba84fb8
Date Tue, 30 Jun 2015 02:46:40 GMT
Repository: couchdb-couch-mrview
Updated Branches:
  refs/heads/1805-respect-collation-setting-reduce-group 79f00eb9b -> ba84fb809 (forced
update)


Rework to support equivalent-but-not-equal keys

The range collation test would fail when presented with a set of keys
that compare equal according to ICU but not according to Erlang's =:=
operator.

Other todos here include testing the raw collator and ensuring that all
tests use the correct collator (most of the other ones are also
technically incorrect but we just don't see it with the choices of data
involved). Taking care of this incrementally rather than rewriting the
whole module.


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/commit/2dc76491
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/tree/2dc76491
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/diff/2dc76491

Branch: refs/heads/1805-respect-collation-setting-reduce-group
Commit: 2dc7649184bf9146d43e07ed89b455d7aa8c0932
Parents: 8e8420b
Author: Adam Kocoloski <adam@cloudant.com>
Authored: Mon Jun 29 17:41:32 2015 -0400
Committer: Adam Kocoloski <adam@cloudant.com>
Committed: Mon Jun 29 21:43:48 2015 -0400

----------------------------------------------------------------------
 test/couch_mrview_collation_tests.erl | 49 +++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/blob/2dc76491/test/couch_mrview_collation_tests.erl
----------------------------------------------------------------------
diff --git a/test/couch_mrview_collation_tests.erl b/test/couch_mrview_collation_tests.erl
index df06ad6..4a03359 100644
--- a/test/couch_mrview_collation_tests.erl
+++ b/test/couch_mrview_collation_tests.erl
@@ -34,6 +34,12 @@
     <<"ba">>,
     <<"bb">>,
 
+    % U+200B is a zero-width space, which will be ignored by ICU but will cause
+    % the raw collator to treat these as three distinct keys
+    <<"c">>,
+    unicode:characters_to_binary([$c, 16#200B]),
+    unicode:characters_to_binary([$c, 16#200B, 16#200B]),
+
     [<<"a">>],
     [<<"b">>],
     [<<"b">>, <<"c">>],
@@ -73,7 +79,7 @@ collation_test_() ->
                 [
                     fun should_collate_fwd/1,
                     fun should_collate_rev/1,
-                    fun should_collate_range/1,
+                    fun should_collate_range_/1,
                     fun should_collate_with_inclusive_end_fwd/1,
                     fun should_collate_with_inclusive_end_rev/1,
                     fun should_collate_without_inclusive_end_fwd/1,
@@ -95,23 +101,30 @@ should_collate_rev(Db) ->
     Expect = [{meta, [{total, length(?VALUES)}, {offset, 0}]}] ++ lists:reverse(rows()),
     ?_assertEquiv(Expect, Results).
 
-should_collate_range(Db) ->
-    ?_assertNot(
-        begin
-            {_, Error} = lists:foldl(fun(V, {Count, Error}) ->
-                {ok, Results} = run_query(Db, [{start_key, V}, {end_key, V}]),
-                Id = list_to_binary(integer_to_list(Count)),
-                Expect = [
-                    {meta, [{total, length(?VALUES)}, {offset, Count}]},
-                    {row, [{id, Id}, {key, V}, {value, 0}]}
-                ],
-                case Results == Expect of
-                    true -> {Count+1, Error};
-                    _ -> {Count+1, true}
-                end
-            end, {0, false}, ?VALUES),
-            Error
-        end).
+should_collate_range_(Db) ->
+    Index = lists:zip(lists:seq(0, length(?VALUES)-1), ?VALUES),
+    lists:map(fun(V) ->
+        {ok, Results} = run_query(Db, [{start_key, V}, {end_key, V}]),
+        Expect = [
+            {meta, [{total, length(?VALUES)}, find_offset(Index, V)]} |
+            find_matching_rows(Index, V)
+        ],
+        ?_assertEquiv(Expect, Results)
+    end, ?VALUES).
+
+find_offset(Index, Value) ->
+    [{Offset, _} | _] = lists:dropwhile(fun({_, V}) ->
+        couch_ejson_compare:less(Value, V) =/= 0
+    end, Index),
+    {offset, Offset}.
+
+find_matching_rows(Index, Value) ->
+    Matches = lists:filter(fun({_, V}) ->
+        couch_ejson_compare:less(Value, V) =:= 0
+    end, Index),
+    lists:map(fun({Id, V}) ->
+        {row, [{id, list_to_binary(integer_to_list(Id))}, {key, V}, {value, 0}]}
+    end, Matches).
 
 should_collate_with_inclusive_end_fwd(Db) ->
     Opts = [{end_key, <<"b">>}, {inclusive_end, true}],


Mime
View raw message