You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ro...@apache.org on 2015/02/03 16:13:50 UTC

[43/50] [abbrv] couchdb-mango git commit: Support Text Index Creation

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/aa4edf42/test/09-text-sort-test.py
----------------------------------------------------------------------
diff --git a/test/09-text-sort-test.py b/test/09-text-sort-test.py
new file mode 100644
index 0000000..d2bd454
--- /dev/null
+++ b/test/09-text-sort-test.py
@@ -0,0 +1,89 @@
+# Licensed 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.
+
+import mango
+import user_docs
+
+class SortTests(mango.UserDocsTextTests):
+
+    def test_number_sort(self):
+        q = {"age": {"$gt": 0}}
+        docs = self.db.find(q, sort=["age:number"])
+        assert len(docs) == 15
+        assert docs[0]["age"] == 22
+
+    def test_string_sort(self):
+        q = {"email": {"$gt": None}}
+        docs = self.db.find(q, sort=["email:string"])
+        assert len(docs) == 15
+        assert docs[0]["email"] == "abbottwatson@talkola.com"
+
+    def test_notype_sort(self):
+        q = {"email": {"$gt": None}}
+        try:
+            self.db.find(q, sort=["email"])
+        except Exception, e:
+            assert e.response.status_code == 400
+        else:
+            raise AssertionError("Should have thrown error for sort")
+
+    def test_array_sort(self):
+        q = {"favorites": {"$exists": True}}
+        docs = self.db.find(q, sort=["favorites.[]:string"])
+        assert len(docs) == 15
+        assert docs[0]["user_id"] == 8
+
+    def test_multi_sort(self):
+        q = {"name": {"$exists": True}}
+        docs = self.db.find(q, sort=["name.last:string", "age:number"])
+        assert len(docs) == 15
+        assert docs[0]["name"] == {"last":"Ewing","first":"Shelly"}
+        assert docs[1]["age"] == 22
+
+    def test_guess_type_sort(self):
+        q = {"$or": [{"age":{"$gt": 0}}, {"email": {"$gt": None}}]}
+        docs = self.db.find(q, sort=["age"])
+        assert len(docs) == 15
+        assert docs[0]["age"] == 22
+
+    def test_guess_dup_type_sort(self):
+        q = {"$and": [{"age":{"$gt": 0}}, {"email": {"$gt": None}},
+            {"age":{"$lte": 100}}]}
+        docs = self.db.find(q, sort=["age"])
+        assert len(docs) == 15
+        assert docs[0]["age"] == 22
+
+    def test_ambiguous_type_sort(self):
+        q = {"$or": [{"age":{"$gt": 0}}, {"email": {"$gt": None}},
+            {"age": "34"}]}
+        try:
+            self.db.find(q, sort=["age"])
+        except Exception, e:
+            assert e.response.status_code == 400
+        else:
+            raise AssertionError("Should have thrown error for sort")
+
+    def test_guess_multi_sort(self):
+        q = {"$or": [{"age":{"$gt": 0}}, {"email": {"$gt": None}},
+            {"name.last": "Harvey"}]}
+        docs = self.db.find(q, sort=["name.last", "age"])
+        assert len(docs) == 15
+        assert docs[0]["name"] == {"last":"Ewing","first":"Shelly"}
+        assert docs[1]["age"] == 22
+
+    def test_guess_mix_sort(self):
+        q = {"$or": [{"age":{"$gt": 0}}, {"email": {"$gt": None}},
+            {"name.last": "Harvey"}]}
+        docs = self.db.find(q, sort=["name.last:string", "age"])
+        assert len(docs) == 15
+        assert docs[0]["name"] == {"last":"Ewing","first":"Shelly"}
+        assert docs[1]["age"] == 22

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/aa4edf42/test/friend_docs.py
----------------------------------------------------------------------
diff --git a/test/friend_docs.py b/test/friend_docs.py
new file mode 100644
index 0000000..8bba58d
--- /dev/null
+++ b/test/friend_docs.py
@@ -0,0 +1,568 @@
+# Licensed 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.
+
+"""
+Generated with http://www.json-generator.com/
+
+With this pattern:
+
+[
+  '{{repeat(15)}}',
+  {
+    _id: '{{index()}}',
+    name: {
+      first: '{{firstName()}}',
+      last: '{{surname()}}'
+    },
+    friends: [
+      '{{repeat(3)}}',
+      {
+        id: '{{index()}}',
+        name: {
+          first: '{{firstName()}}',
+          last: '{{surname()}}'
+        },
+        type: '{{random("personal", "work")}}'
+      }
+    ]
+  }
+]
+"""
+
+import copy
+
+
+def setup(db, index_type="view"):
+    db.recreate()
+    db.save_docs(copy.deepcopy(DOCS))
+    if index_type == "view":
+        add_view_indexes(db)
+    elif index_type == "text":
+        add_text_indexes(db)
+
+
+def add_text_indexes(db):
+    db.create_text_index()
+
+
+DOCS =  [
+    {
+        "_id": "54a43171d37ae5e81bff5ae0",
+        "user_id": 0,
+        "name": {
+            "first": "Ochoa",
+            "last": "Fox"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Sherman",
+                    "last": "Davidson"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Vargas",
+                    "last": "Mendez"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Sheppard",
+                    "last": "Cotton"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171958485dc32917c50",
+        "user_id": 1,
+        "name": {
+            "first": "Sheppard",
+            "last": "Cotton"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Ochoa",
+                    "last": "Fox"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Vargas",
+                    "last": "Mendez"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Kendra",
+                    "last": "Burns"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a431711cf025ba74bea899",
+        "user_id": 2,
+        "name": {
+            "first": "Hunter",
+            "last": "Wells"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Estes",
+                    "last": "Fischer"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Farrell",
+                    "last": "Maddox"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Kendra",
+                    "last": "Burns"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a4317151a70a9881ac28a4",
+        "user_id": 3,
+        "name": {
+            "first": "Millicent",
+            "last": "Guy"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Luella",
+                    "last": "Mendoza"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Melanie",
+                    "last": "Foster"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Hopkins",
+                    "last": "Scott"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171d946b78703a0e076",
+        "user_id": 4,
+        "name": {
+            "first": "Elisabeth",
+            "last": "Brady"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Sofia",
+                    "last": "Workman"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Alisha",
+                    "last": "Reilly"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Ochoa",
+                    "last": "Burch"
+                },
+                "type": "personal"
+            }
+        ]
+    },
+    {
+        "_id": "54a4317118abd7f1992464ee",
+        "user_id": 5,
+        "name": {
+            "first": "Pollard",
+            "last": "French"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Hollie",
+                    "last": "Juarez"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Nelda",
+                    "last": "Newton"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Yang",
+                    "last": "Pace"
+                },
+                "type": "personal"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171f139e63d6579121e",
+        "user_id": 6,
+        "name": {
+            "first": "Acevedo",
+            "last": "Morales"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Payne",
+                    "last": "Berry"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Rene",
+                    "last": "Valenzuela"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Dora",
+                    "last": "Gallegos"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a431719783cef80876dde8",
+        "user_id": 7,
+        "name": {
+            "first": "Cervantes",
+            "last": "Marquez"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Maxwell",
+                    "last": "Norman"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Shields",
+                    "last": "Bass"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Luz",
+                    "last": "Jacobson"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171ecc7540d1f7aceae",
+        "user_id": 8,
+        "name": {
+            "first": "West",
+            "last": "Morrow"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Townsend",
+                    "last": "Dixon"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Callahan",
+                    "last": "Buck"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Rachel",
+                    "last": "Fletcher"
+                },
+                "type": "personal"
+            }
+        ]
+    },
+    {
+        "_id": "54a4317113e831f4af041a0a",
+        "user_id": 9,
+        "name": {
+            "first": "Cotton",
+            "last": "House"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Mckenzie",
+                    "last": "Medina"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Cecilia",
+                    "last": "Miles"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Guerra",
+                    "last": "Cervantes"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171686eb1f48ebcbe01",
+        "user_id": 10,
+        "name": {
+            "first": "Wright",
+            "last": "Rivas"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Campos",
+                    "last": "Freeman"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Christian",
+                    "last": "Ferguson"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Doreen",
+                    "last": "Wilder"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171a4f3d5638c162f4f",
+        "user_id": 11,
+        "name": {
+            "first": "Lorene",
+            "last": "Dorsey"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Gibbs",
+                    "last": "Mccarty"
+                },
+                "type": "personal"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Neal",
+                    "last": "Franklin"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Kristy",
+                    "last": "Head"
+                },
+                "type": "personal"
+            }
+        ]
+    },
+    {
+        "_id": "54a431719faa420a5b4fbeb0",
+        "user_id": 12,
+        "name": {
+            "first": "Juanita",
+            "last": "Cook"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Wilkins",
+                    "last": "Chang"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Haney",
+                    "last": "Rivera"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Lauren",
+                    "last": "Manning"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a43171e65d35f9ee8c53c0",
+        "user_id": 13,
+        "name": {
+            "first": "Levy",
+            "last": "Osborn"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Vinson",
+                    "last": "Vargas"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Felicia",
+                    "last": "Beach"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Nadine",
+                    "last": "Kemp"
+                },
+                "type": "work"
+            }
+        ]
+    },
+    {
+        "_id": "54a4317132f2c81561833259",
+        "user_id": 14,
+        "name": {
+            "first": "Christina",
+            "last": "Raymond"
+        },
+        "friends": [
+            {
+                "id": 0,
+                "name": {
+                    "first": "Herrera",
+                    "last": "Walton"
+                },
+                "type": "work"
+            },
+            {
+                "id": 1,
+                "name": {
+                    "first": "Hahn",
+                    "last": "Rutledge"
+                },
+                "type": "work"
+            },
+            {
+                "id": 2,
+                "name": {
+                    "first": "Stacie",
+                    "last": "Harding"
+                },
+                "type": "work"
+            }
+        ]
+    }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/aa4edf42/test/limit_docs.py
----------------------------------------------------------------------
diff --git a/test/limit_docs.py b/test/limit_docs.py
new file mode 100644
index 0000000..53ab523
--- /dev/null
+++ b/test/limit_docs.py
@@ -0,0 +1,408 @@
+# Licensed 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.
+
+import copy
+
+
+def setup(db, index_type="view"):
+    db.recreate()
+    db.save_docs(copy.deepcopy(DOCS))
+    if index_type == "view":
+        add_view_indexes(db)
+    elif index_type == "text":
+        add_text_indexes(db)
+
+
+def add_text_indexes(db):
+    db.create_text_index()
+
+
+DOCS =  [
+  {
+    "_id": "54af50626de419f5109c962f",
+    "user_id": 0,
+    "age": 10
+  },
+  {
+    "_id": "54af50622071121b25402dc3",
+    "user_id": 1,
+    "age": 11
+
+  },
+  {
+    "_id": "54af50623809e19159a3cdd0",
+    "user_id": 2,
+    "age": 12
+  },
+  {
+    "_id": "54af50629f45a0f49a441d01",
+    "user_id": 3,
+    "age": 13
+
+  },
+  {
+    "_id": "54af50620f1755c22359a362",
+    "user_id": 4,
+    "age": 14
+  },
+  {
+    "_id": "54af5062dd6f6c689ad2ca23",
+    "user_id": 5,
+    "age": 15
+  },
+  {
+    "_id": "54af50623e89b432be1187b8",
+    "user_id": 6,
+    "age": 16
+  },
+  {
+    "_id": "54af5062932a00270a3b5ab0",
+    "user_id": 7,
+    "age": 17
+
+  },
+  {
+    "_id": "54af5062df773d69174e3345",
+    "filtered_array" : [1, 2, 3],
+    "age": 18
+  },
+  {
+    "_id": "54af50629c1153b9e21e346d",
+    "filtered_array" : [1, 2, 3],
+    "age": 19
+  },
+  {
+    "_id": "54af5062dabb7cc4b60e0c95",
+    "user_id": 10,
+    "age": 20
+  },
+  {
+    "_id": "54af5062204996970a4439a2",
+    "user_id": 11,
+    "age": 21
+  },
+  {
+    "_id": "54af50629cea39e8ea52bfac",
+    "user_id": 12,
+    "age": 22
+  },
+  {
+    "_id": "54af50620597c094f75db2a1",
+    "user_id": 13,
+    "age": 23
+  },
+  {
+    "_id": "54af50628d4048de0010723c",
+    "user_id": 14,
+    "age": 24
+  },
+  {
+    "_id": "54af5062f339b6f44f52faf6",
+    "user_id": 15,
+    "age": 25
+  },
+  {
+    "_id": "54af5062a893f17ea4402031",
+    "user_id": 16,
+    "age": 26
+  },
+  {
+    "_id": "54af5062323dbc7077deb60a",
+    "user_id": 17,
+    "age": 27
+  },
+  {
+    "_id": "54af506224db85bd7fcd0243",
+    "filtered_array" : [1, 2, 3],
+    "age": 28
+  },
+  {
+    "_id": "54af506255bb551c9cc251bf",
+    "filtered_array" : [1, 2, 3],
+    "age": 29
+  },
+  {
+    "_id": "54af50625a97394e07d718a1",
+    "filtered_array" : [1, 2, 3],
+    "age": 30
+  },
+  {
+    "_id": "54af506223f51d586b4ef529",
+    "user_id": 21,
+    "age": 31
+  },
+  {
+    "_id": "54af50622740dede7d6117b7",
+    "user_id": 22,
+    "age": 32
+  },
+  {
+    "_id": "54af50624efc87684a52e8fb",
+    "user_id": 23,
+    "age": 33
+  },
+  {
+    "_id": "54af5062f40932760347799c",
+    "user_id": 24,
+    "age": 34
+  },
+  {
+    "_id": "54af5062d9f7361951ac645d",
+    "user_id": 25,
+    "age": 35
+  },
+  {
+    "_id": "54af5062f89aef302b37c3bc",
+    "filtered_array" : [1, 2, 3],
+    "age": 36
+  },
+  {
+    "_id": "54af5062498ec905dcb351f8",
+    "filtered_array" : [1, 2, 3],
+    "age": 37
+  },
+  {
+    "_id": "54af5062b1d2f2c5a85bdd7e",
+    "user_id": 28,
+    "age": 38
+  },
+  {
+    "_id": "54af50625061029c0dd942b5",
+    "filtered_array" : [1, 2, 3],
+    "age": 39
+  },
+  {
+    "_id": "54af50628b0d08a1d23c030a",
+    "user_id": 30,
+    "age": 40
+  },
+  {
+    "_id": "54af506271b6e3119eb31d46",
+    "filtered_array" : [1, 2, 3],
+    "age": 41
+  },
+  {
+    "_id": "54af5062b69f46424dfcf3e5",
+    "user_id": 32,
+    "age": 42
+  },
+  {
+    "_id": "54af5062ed00c7dbe4d1bdcf",
+    "user_id": 33,
+    "age": 43
+  },
+  {
+    "_id": "54af5062fb64e45180c9a90d",
+    "user_id": 34,
+    "age": 44
+  },
+  {
+    "_id": "54af5062241c72b067127b09",
+    "user_id": 35,
+    "age": 45
+  },
+  {
+    "_id": "54af50626a467d8b781a6d06",
+    "user_id": 36,
+    "age": 46
+  },
+  {
+    "_id": "54af50620e992d60af03bf86",
+    "filtered_array" : [1, 2, 3],
+    "age": 47
+  },
+  {
+    "_id": "54af506254f992aa3c51532f",
+    "user_id": 38,
+    "age": 48
+  },
+  {
+    "_id": "54af5062e99b20f301de39b9",
+    "user_id": 39,
+    "age": 49
+  },
+  {
+    "_id": "54af50624fbade6b11505b5d",
+    "user_id": 40,
+    "age": 50
+  },
+  {
+    "_id": "54af506278ad79b21e807ae4",
+    "user_id": 41,
+    "age": 51
+  },
+  {
+    "_id": "54af5062fc7a1dcb33f31d08",
+    "user_id": 42,
+    "age": 52
+  },
+  {
+    "_id": "54af5062ea2c954c650009cf",
+    "user_id": 43,
+    "age": 53
+  },
+  {
+    "_id": "54af506213576c2f09858266",
+    "user_id": 44,
+    "age": 54
+  },
+  {
+    "_id": "54af50624a05ac34c994b1c0",
+    "user_id": 45,
+    "age": 55
+  },
+  {
+    "_id": "54af50625a624983edf2087e",
+    "user_id": 46,
+    "age": 56
+  },
+  {
+    "_id": "54af50623de488c49d064355",
+    "user_id": 47,
+    "age": 57
+  },
+  {
+    "_id": "54af5062628b5df08661a9d5",
+    "user_id": 48,
+    "age": 58
+  },
+  {
+    "_id": "54af50620c706fc23032ae62",
+    "user_id": 49,
+    "age": 59
+  },
+  {
+    "_id": "54af5062509f1e2371fe1da4",
+    "user_id": 50,
+    "age": 60
+  },
+  {
+    "_id": "54af50625e96b22436791653",
+    "user_id": 51,
+    "age": 61
+  },
+  {
+    "_id": "54af5062a9cb71463bb9577f",
+    "user_id": 52,
+    "age": 62
+  },
+  {
+    "_id": "54af50624fea77a4221a4baf",
+    "user_id": 53,
+    "age": 63
+  },
+  {
+    "_id": "54af5062c63df0a147d2417e",
+    "user_id": 54,
+    "age": 64
+  },
+  {
+    "_id": "54af50623c56d78029316c9f",
+    "user_id": 55,
+    "age": 65
+  },
+  {
+    "_id": "54af5062167f6e13aa0dd014",
+    "user_id": 56,
+    "age": 66
+  },
+  {
+    "_id": "54af50621558abe77797d137",
+    "filtered_array" : [1, 2, 3],
+    "age": 67
+  },
+  {
+    "_id": "54af50624d5b36aa7cb5fa77",
+    "user_id": 58,
+    "age": 68
+  },
+  {
+    "_id": "54af50620d79118184ae66bd",
+    "user_id": 59,
+    "age": 69
+  },
+  {
+    "_id": "54af5062d18aafa5c4ca4935",
+    "user_id": 60,
+    "age": 71
+  },
+  {
+    "_id": "54af5062fd22a409649962f4",
+    "filtered_array" : [1, 2, 3],
+    "age": 72
+  },
+  {
+    "_id": "54af5062e31045a1908e89f9",
+    "user_id": 62,
+    "age": 73
+  },
+  {
+    "_id": "54af50624c062fcb4c59398b",
+    "user_id": 63,
+    "age": 74
+  },
+  {
+    "_id": "54af506241ec83430a15957f",
+    "user_id": 64,
+    "age": 75
+  },
+  {
+    "_id": "54af506224d0f888ae411101",
+    "user_id": 65,
+    "age": 76
+  },
+  {
+    "_id": "54af506272a971c6cf3ab6b8",
+    "user_id": 66,
+    "age": 77
+  },
+  {
+    "_id": "54af506221e25b485c95355b",
+    "user_id": 67,
+    "age": 78
+  },
+  {
+    "_id": "54af5062800f7f2ca73e9623",
+    "user_id": 68,
+    "age": 79
+  },
+  {
+    "_id": "54af5062bc962da30740534a",
+    "user_id": 69,
+    "age": 80
+  },
+  {
+    "_id": "54af50625102d6e210fc2efd",
+    "filtered_array" : [1, 2, 3],
+    "age": 81
+  },
+  {
+    "_id": "54af5062e014b9d039f02c5e",
+    "user_id": 71,
+    "age": 82
+  },
+  {
+    "_id": "54af5062fbd5e801dd217515",
+    "user_id": 72,
+    "age": 83
+  },
+  {
+    "_id": "54af50629971992b658fcb88",
+    "user_id": 73,
+    "age": 84
+  },
+  {
+    "_id": "54af5062607d53416c30bafd",
+    "filtered_array" : [1, 2, 3],
+    "age": 85
+  }
+]

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/aa4edf42/test/mango.py
----------------------------------------------------------------------
diff --git a/test/mango.py b/test/mango.py
index 5b022b8..79545e1 100644
--- a/test/mango.py
+++ b/test/mango.py
@@ -17,7 +17,9 @@ import uuid
 
 import requests
 
+import friend_docs
 import user_docs
+import limit_docs
 
 
 def random_db_name():
@@ -96,6 +98,31 @@ class Database(object):
         r.raise_for_status()
         return r.json()["result"] == "created"
 
+    def create_text_index(self, analyzer=None, selector=None, idx_type="text",
+        default_field=None, fields=None, name=None, ddoc=None):
+        body = {
+            "index": {
+            },
+            "type": idx_type,
+            "w": 3,
+        }
+        if name is not None:
+            body["name"] = name
+        if analyzer is not None:
+            body["index"]["default_analyzer"] = analyzer
+        if default_field is not None:
+            body["index"]["default_field"] = default_field
+        if selector is not None:
+            body["selector"] = selector
+        if fields is not None:
+            body["index"]["fields"] = fields
+        if ddoc is not None:
+            body["ddoc"] = ddoc
+        body = json.dumps(body)
+        r = self.sess.post(self.path("_index"), data=body)
+        r.raise_for_status()
+        return r.json()["result"] == "created"
+
     def list_indexes(self):
         r = self.sess.get(self.path("_index"))
         r.raise_for_status()
@@ -107,7 +134,8 @@ class Database(object):
         r.raise_for_status()
 
     def find(self, selector, limit=25, skip=0, sort=None, fields=None,
-                r=1, conflicts=False, explain=False, use_index=None):
+                r=1, conflicts=False, use_index=None, explain=False,
+                bookmark=None, return_raw=False):
         body = {
             "selector": selector,
             "use_index": use_index,
@@ -120,6 +148,8 @@ class Database(object):
             body["sort"] = sort
         if fields is not None:
             body["fields"] = fields
+        if bookmark is not None:
+            body["bookmark"] = bookmark
         body = json.dumps(body)
         if explain:
             path = self.path("_explain")
@@ -127,7 +157,7 @@ class Database(object):
             path = self.path("_find")
         r = self.sess.post(path, data=body)
         r.raise_for_status()
-        if explain:
+        if explain or return_raw:
             return r.json()
         else:
             return r.json()["docs"]
@@ -183,3 +213,10 @@ class FriendDocsTextTests(DbPerClass):
     def setUpClass(klass):
         super(FriendDocsTextTests, klass).setUpClass()
         friend_docs.setup(klass.db, index_type="text")
+
+class LimitDocsTextTests(DbPerClass):
+
+    @classmethod
+    def setUpClass(klass):
+        super(LimitDocsTextTests, klass).setUpClass()
+        limit_docs.setup(klass.db, index_type="text")

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/aa4edf42/test/user_docs.py
----------------------------------------------------------------------
diff --git a/test/user_docs.py b/test/user_docs.py
index 972eafc..05eabbb 100644
--- a/test/user_docs.py
+++ b/test/user_docs.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # Licensed 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
@@ -9,8 +10,7 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations under
 # the License.
-#
-# -*- coding: utf-8 -*-
+
 """
 Generated with http://www.json-generator.com/
 
@@ -351,7 +351,8 @@ DOCS = [
             "Erlang",
             "Python"
         ],
-        "exists_array" : ["should", "exist", "array1"]
+        "exists_array" : ["should", "exist", "array1"],
+        "complex_field_value" : "+-(){}[]^~&&*||\"\\/?:!"
     },
     {
         "_id": "e900001d-bc48-48a6-9b1a-ac9a1f5d1a03",
@@ -456,16 +457,11 @@ DOCS = [
             "C",
             "Ruby",
             "Ruby"
-        ],
-        "utf8-1[]:string" : "string",
-        "utf8-2[]:boolean[]" : True,
-        "utf8-3[]:number" : 9,
-        "utf8-3[]:null" : None
+        ]
     },
     {
         "_id": "c78c529f-0b07-4947-90a6-d6b7ca81da62",
         "user_id": 14,
-        "«ταБЬℓσ»" : "utf-8",
         "name": {
             "first": "Faith",
             "last": "Hess"