You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ko...@apache.org on 2010/04/23 23:35:40 UTC

svn commit: r937528 - /couchdb/trunk/src/couchdb/couch_view.erl

Author: kocolosk
Date: Fri Apr 23 21:35:40 2010
New Revision: 937528

URL: http://svn.apache.org/viewvc?rev=937528&view=rev
Log:
faster default view collation. Closes COUCHDB-746

Modified:
    couchdb/trunk/src/couchdb/couch_view.erl

Modified: couchdb/trunk/src/couchdb/couch_view.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_view.erl?rev=937528&r1=937527&r2=937528&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_view.erl (original)
+++ couchdb/trunk/src/couchdb/couch_view.erl Fri Apr 23 21:35:40 2010
@@ -369,81 +369,67 @@ nuke_dir(Dir) ->
 
 % keys come back in the language of btree - tuples.
 less_json_ids({JsonA, IdA}, {JsonB, IdB}) ->
-    case JsonA == JsonB of
-    false ->
-        less_json(JsonA, JsonB);
-    true ->
-        IdA < IdB
+    case less_json0(JsonA, JsonB) of
+    0 ->
+        IdA < IdB;
+    Result ->
+        Result < 0
     end.
-        
 
-less_json(A, B) ->
-    TypeA = type_sort(A),
-    TypeB = type_sort(B),
-    if TypeA == TypeB ->
-	    less_same_type(A, B);
-       true ->
-	    TypeA < TypeB
-    end.
+less_json(A,B) ->
+    less_json0(A,B) < 0.
 
-type_sort(V) when is_atom(V) -> 0;
-type_sort(V) when is_integer(V) -> 1;
-type_sort(V) when is_float(V) -> 1;
-type_sort(V) when is_binary(V) -> 2;
-type_sort(V) when is_list(V) -> 3;
-type_sort({V}) when is_list(V) -> 4;
-type_sort(V) when is_tuple(V) -> 5.
+less_json0(A,A)                                 -> 0;
 
+less_json0(A,B) when is_atom(A), is_atom(B)     -> atom_sort(A) - atom_sort(B);
+less_json0(A,_) when is_atom(A)                 -> -1;
+less_json0(_,B) when is_atom(B)                 -> 1;
+
+less_json0(A,B) when is_number(A), is_number(B) -> A - B;
+less_json0(A,_) when is_number(A)               -> -1;
+less_json0(_,B) when is_number(B)               -> 1;
+
+less_json0(A,B) when is_binary(A), is_binary(B) -> couch_util:collate(A,B);
+less_json0(A,_) when is_binary(A)               -> -1;
+less_json0(_,B) when is_binary(B)               -> 1;
+
+less_json0(A,B) when is_list(A), is_list(B)     -> less_list(A,B);
+less_json0(A,_) when is_list(A)                 -> -1;
+less_json0(_,B) when is_list(B)                 -> 1;
+
+less_json0({A},{B}) when is_list(A), is_list(B) -> less_props(A,B);
+less_json0({A},_) when is_list(A)               -> -1;
+less_json0(_,{B}) when is_list(B)               -> 1.
 
 atom_sort(null) -> 1;
 atom_sort(false) -> 2;
 atom_sort(true) -> 3.
 
-
-less_same_type(A,B) when is_atom(A) ->
-  atom_sort(A) < atom_sort(B);
-less_same_type(A,B) when is_binary(A) ->
-  couch_util:collate(A, B) < 0;
-less_same_type({AProps}, {BProps}) ->
-  less_props(AProps, BProps);
-less_same_type(A, B) when is_list(A) ->
-  less_list(A, B);
-less_same_type(A, B) ->
-    A < B.
-
 less_props([], [_|_]) ->
-    true;
+    -1;
 less_props(_, []) ->
-    false;
+    1;
 less_props([{AKey, AValue}|RestA], [{BKey, BValue}|RestB]) ->
     case couch_util:collate(AKey, BKey) of
-    -1 -> true;
-    1 -> false;
     0 ->
-        case less_json(AValue, BValue) of
-        true -> true;
-        false ->
-            case less_json(BValue, AValue) of
-            true -> false;
-            false ->
-                less_props(RestA, RestB)
-            end
-        end
+        case less_json0(AValue, BValue) of
+        0 ->
+            less_props(RestA, RestB);
+        Result ->
+            Result
+        end;
+    Result ->
+        Result
     end.
 
 less_list([], [_|_]) ->
-    true;
+    -1;
 less_list(_, []) ->
-    false;
+    1;
 less_list([A|RestA], [B|RestB]) ->
-    case less_json(A,B) of
-    true -> true;
-    false ->
-        case less_json(B,A) of
-        true -> false;
-        false ->
-            less_list(RestA, RestB)
-        end
+    case less_json0(A,B) of
+    0 ->
+        less_list(RestA, RestB);
+    Result ->
+        Result
     end.
-
-