You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by to...@apache.org on 2015/02/24 07:31:18 UTC

couchdb-mango git commit: Handle unsatisfiable [empty] ranges

Repository: couchdb-mango
Updated Branches:
  refs/heads/tonysun83-start-end-key-issue [created] 3611aadb2


Handle unsatisfiable [empty] ranges

Queries sometimes contain unsatisfiable ranges (i.e x < 0 and x > 0).
This is indicated by the [empty] value. In this case, we should not
perform a search and simply return 0 documents.

Fixes COUCHDB-2614


Project: http://git-wip-us.apache.org/repos/asf/couchdb-mango/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mango/commit/3611aadb
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mango/tree/3611aadb
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mango/diff/3611aadb

Branch: refs/heads/tonysun83-start-end-key-issue
Commit: 3611aadb25c425a7dc51270498d9a90e1415d90f
Parents: 931d227
Author: Tony Sun <to...@cloudant.com>
Authored: Mon Feb 23 22:23:45 2015 -0800
Committer: Tony Sun <to...@cloudant.com>
Committed: Mon Feb 23 22:23:45 2015 -0800

----------------------------------------------------------------------
 src/mango_cursor_view.erl | 55 +++++++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/3611aadb/src/mango_cursor_view.erl
----------------------------------------------------------------------
diff --git a/src/mango_cursor_view.erl b/src/mango_cursor_view.erl
index ddf1e1a..cb35968 100644
--- a/src/mango_cursor_view.erl
+++ b/src/mango_cursor_view.erl
@@ -54,10 +54,15 @@ explain(Cursor) ->
         index = Idx,
         ranges = Ranges
     } = Cursor,
-    [{range, {[
-        {start_key, mango_idx:start_key(Idx, Ranges)},
-        {end_key, mango_idx:end_key(Idx, Ranges)}
-    ]}}].
+    case Ranges of
+        [empty] ->
+            [{range, empty}];
+        _ ->
+            [{range, {[
+            {start_key, mango_idx:start_key(Idx, Ranges)},
+            {end_key, mango_idx:end_key(Idx, Ranges)}
+        ]}}]
+    end.
 
 
 execute(#cursor{db = Db, index = Idx} = Cursor0, UserFun, UserAcc) ->
@@ -65,25 +70,31 @@ execute(#cursor{db = Db, index = Idx} = Cursor0, UserFun, UserAcc) ->
         user_fun = UserFun,
         user_acc = UserAcc
     },
-    BaseArgs = #mrargs{
-        view_type = map,
-        reduce = false,
-        start_key = mango_idx:start_key(Idx, Cursor#cursor.ranges),
-        end_key = mango_idx:end_key(Idx, Cursor#cursor.ranges),
-        include_docs = true
-    },
-    Args = apply_opts(Cursor#cursor.opts, BaseArgs),
-    CB = fun ?MODULE:handle_message/2,
-    {ok, LastCursor} = case mango_idx:def(Idx) of
-        all_docs ->
-            fabric:all_docs(Db, CB, Cursor, Args);
+    case Cursor#cursor.ranges of
+        [empty] ->
+            % empty indicates unsatisfiable ranges, so don't perform search
+            {ok, UserAcc};
         _ ->
-            % Normal view
-            DDoc = ddocid(Idx),
-            Name = mango_idx:name(Idx),
-            fabric:query_view(Db, DDoc, Name, CB, Cursor, Args)
-    end,
-    {ok, LastCursor#cursor.user_acc}.
+            BaseArgs = #mrargs{
+                view_type = map,
+                reduce = false,
+                start_key = mango_idx:start_key(Idx, Cursor#cursor.ranges),
+                end_key = mango_idx:end_key(Idx, Cursor#cursor.ranges),
+                include_docs = true
+            },
+            Args = apply_opts(Cursor#cursor.opts, BaseArgs),
+            CB = fun ?MODULE:handle_message/2,
+            {ok, LastCursor} = case mango_idx:def(Idx) of
+                all_docs ->
+                    fabric:all_docs(Db, CB, Cursor, Args);
+                _ ->
+                    % Normal view
+                    DDoc = ddocid(Idx),
+                    Name = mango_idx:name(Idx),
+                    fabric:query_view(Db, DDoc, Name, CB, Cursor, Args)
+            end,
+            {ok, LastCursor#cursor.user_acc}
+    end.
 
 
 % Any of these indexes may be a composite index. For each